-
Notifications
You must be signed in to change notification settings - Fork 61
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1343 from Yawn-Wider/upstream-update
Voreupdate [MDB IGNORE] [IDB IGNORE]
- Loading branch information
Showing
451 changed files
with
38,418 additions
and
6,659 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,15 +1,78 @@ | ||
//// COOLDOWN SYSTEMS | ||
/* | ||
* We have 2 cooldown systems: timer cooldowns (divided between stoppable and regular) and world.time cooldowns. | ||
* | ||
* When to use each? | ||
* | ||
* * Adding a commonly-checked cooldown, like on a subsystem to check for processing | ||
* * * Use the world.time ones, as they are cheaper. | ||
* | ||
* * Adding a rarely-used one for special situations, such as giving an uncommon item a cooldown on a target. | ||
* * * Timer cooldown, as adding a new variable on each mob to track the cooldown of said uncommon item is going too far. | ||
* | ||
* * Triggering events at the end of a cooldown. | ||
* * * Timer cooldown, registering to its signal. | ||
* | ||
* * Being able to check how long left for the cooldown to end. | ||
* * * Either world.time or stoppable timer cooldowns, depending on the other factors. Regular timer cooldowns do not support this. | ||
* | ||
* * Being able to stop the timer before it ends. | ||
* * * Either world.time or stoppable timer cooldowns, depending on the other factors. Regular timer cooldowns do not support this. | ||
*/ | ||
|
||
|
||
/* | ||
* Cooldown system based on an datum-level associative lazylist using timers. | ||
*/ | ||
|
||
// admin verb cooldowns | ||
#define COOLDOWN_INTERNET_SOUND "internet_sound" | ||
|
||
//TIMER COOLDOWN MACROS | ||
|
||
#define COMSIG_CD_STOP(cd_index) "cooldown_[cd_index]" | ||
#define COMSIG_CD_RESET(cd_index) "cd_reset_[cd_index]" | ||
|
||
#define TIMER_COOLDOWN_START(cd_source, cd_index, cd_time) LAZYSET(cd_source.cooldowns, cd_index, addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(end_cooldown), cd_source, cd_index), cd_time)) | ||
|
||
/// Checks if a timer based cooldown is NOT finished. | ||
#define TIMER_COOLDOWN_RUNNING(cd_source, cd_index) LAZYACCESS(cd_source.cooldowns, cd_index) | ||
|
||
/// Checks if a timer based cooldown is finished. | ||
#define TIMER_COOLDOWN_FINISHED(cd_source, cd_index) (!TIMER_COOLDOWN_RUNNING(cd_source, cd_index)) | ||
|
||
#define TIMER_COOLDOWN_END(cd_source, cd_index) LAZYREMOVE(cd_source.cooldowns, cd_index) | ||
|
||
/* | ||
* Stoppable timer cooldowns. | ||
* Use indexes the same as the regular tiemr cooldowns. | ||
* They make use of the TIMER_COOLDOWN_RUNNING() and TIMER_COOLDOWN_END() macros the same, just not the TIMER_COOLDOWN_START() one. | ||
* A bit more expensive than the regular timers, but can be reset before they end and the time left can be checked. | ||
*/ | ||
|
||
#define S_TIMER_COOLDOWN_START(cd_source, cd_index, cd_time) LAZYSET(cd_source.cooldowns, cd_index, addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(end_cooldown), cd_source, cd_index), cd_time, TIMER_STOPPABLE)) | ||
|
||
#define S_TIMER_COOLDOWN_RESET(cd_source, cd_index) reset_cooldown(cd_source, cd_index) | ||
|
||
#define S_TIMER_COOLDOWN_TIMELEFT(cd_source, cd_index) (timeleft(TIMER_COOLDOWN_RUNNING(cd_source, cd_index))) | ||
|
||
|
||
/* | ||
* Cooldown system based on storing world.time on a variable, plus the cooldown time. | ||
* Better performance over timer cooldowns, lower control. Same functionality. | ||
*/ | ||
|
||
#define COOLDOWN_DECLARE(cd_index) var/##cd_index = 0 | ||
|
||
#define STATIC_COOLDOWN_DECLARE(cd_index) var/static/##cd_index = 0 | ||
|
||
#define COOLDOWN_START(cd_source, cd_index, cd_time) (cd_source.cd_index = world.time + (cd_time)) | ||
|
||
//Returns true if the cooldown has run its course, false otherwise | ||
#define COOLDOWN_FINISHED(cd_source, cd_index) (cd_source.cd_index < world.time) | ||
|
||
#define COOLDOWN_RESET(cd_source, cd_index) cd_source.cd_index = 0 | ||
|
||
#define COOLDOWN_TIMELEFT(cd_source, cd_index) (max(0, cd_source.cd_index - world.time)) | ||
#define COOLDOWN_STARTED(cd_source, cd_index) (cd_source.cd_index != 0) | ||
|
||
#define COOLDOWN_TIMELEFT(cd_source, cd_index) (max(0, cd_source.cd_index - world.time)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
//Runs the command in the system's shell, returns a list of (error code, stdout, stderr) | ||
|
||
#define SHELLEO_NAME "data/shelleo." | ||
#define SHELLEO_ERR ".err" | ||
#define SHELLEO_OUT ".out" | ||
/world/proc/shelleo(command) | ||
var/static/list/shelleo_ids = list() | ||
var/stdout = "" | ||
var/stderr = "" | ||
var/errorcode = 1 | ||
var/shelleo_id | ||
var/out_file = "" | ||
var/err_file = "" | ||
var/static/list/interpreters = list("[MS_WINDOWS]" = "cmd /c", "[UNIX]" = "sh -c") | ||
var/interpreter = interpreters["[world.system_type]"] | ||
if(interpreter) | ||
for(var/seo_id in shelleo_ids) | ||
if(!shelleo_ids[seo_id]) | ||
shelleo_ids[seo_id] = TRUE | ||
shelleo_id = "[seo_id]" | ||
break | ||
if(!shelleo_id) | ||
shelleo_id = "[shelleo_ids.len + 1]" | ||
shelleo_ids += shelleo_id | ||
shelleo_ids[shelleo_id] = TRUE | ||
out_file = "[SHELLEO_NAME][shelleo_id][SHELLEO_OUT]" | ||
err_file = "[SHELLEO_NAME][shelleo_id][SHELLEO_ERR]" | ||
if(world.system_type == UNIX) | ||
errorcode = shell("[interpreter] \"[replacetext(command, "\"", "\\\"")]\" > [out_file] 2> [err_file]") | ||
else | ||
errorcode = shell("[interpreter] \"[command]\" > [out_file] 2> [err_file]") | ||
if(fexists(out_file)) | ||
stdout = file2text(out_file) | ||
fdel(out_file) | ||
if(fexists(err_file)) | ||
stderr = file2text(err_file) | ||
fdel(err_file) | ||
shelleo_ids[shelleo_id] = FALSE | ||
else | ||
CRASH("Operating System: [world.system_type] not supported") // If you encounter this error, you are encouraged to update this proc with support for the new operating system | ||
. = list(errorcode, stdout, stderr) | ||
#undef SHELLEO_NAME | ||
#undef SHELLEO_ERR | ||
#undef SHELLEO_OUT | ||
|
||
/proc/shell_url_scrub(url) | ||
var/static/regex/bad_chars_regex = regex("\[^#%&./:=?\\w]*", "g") | ||
var/scrubbed_url = "" | ||
var/bad_match = "" | ||
var/last_good = 1 | ||
var/bad_chars = 1 | ||
do | ||
bad_chars = bad_chars_regex.Find(url) | ||
scrubbed_url += copytext(url, last_good, bad_chars) | ||
if(bad_chars) | ||
bad_match = url_encode(bad_chars_regex.match) | ||
scrubbed_url += bad_match | ||
last_good = bad_chars + length(bad_chars_regex.match) | ||
while(bad_chars) | ||
. = scrubbed_url |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.