Merge remote-tracking branch 'citadel/master' into small_guncode_refactor

This commit is contained in:
kevinz000
2020-02-04 03:47:01 -07:00
812 changed files with 46627 additions and 7896 deletions
+1
View File
@@ -195,6 +195,7 @@ Temporary Items
#Visual studio stuff
*.vscode/*
!/.vscode/extensions.json
tools/MapAtmosFixer/MapAtmosFixer/obj/*
tools/MapAtmosFixer/MapAtmosFixer/bin/*
+7
View File
@@ -0,0 +1,7 @@
{
"recommendations": [
"gbasood.byond-dm-language-support",
"platymuus.dm-langclient",
"EditorConfig.EditorConfig"
]
}
+1 -1
View File
@@ -1,4 +1,4 @@
FROM tgstation/byond:513.1490 as base
FROM tgstation/byond:513.1503 as base
FROM base as build_base
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+20 -20
View File
@@ -7850,7 +7850,7 @@
/turf/open/floor/wood,
/area/lawoffice)
"asa" = (
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_x = 32
},
/obj/effect/turf_decal/tile/red{
@@ -13716,7 +13716,7 @@
/turf/open/floor/plating,
/area/chapel/main)
"aHu" = (
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_x = 32
},
/turf/open/floor/plasteel/white/corner{
@@ -16757,7 +16757,7 @@
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aPE" = (
/obj/machinery/status_display,
/obj/machinery/status_display/evac,
/turf/closed/wall,
/area/crew_quarters/locker)
"aPF" = (
@@ -16848,7 +16848,7 @@
/obj/structure/cable{
icon_state = "0-8"
},
/obj/machinery/status_display,
/obj/machinery/status_display/evac,
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/door/poddoor/preopen{
id = "bridge blast";
@@ -16880,7 +16880,7 @@
/obj/structure/cable{
icon_state = "0-4"
},
/obj/machinery/status_display,
/obj/machinery/status_display/evac,
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/door/poddoor/preopen{
id = "bridge blast";
@@ -18156,7 +18156,7 @@
/area/hallway/secondary/exit)
"aTl" = (
/obj/machinery/vending/cola/random,
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
layer = 4;
pixel_y = 32
},
@@ -18197,7 +18197,7 @@
/area/hallway/secondary/exit)
"aTr" = (
/obj/machinery/door/firedoor,
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_x = 32
},
/turf/open/floor/plasteel,
@@ -21371,7 +21371,7 @@
/turf/open/floor/plasteel,
/area/quartermaster/warehouse)
"baZ" = (
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
layer = 4;
pixel_y = 32
},
@@ -21528,7 +21528,7 @@
/turf/open/floor/wood,
/area/crew_quarters/heads/captain)
"bbv" = (
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/structure/cable{
@@ -22164,7 +22164,7 @@
dir = 4
},
/obj/structure/disposalpipe/segment,
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_x = -32
},
/obj/effect/turf_decal/tile/blue{
@@ -23065,7 +23065,7 @@
/turf/closed/wall/r_wall,
/area/ai_monitored/turret_protected/ai_upload)
"bfw" = (
/obj/machinery/status_display,
/obj/machinery/status_display/evac,
/turf/closed/wall/r_wall,
/area/ai_monitored/turret_protected/ai_upload)
"bfx" = (
@@ -25063,7 +25063,7 @@
/obj/machinery/light{
dir = 4
},
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_x = 32
},
/obj/machinery/aug_manipulator,
@@ -27326,7 +27326,7 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"bpw" = (
/obj/machinery/status_display,
/obj/machinery/status_display/evac,
/turf/closed/wall,
/area/medical/medbay/central)
"bpx" = (
@@ -28634,7 +28634,7 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"bsz" = (
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_x = -32
},
/turf/open/floor/plasteel/white/side{
@@ -32596,7 +32596,7 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = -32
},
/turf/open/floor/plasteel,
@@ -35471,7 +35471,7 @@
/area/medical/sleeper)
"bIe" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_x = -32
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -42591,7 +42591,7 @@
/turf/open/floor/plating,
/area/tcommsat/computer)
"bZr" = (
/obj/machinery/status_display,
/obj/machinery/status_display/evac,
/turf/closed/wall,
/area/tcommsat/computer)
"bZs" = (
@@ -49648,7 +49648,7 @@
/area/ai_monitored/turret_protected/aisat_interior)
"cuc" = (
/obj/structure/rack,
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = -32
},
/obj/item/storage/box/donkpockets,
@@ -50228,7 +50228,7 @@
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat_interior)
"cvf" = (
/obj/machinery/status_display,
/obj/machinery/status_display/evac,
/turf/closed/wall/r_wall,
/area/ai_monitored/turret_protected/ai)
"cvg" = (
@@ -50753,7 +50753,7 @@
/obj/machinery/light{
dir = 8
},
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_x = -32
},
/turf/open/floor/circuit,
File diff suppressed because it is too large Load Diff
+43 -43
View File
@@ -421,7 +421,7 @@
},
/area/security/prison)
"abr" = (
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/effect/turf_decal/tile/blue{
@@ -2472,7 +2472,7 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/hos)
"afj" = (
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_x = -32;
pixel_y = 32
},
@@ -2501,7 +2501,7 @@
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/hos)
"afn" = (
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_x = 32;
pixel_y = 32
},
@@ -15058,7 +15058,7 @@
/obj/machinery/light{
dir = 1
},
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/effect/turf_decal/tile/red{
@@ -17819,7 +17819,7 @@
/obj/structure/chair{
name = "Judge"
},
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/machinery/light{
@@ -19088,7 +19088,7 @@
"aLO" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible,
/obj/machinery/portable_atmospherics/scrubber,
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 30
},
/obj/effect/turf_decal/delivery,
@@ -21087,7 +21087,7 @@
/obj/structure/cable/yellow{
icon_state = "0-4"
},
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/machinery/camera{
@@ -21381,7 +21381,7 @@
/obj/machinery/light{
dir = 4
},
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_x = 32
},
/obj/machinery/flasher{
@@ -23713,7 +23713,7 @@
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/ai)
"aVm" = (
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
@@ -23740,7 +23740,7 @@
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/ai)
"aVq" = (
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/machinery/atmospherics/components/unary/vent_pump/on,
@@ -23803,7 +23803,7 @@
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 4
},
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/effect/turf_decal/stripes/line{
@@ -24135,7 +24135,7 @@
/obj/machinery/light{
dir = 1
},
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/effect/turf_decal/tile/neutral{
@@ -24359,7 +24359,7 @@
pixel_x = -25;
pixel_y = 25
},
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/structure/extinguisher_cabinet{
@@ -27493,7 +27493,7 @@
name = "Station Intercom (General)";
pixel_x = -29
},
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_x = -32
},
/obj/effect/turf_decal/tile/neutral{
@@ -28332,7 +28332,7 @@
/turf/open/floor/carpet,
/area/crew_quarters/heads/captain/private)
"bdI" = (
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -30143,7 +30143,7 @@
/turf/open/floor/plasteel/dark,
/area/bridge)
"bhk" = (
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/item/folder/yellow{
@@ -30795,7 +30795,7 @@
/obj/structure/chair/office/dark{
dir = 4
},
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = -32
},
/turf/open/floor/plasteel/dark,
@@ -32463,7 +32463,7 @@
/area/ai_monitored/turret_protected/aisat/foyer)
"blC" = (
/obj/machinery/teleport/station,
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/effect/turf_decal/tile/neutral{
@@ -32572,7 +32572,7 @@
/area/ai_monitored/storage/satellite)
"blK" = (
/obj/machinery/recharge_station,
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/structure/cable/yellow{
@@ -33091,7 +33091,7 @@
/area/crew_quarters/heads/captain/private)
"bmJ" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_x = -32
},
/obj/structure/disposalpipe/segment,
@@ -34052,7 +34052,7 @@
/obj/structure/displaycase/captain{
pixel_y = 5
},
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/turf/open/floor/wood,
@@ -35067,7 +35067,7 @@
/turf/open/floor/wood,
/area/crew_quarters/heads/hop)
"bqF" = (
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/effect/turf_decal/tile/blue{
@@ -35947,7 +35947,7 @@
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat_interior)
"bse" = (
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/machinery/porta_turret/ai,
@@ -36179,7 +36179,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = -32
},
/obj/effect/turf_decal/tile/neutral{
@@ -36283,7 +36283,7 @@
/turf/open/floor/carpet,
/area/crew_quarters/heads/hop)
"bsP" = (
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/structure/bed/dogbed/ian,
@@ -37933,7 +37933,7 @@
/area/bridge)
"bwu" = (
/obj/machinery/holopad,
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/machinery/light{
@@ -39063,7 +39063,7 @@
},
/area/engine/atmos)
"byS" = (
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/machinery/light{
@@ -39533,7 +39533,7 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/command)
"bzN" = (
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/effect/turf_decal/bot,
@@ -40057,7 +40057,7 @@
"bAW" = (
/obj/structure/table/wood,
/obj/item/folder/blue,
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 31
},
/obj/item/folder/blue,
@@ -41121,7 +41121,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
@@ -41265,7 +41265,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
@@ -44514,7 +44514,7 @@
/obj/machinery/gateway{
dir = 1
},
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/effect/turf_decal/bot_white,
@@ -45284,7 +45284,7 @@
/area/maintenance/central)
"bLH" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_x = -32
},
/obj/machinery/camera{
@@ -49142,7 +49142,7 @@
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 1
},
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/effect/turf_decal/tile/neutral{
@@ -49213,7 +49213,7 @@
/obj/machinery/light{
dir = 1
},
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/effect/turf_decal/tile/neutral{
@@ -52537,7 +52537,7 @@
pixel_y = 4
},
/obj/item/pen,
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/machinery/light/small{
@@ -59310,7 +59310,7 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"cnC" = (
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/structure/table/glass,
@@ -62450,7 +62450,7 @@
},
/area/crew_quarters/heads/hor)
"ctc" = (
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/effect/landmark/xmastree/rdrod,
@@ -65398,7 +65398,7 @@
"cyO" = (
/obj/machinery/disposal/bin,
/obj/structure/disposalpipe/trunk,
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/turf/open/floor/plasteel/white/side,
@@ -73012,7 +73012,7 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
"cMU" = (
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
layer = 4
},
/turf/closed/wall,
@@ -76209,7 +76209,7 @@
/obj/machinery/light{
dir = 1
},
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 30
},
/obj/machinery/photocopier{
@@ -78350,7 +78350,7 @@
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
"deD" = (
/obj/machinery/status_display,
/obj/machinery/status_display/evac,
/turf/closed/wall/r_wall,
/area/engine/supermatter)
"deI" = (
@@ -79825,7 +79825,7 @@
/area/maintenance/aft)
"diD" = (
/obj/machinery/vending/cigarette,
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/structure/sign/poster/official/random{
+10 -10
View File
@@ -3086,7 +3086,7 @@
/area/security/main)
"ajo" = (
/obj/machinery/vending/coffee,
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/effect/turf_decal/tile/red{
@@ -3427,7 +3427,7 @@
"akc" = (
/obj/structure/table/wood,
/obj/machinery/recharger,
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/machinery/light{
@@ -6882,7 +6882,7 @@
/turf/open/floor/plasteel/dark,
/area/bridge)
"arK" = (
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/item/folder/yellow{
@@ -9248,7 +9248,7 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/effect/turf_decal/tile/blue{
@@ -11380,7 +11380,7 @@
/turf/open/floor/wood,
/area/crew_quarters/heads/hop)
"aBF" = (
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/structure/bed/dogbed/ian,
@@ -14151,7 +14151,7 @@
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 1
},
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/obj/effect/turf_decal/tile/neutral{
@@ -17493,7 +17493,7 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
"aQt" = (
/obj/machinery/status_display,
/obj/machinery/status_display/evac,
/turf/closed/wall,
/area/hallway/secondary/exit/departure_lounge)
"aQu" = (
@@ -24292,7 +24292,7 @@
/obj/structure/cable{
icon_state = "0-2"
},
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 30
},
/turf/open/floor/plasteel/dark,
@@ -36929,7 +36929,7 @@
/area/medical/surgery)
"bHc" = (
/obj/machinery/computer/med_data,
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_y = 32
},
/turf/open/floor/plasteel/freezer,
@@ -48691,7 +48691,7 @@
/turf/open/space,
/area/space/nearstation)
"cmu" = (
/obj/machinery/status_display{
/obj/machinery/status_display/evac{
pixel_x = -32
},
/obj/structure/table,
+3 -11
View File
@@ -924,25 +924,16 @@
/turf/open/floor/plasteel/dark,
/area/shuttle/syndicate/medical)
"ce" = (
/obj/item/sbeacondrop/bomb{
pixel_y = 5
},
/obj/item/sbeacondrop/bomb,
/obj/structure/table/reinforced,
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/effect/landmark/start/nuclear_equipment,
/obj/effect/landmark/start/nuclear_equipment,
/turf/open/floor/plasteel/dark,
/area/shuttle/syndicate/armory)
"cf" = (
/obj/item/grenade/syndieminibomb{
pixel_x = 4;
pixel_y = 2
},
/obj/item/grenade/syndieminibomb{
pixel_x = -1
},
/obj/structure/table/reinforced,
/obj/structure/window/reinforced{
dir = 4
@@ -956,6 +947,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/effect/landmark/start/nuclear_equipment/minibomb,
/turf/open/floor/plasteel/dark,
/area/shuttle/syndicate/armory)
"cg" = (
+1
View File
@@ -73,6 +73,7 @@
#define ADMIN_PUNISHMENT_SUPPLYPOD "Supply Pod"
#define ADMIN_PUNISHMENT_MAZING "Puzzle"
#define ADMIN_PUNISHMENT_PIE "Cream Pie"
#define ADMIN_PUNISHMENT_CUSTOM_PIE "Custom Cream Pie"
#define AHELP_ACTIVE 1
#define AHELP_CLOSED 2
+2 -2
View File
@@ -149,9 +149,9 @@
//OPEN TURF ATMOS
#define OPENTURF_DEFAULT_ATMOS "o2=22;n2=82;TEMP=293.15" //the default air mix that open turfs spawn
#define TCOMMS_ATMOS "n2=100;TEMP=80" //-193,15°C telecommunications. also used for xenobiology slime killrooms
#define TCOMMS_ATMOS "n2=100;TEMP=80" //-193,15degC telecommunications. also used for xenobiology slime killrooms
#define AIRLESS_ATMOS "TEMP=2.7" //space
#define FROZEN_ATMOS "o2=22;n2=82;TEMP=180" //-93.15°C snow and ice turfs
#define FROZEN_ATMOS "o2=22;n2=82;TEMP=180" //-93.15degC snow and ice turfs
#define BURNMIX_ATMOS "o2=2500;plasma=5000;TEMP=370" //used in the holodeck burn test program
//ATMOSPHERICS DEPARTMENT GAS TANK TURFS
+1 -2
View File
@@ -198,6 +198,7 @@
#define COMSIG_LIVING_EXTINGUISHED "living_extinguished" //from base of mob/living/ExtinguishMob() (/mob/living)
#define COMSIG_LIVING_ELECTROCUTE_ACT "living_electrocute_act" //from base of mob/living/electrocute_act(): (shock_damage)
#define COMSIG_LIVING_MINOR_SHOCK "living_minor_shock" //sent by stuff like stunbatons and tasers: ()
#define COMSIG_MOB_CLIENT_LOGIN "comsig_mob_client_login" //sent when a mob/login() finishes: (client)
#define COMSIG_LIVING_GUN_PROCESS_FIRE "living_gun_process_fire" //from base of /obj/item/gun/proc/process_fire(): (atom/target, params, zone_override)
// /mob/living/carbon signals
@@ -275,8 +276,6 @@
#define COMSIG_TURF_MAKE_DRY "make_turf_try" //(max_strength, immediate, duration_decrease = INFINITY): Returns bool.
#define COMSIG_COMPONENT_CLEAN_ACT "clean_act" //called on an object to clean it of cleanables. Usualy with soap: (num/strength)
//Blood color
#define COMSIG_BLOOD_COLOR "blood_DNA_to_color" //RGB blood stuff
//Food
#define COMSIG_FOOD_EATEN "food_eaten" //from base of obj/item/reagent_containers/food/snacks/attack(): (mob/living/eater, mob/feeder)
+13 -12
View File
@@ -24,18 +24,19 @@
#define LOG_SAY (1 << 1)
#define LOG_WHISPER (1 << 2)
#define LOG_EMOTE (1 << 3)
#define LOG_DSAY (1 << 4)
#define LOG_PDA (1 << 5)
#define LOG_CHAT (1 << 6)
#define LOG_COMMENT (1 << 7)
#define LOG_TELECOMMS (1 << 8)
#define LOG_OOC (1 << 9)
#define LOG_ADMIN (1 << 10)
#define LOG_OWNERSHIP (1 << 11)
#define LOG_GAME (1 << 12)
#define LOG_ADMIN_PRIVATE (1 << 13)
#define LOG_ASAY (1 << 14)
#define LOG_VIRUS (1 << 15)
#define LOG_SUBTLER (1 << 4)
#define LOG_DSAY (1 << 5)
#define LOG_PDA (1 << 6)
#define LOG_CHAT (1 << 7)
#define LOG_COMMENT (1 << 8)
#define LOG_TELECOMMS (1 << 9)
#define LOG_OOC (1 << 10)
#define LOG_ADMIN (1 << 11)
#define LOG_OWNERSHIP (1 << 12)
#define LOG_GAME (1 << 13)
#define LOG_ADMIN_PRIVATE (1 << 14)
#define LOG_ASAY (1 << 15)
#define LOG_VIRUS (1 << 16)
//Individual logging panel pages
#define INDIVIDUAL_ATTACK_LOG (LOG_ATTACK)
+11 -1
View File
@@ -96,12 +96,22 @@
#define NUKESTATE_CORE_EXPOSED 1
#define NUKESTATE_CORE_REMOVED 0
#define NUKEUI_AWAIT_DISK 0
#define NUKEUI_AWAIT_CODE 1
#define NUKEUI_AWAIT_TIMER 2
#define NUKEUI_AWAIT_ARM 3
#define NUKEUI_TIMING 4
#define NUKEUI_EXPLODED 5
#define NUKE_OFF_LOCKED 0
#define NUKE_OFF_UNLOCKED 1
#define NUKE_ON_TIMING 2
#define NUKE_ON_EXPLODING 3
#define MACHINE_NOT_ELECTRIFIED 0
#define MACHINE_ELECTRIFIED_PERMANENT -1
#define MACHINE_DEFAULT_ELECTRIFY_TIME 30
//these flags are used to tell the DNA modifier if a plant gene cannot be extracted or modified.
#define PLANT_GENE_REMOVABLE (1<<0)
#define PLANT_GENE_EXTRACTABLE (1<<1)
#define PLANT_GENE_EXTRACTABLE (1<<1)
+5 -3
View File
@@ -200,9 +200,11 @@
#define NO_SLIP_WHEN_WALKING (1<<0)
#define SLIDE (1<<1)
#define GALOSHES_DONT_HELP (1<<2)
#define SLIDE_ICE (1<<3)
#define SLIP_WHEN_CRAWLING (1<<4) //clown planet ruin
#define SLIP_WHEN_JOGGING (1<<5) //slips prevented by walking are also dodged if the mob is not sprinting or fatigued... unless this flag is on.
#define FLYING_DOESNT_HELP (1<<3)
#define SLIDE_ICE (1<<4)
#define SLIP_WHEN_CRAWLING (1<<5) //clown planet ruin amongst others
#define SLIP_WHEN_JOGGING (1<<6) //slips prevented by walking are also dodged if the mob is nor sprinting or fatigued... unless this flag is on.
#define MAX_CHICKENS 50
+2 -2
View File
@@ -54,5 +54,5 @@ When using time2text(), please use "DDD" to find the weekday. Refrain from using
#define WORLDTIME2TEXT(format) GAMETIMESTAMP(format, world.time)
#define WORLDTIMEOFDAY2TEXT(format) GAMETIMESTAMP(format, world.timeofday)
#define TIME_STAMP(format, showds) showds ? "[WORLDTIMEOFDAY2TEXT(format)]:[world.timeofday % 10]" : WORLDTIMEOFDAY2TEXT(format)
#define STATION_TIME(display_only) ((((world.time - SSticker.round_start_time) * SSticker.station_time_rate_multiplier) + SSticker.gametime_offset) % 864000) - (display_only? GLOB.timezoneOffset : 0)
#define STATION_TIME_TIMESTAMP(format) time2text(STATION_TIME(TRUE), format)
#define STATION_TIME(display_only, wtime) ((((wtime - SSticker.round_start_time) * SSticker.station_time_rate_multiplier) + SSticker.gametime_offset) % 864000) - (display_only? GLOB.timezoneOffset : 0)
#define STATION_TIME_TIMESTAMP(format, wtime) time2text(STATION_TIME(TRUE, wtime), format)
+1 -1
View File
@@ -2,7 +2,7 @@
#define TYPEID_NULL "0"
#define TYPEID_NORMAL_LIST "f"
//helper macros
#define GET_TYPEID(ref) ( ( (length(ref) <= 10) ? "TYPEID_NULL" : copytext(ref, 4, length(ref)-6) ) )
#define GET_TYPEID(ref) ( ( (length(ref) <= 10) ? "TYPEID_NULL" : copytext(ref, 4, -7) ) )
#define IS_NORMAL_LIST(L) (GET_TYPEID("\ref[L]") == TYPEID_NORMAL_LIST)
+9
View File
@@ -94,6 +94,10 @@
if (CONFIG_GET(flag/log_emote))
WRITE_LOG(GLOB.world_game_log, "EMOTE: [text]")
/proc/log_subtler(text)
if (CONFIG_GET(flag/log_emote))
WRITE_LOG(GLOB.world_game_log, "EMOTE (SUBTLER): [text]")
/proc/log_prayer(text)
if (CONFIG_GET(flag/log_prayer))
WRITE_LOG(GLOB.world_game_log, "PRAY: [text]")
@@ -175,6 +179,11 @@
/proc/start_log(log)
WRITE_LOG(log, "Starting up round ID [GLOB.round_id].\n-------------------------")
/* ui logging */
/proc/log_tgui(text)
WRITE_LOG(GLOB.tgui_log, text)
/* Close open log handles. This should be called as late as possible, and no logging should hapen after. */
/proc/shutdown_logging()
rustg_log_close_all()
+1 -1
View File
@@ -20,7 +20,7 @@
continue
path += choice
if(copytext(path,-1,0) != "/") //didn't choose a directory, no need to iterate again
if(copytext_char(path, -1) != "/") //didn't choose a directory, no need to iterate again
break
var/extensions
for(var/i in valid_extensions)
+2 -2
View File
@@ -985,7 +985,7 @@ world
var/icon/atom_icon = new(A.icon, A.icon_state)
if(!letter)
letter = copytext(A.name, 1, 2)
letter = A.name[1]
if(uppercase == 1)
letter = uppertext(letter)
else if(uppercase == -1)
@@ -1113,7 +1113,7 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0
WRITE_FILE(GLOB.iconCache[iconKey], icon)
var/iconData = GLOB.iconCache.ExportText(iconKey)
var/list/partial = splittext(iconData, "{")
return replacetext(copytext(partial[2], 3, -5), "\n", "")
return replacetext(copytext_char(partial[2], 3, -5), "\n", "")
/proc/icon2html(thing, target, icon_state, dir, frame = 1, moving = FALSE)
if (!thing)
+2 -2
View File
@@ -28,10 +28,10 @@
. = "does"
/datum/proc/p_theyve(capitalized, temp_gender)
. = p_they(capitalized, temp_gender) + "'" + copytext(p_have(temp_gender), 3)
. = p_they(capitalized, temp_gender) + "'" + copytext_char(p_have(temp_gender), 3)
/datum/proc/p_theyre(capitalized, temp_gender)
. = p_they(capitalized, temp_gender) + "'" + copytext(p_are(temp_gender), 2)
. = p_they(capitalized, temp_gender) + "'" + copytext_char(p_are(temp_gender), 2)
/datum/proc/p_s(temp_gender) //is this a descriptive proc name, or what?
. = "s"
+1 -1
View File
@@ -1,6 +1,6 @@
// Ensure the frequency is within bounds of what it should be sending/receiving at
/proc/sanitize_frequency(frequency, free = FALSE)
. = round(frequency)
frequency = round(frequency)
if(free)
. = CLAMP(frequency, MIN_FREE_FREQ, MAX_FREE_FREQ)
else
+23
View File
@@ -72,3 +72,26 @@
if(!GLOB.chemical_reactions_list[primary_reagent])
GLOB.chemical_reactions_list[primary_reagent] = list()
GLOB.chemical_reactions_list[primary_reagent] += R
/proc/choose_reagent_id(mob/user)
var/chosen_id
switch(alert(user, "Choose a method.", "Add Reagents", "Search", "Choose from a list", "I'm feeling lucky"))
if("Search")
var/valid_id
while(!valid_id)
chosen_id = input(user, "Enter the ID of the reagent you want to add.", "Search reagents") as null|text
if(isnull(chosen_id)) //Get me out of here!
break
if(!ispath(text2path(chosen_id)))
chosen_id = pick_closest_path(chosen_id, make_types_fancy(subtypesof(/datum/reagent)))
if(ispath(chosen_id))
valid_id = TRUE
else
valid_id = TRUE
if(!valid_id)
to_chat(user, "<span class='warning'>A reagent with that ID doesn't exist!</span>")
if("Choose from a list")
chosen_id = input(user, "Choose a reagent to add.", "Choose a reagent.") as null|anything in subtypesof(/datum/reagent)
if("I'm feeling lucky")
chosen_id = pick(subtypesof(/datum/reagent))
return chosen_id
+22 -14
View File
@@ -43,24 +43,30 @@
if(!istext(color))
color = ""
var/start = 1 + (text2ascii(color,1)==35)
var/start = 1 + (text2ascii(color, 1) == 35)
var/len = length(color)
var/step_size = 1 + ((len+1)-start != desired_format)
var/char = ""
// RRGGBB -> RGB but awful
var/convert_to_shorthand = desired_format == 3 && length_char(color) > 3
. = ""
for(var/i=start, i<=len, i+=step_size)
var/ascii = text2ascii(color,i)
switch(ascii)
if(48 to 57)
. += ascii2text(ascii) //numbers 0 to 9
if(97 to 102)
. += ascii2text(ascii) //letters a to f
if(65 to 70)
. += ascii2text(ascii+32) //letters A to F - translates to lowercase
var/i = start
while(i <= len)
char = color[i]
switch(text2ascii(char))
if(48 to 57) //numbers 0 to 9
. += char
if(97 to 102) //letters a to f
. += char
if(65 to 70) //letters A to F
. += lowertext(char)
else
break
i += length(char)
if(convert_to_shorthand && i <= len) //skip next one
i += length(color[i])
if(length(.) != desired_format)
if(length_char(.) != desired_format)
if(default)
return default
return crunch + repeat_string(desired_format, "0")
@@ -68,7 +74,9 @@
return crunch + .
/proc/sanitize_ooccolor(color)
var/list/HSL = rgb2hsl(hex2num(copytext(color,2,4)),hex2num(copytext(color,4,6)),hex2num(copytext(color,6,8)))
if(length(color) != length_char(color))
CRASH("Invalid characters in color '[color]'")
var/list/HSL = rgb2hsl(hex2num(copytext(color, 2, 4)), hex2num(copytext(color, 4, 6)), hex2num(copytext(color, 6, 8)))
HSL[3] = min(HSL[3],0.4)
var/list/RGB = hsl2rgb(arglist(HSL))
return "#[num2hex(RGB[1],2)][num2hex(RGB[2],2)][num2hex(RGB[3],2)]"
return "#[num2hex(RGB[1],2)][num2hex(RGB[2],2)][num2hex(RGB[3],2)]"
+1 -1
View File
@@ -52,6 +52,6 @@
if(bad_chars)
bad_match = url_encode(bad_chars_regex.match)
scrubbed_url += bad_match
last_good = bad_chars + length(bad_match)
last_good = bad_chars + length(bad_chars_regex.match)
while(bad_chars)
. = scrubbed_url
+213 -231
View File
@@ -40,8 +40,8 @@
for(var/char in repl_chars)
var/index = findtext(t, char)
while(index)
t = copytext(t, 1, index) + repl_chars[char] + copytext(t, index+1)
index = findtext(t, char, index+1)
t = copytext(t, 1, index) + repl_chars[char] + copytext(t, index + length(char))
index = findtext(t, char, index + length(char))
return t
/proc/sanitize_filename(t)
@@ -63,22 +63,28 @@
//Returns null if there is any bad text in the string
/proc/reject_bad_text(text, max_length=512)
if(length(text) > max_length)
return //message too long
var/non_whitespace = 0
for(var/i=1, i<=length(text), i++)
switch(text2ascii(text,i))
if(62,60,92,47)
return //rejects the text if it contains these bad characters: <, >, \ or /
if(127 to 255)
return //rejects weird letters like
/proc/reject_bad_text(text, max_length = 512, ascii_only = TRUE)
var/char_count = 0
var/non_whitespace = FALSE
var/lenbytes = length(text)
var/char = ""
for(var/i = 1, i <= lenbytes, i += length(char))
char = text[i]
char_count++
if(char_count > max_length)
return
switch(text2ascii(char))
if(62,60,92,47) // <, >, \, /
return
if(0 to 31)
return //more weird stuff
return
if(32)
continue //whitespace
if(127 to INFINITY)
if(ascii_only)
return
else
non_whitespace = 1
non_whitespace = TRUE
if(non_whitespace)
return text //only accepts the text if it has some non-spaces
@@ -101,73 +107,84 @@
else
return trim(html_encode(name), max_length)
#define NO_CHARS_DETECTED 0
#define SPACES_DETECTED 1
#define SYMBOLS_DETECTED 2
#define NUMBERS_DETECTED 3
#define LETTERS_DETECTED 4
//Filters out undesirable characters from names
/proc/reject_bad_name(t_in, allow_numbers=0, max_length=MAX_NAME_LEN)
if(!t_in || length(t_in) > max_length)
return //Rejects the input if it is null or if it is longer then the max length allowed
/proc/reject_bad_name(t_in, allow_numbers = FALSE, max_length = MAX_NAME_LEN, ascii_only = TRUE)
if(!t_in)
return //Rejects the input if it is null
var/number_of_alphanumeric = 0
var/last_char_group = 0
var/number_of_alphanumeric = 0
var/last_char_group = NO_CHARS_DETECTED
var/t_out = ""
var/t_len = length(t_in)
var/charcount = 0
var/char = ""
for(var/i=1, i<=length(t_in), i++)
var/ascii_char = text2ascii(t_in,i)
switch(ascii_char)
for(var/i = 1, i <= t_len, i += length(char))
char = t_in[i]
switch(text2ascii(char))
// A .. Z
if(65 to 90) //Uppercase Letters
t_out += ascii2text(ascii_char)
number_of_alphanumeric++
last_char_group = 4
last_char_group = LETTERS_DETECTED
// a .. z
if(97 to 122) //Lowercase Letters
if(last_char_group<2)
t_out += ascii2text(ascii_char-32) //Force uppercase first character
else
t_out += ascii2text(ascii_char)
if(last_char_group == NO_CHARS_DETECTED || last_char_group == SPACES_DETECTED || last_char_group == SYMBOLS_DETECTED) //start of a word
char = uppertext(char)
number_of_alphanumeric++
last_char_group = 4
last_char_group = LETTERS_DETECTED
// 0 .. 9
if(48 to 57) //Numbers
if(!last_char_group)
continue //suppress at start of string
if(!allow_numbers)
if(last_char_group == NO_CHARS_DETECTED || !allow_numbers) //suppress at start of string
continue
t_out += ascii2text(ascii_char)
number_of_alphanumeric++
last_char_group = 3
last_char_group = NUMBERS_DETECTED
// ' - .
if(39,45,46) //Common name punctuation
if(!last_char_group)
if(last_char_group == NO_CHARS_DETECTED)
continue
t_out += ascii2text(ascii_char)
last_char_group = 2
last_char_group = SYMBOLS_DETECTED
// ~ | @ : # $ % & * +
if(126,124,64,58,35,36,37,38,42,43) //Other symbols that we'll allow (mainly for AI)
if(!last_char_group)
continue //suppress at start of string
if(!allow_numbers)
if(last_char_group == NO_CHARS_DETECTED || !allow_numbers) //suppress at start of string
continue
t_out += ascii2text(ascii_char)
last_char_group = 2
last_char_group = SYMBOLS_DETECTED
//Space
if(32)
if(last_char_group <= 1)
continue //suppress double-spaces and spaces at start of string
t_out += ascii2text(ascii_char)
last_char_group = 1
if(last_char_group == NO_CHARS_DETECTED || last_char_group == SPACES_DETECTED) //suppress double-spaces and spaces at start of string
continue
last_char_group = SPACES_DETECTED
if(127 to INFINITY)
if(ascii_only)
continue
last_char_group = SYMBOLS_DETECTED //for now, we'll treat all non-ascii characters like symbols even though most are letters
else
return
continue
t_out += char
charcount++
if(charcount >= max_length)
break
if(number_of_alphanumeric < 2)
return //protects against tiny names like "A" and also names like "' ' ' ' ' ' ' '"
if(last_char_group == 1)
t_out = copytext(t_out,1,length(t_out)) //removes the last character (in this case a space)
if(last_char_group == SPACES_DETECTED)
t_out = copytext_char(t_out, 1, -1) //removes the last character (in this case a space)
for(var/bad_name in list("space","floor","wall","r-wall","monkey","unknown","inactive ai")) //prevents these common metagamey names
if(cmptext(t_out,bad_name))
@@ -175,6 +192,11 @@
return t_out
#undef NO_CHARS_DETECTED
#undef SPACES_DETECTED
#undef NUMBERS_DETECTED
#undef LETTERS_DETECTED
//html_encode helper proc that returns the smallest non null of two numbers
//or 0 if they're both null (needed because of findtext returning 0 when a value is not present)
/proc/non_zero_min(a, b)
@@ -184,39 +206,6 @@
return a
return (a < b ? a : b)
/*
* Text searches
*/
//Checks the beginning of a string for a specified sub-string
//Returns the position of the substring or 0 if it was not found
/proc/dd_hasprefix(text, prefix)
var/start = 1
var/end = length(prefix) + 1
return findtext(text, prefix, start, end)
//Checks the beginning of a string for a specified sub-string. This proc is case sensitive
//Returns the position of the substring or 0 if it was not found
/proc/dd_hasprefix_case(text, prefix)
var/start = 1
var/end = length(prefix) + 1
return findtextEx(text, prefix, start, end)
//Checks the end of a string for a specified substring.
//Returns the position of the substring or 0 if it was not found
/proc/dd_hassuffix(text, suffix)
var/start = length(text) - length(suffix)
if(start)
return findtext(text, suffix, start, null)
return
//Checks the end of a string for a specified substring. This proc is case sensitive
//Returns the position of the substring or 0 if it was not found
/proc/dd_hassuffix_case(text, suffix)
var/start = length(text) - length(suffix)
if(start)
return findtextEx(text, suffix, start, null)
//Checks if any of a given list of needles is in the haystack
/proc/text_in_list(haystack, list/needle_list, start=1, end=0)
for(var/needle in needle_list)
@@ -231,23 +220,19 @@
return 1
return 0
//Adds 'u' number of zeros ahead of the text 't'
/proc/add_zero(t, u)
while (length(t) < u)
t = "0[t]"
return t
//Adds 'char' ahead of 'text' until there are 'count' characters total
/proc/add_leading(text, count, char = " ")
text = "[text]"
var/charcount = count - length_char(text)
var/list/chars_to_add[max(charcount + 1, 0)]
return jointext(chars_to_add, char) + text
//Adds 'u' number of spaces ahead of the text 't'
/proc/add_lspace(t, u)
while(length(t) < u)
t = " [t]"
return t
//Adds 'u' number of spaces behind the text 't'
/proc/add_tspace(t, u)
while(length(t) < u)
t = "[t] "
return t
//Adds 'char' behind 'text' until there are 'count' characters total
/proc/add_trailing(text, count, char = " ")
text = "[text]"
var/charcount = count - length_char(text)
var/list/chars_to_add[max(charcount + 1, 0)]
return text + jointext(chars_to_add, char)
//Returns a string with reserved characters and spaces before the first letter removed
/proc/trim_left(text)
@@ -267,57 +252,41 @@
//Returns a string with reserved characters and spaces before the first word and after the last word removed.
/proc/trim(text, max_length)
if(max_length)
text = copytext(text, 1, max_length)
text = copytext_char(text, 1, max_length)
return trim_left(trim_right(text))
//Returns a string with the first element of the string capitalized.
/proc/capitalize(t as text)
return uppertext(copytext(t, 1, 2)) + copytext(t, 2)
//Centers text by adding spaces to either side of the string.
/proc/dd_centertext(message, length)
var/new_message = message
var/size = length(message)
var/delta = length - size
if(size == length)
return new_message
if(size > length)
return copytext(new_message, 1, length + 1)
if(delta == 1)
return new_message + " "
if(delta % 2)
new_message = " " + new_message
delta--
var/spaces = add_lspace("",delta/2-1)
return spaces + new_message + spaces
//Limits the length of the text. Note: MAX_MESSAGE_LEN and MAX_NAME_LEN are widely used for this purpose
/proc/dd_limittext(message, length)
var/size = length(message)
if(size <= length)
return message
return copytext(message, 1, length + 1)
. = t
if(t)
. = t[1]
return uppertext(.) + copytext(t, 1 + length(.))
/proc/stringmerge(text,compare,replace = "*")
//This proc fills in all spaces with the "replace" var (* by default) with whatever
//is in the other string at the same spot (assuming it is not a replace char).
//This is used for fingerprints
var/newtext = text
if(length(text) != length(compare))
return 0
for(var/i = 1, i < length(text), i++)
var/a = copytext(text,i,i+1)
var/b = copytext(compare,i,i+1)
var/text_it = 1 //iterators
var/comp_it = 1
var/newtext_it = 1
var/text_length = length(text)
var/comp_length = length(compare)
while(comp_it <= comp_length && text_it <= text_length)
var/a = text[text_it]
var/b = compare[comp_it]
//if it isn't both the same letter, or if they are both the replacement character
//(no way to know what it was supposed to be)
if(a != b)
if(a == replace) //if A is the replacement char
newtext = copytext(newtext,1,i) + b + copytext(newtext, i+1)
newtext = copytext(newtext, 1, newtext_it) + b + copytext(newtext, newtext_it + length(newtext[newtext_it]))
else if(b == replace) //if B is the replacement char
newtext = copytext(newtext,1,i) + a + copytext(newtext, i+1)
newtext = copytext(newtext, 1, newtext_it) + a + copytext(newtext, newtext_it + length(newtext[newtext_it]))
else //The lists disagree, Uh-oh!
return 0
text_it += length(a)
comp_it += length(b)
newtext_it += length(newtext[newtext_it])
return newtext
/proc/stringpercent(text,character = "*")
@@ -326,16 +295,21 @@
if(!text || !character)
return 0
var/count = 0
for(var/i = 1, i <= length(text), i++)
var/a = copytext(text,i,i+1)
var/lentext = length(text)
var/a = ""
for(var/i = 1, i <= lentext, i += length(a))
a = text[i]
if(a == character)
count++
return count
/proc/reverse_text(text = "")
var/new_text = ""
for(var/i = length(text); i > 0; i--)
new_text += copytext(text, i, i+1)
var/lentext = length(text)
var/letter = ""
for(var/i = 1, i <= lentext, i += length(letter))
letter = text[i]
new_text = letter + new_text
return new_text
GLOBAL_LIST_INIT(zero_character_only, list("0"))
@@ -358,15 +332,6 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
/proc/random_color()
return random_string(6, GLOB.hex_characters)
/proc/add_zero2(t, u)
var/temp1
while (length(t) < u)
t = "0[t]"
temp1 = t
if (length(t) > u)
temp1 = copytext(t,2,u+1)
return temp1
//merges non-null characters (3rd argument) from "from" into "into". Returns result
//e.g. into = "Hello World"
// from = "Seeya______"
@@ -379,41 +344,48 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
into = ""
if(!istext(from))
from = ""
var/null_ascii = istext(null_char) ? text2ascii(null_char,1) : null_char
var/previous = 0
var/null_ascii = istext(null_char) ? text2ascii(null_char, 1) : null_char
var/copying_into = FALSE
var/char = ""
var/start = 1
var/end = length(into) + 1
for(var/i=1, i<end, i++)
var/ascii = text2ascii(from, i)
if(ascii == null_ascii)
if(previous != 1)
. += copytext(from, start, i)
start = i
previous = 1
var/end_from = length(from)
var/end_into = length(into)
var/into_it = 1
var/from_it = 1
while(from_it <= end_from && into_it <= end_into)
char = from[from_it]
if(text2ascii(char) == null_ascii)
if(!copying_into)
. += copytext(from, start, from_it)
start = into_it
copying_into = TRUE
else
if(previous != 0)
. += copytext(into, start, i)
start = i
previous = 0
if(copying_into)
. += copytext(into, start, into_it)
start = from_it
copying_into = FALSE
into_it += length(into[into_it])
from_it += length(char)
if(previous == 0)
. += copytext(from, start, end)
if(copying_into)
. += copytext(into, start)
else
. += copytext(into, start, end)
. += copytext(from, start, from_it)
if(into_it <= end_into)
. += copytext(into, into_it)
//finds the first occurrence of one of the characters from needles argument inside haystack
//it may appear this can be optimised, but it really can't. findtext() is so much faster than anything you can do in byondcode.
//stupid byond :(
/proc/findchar(haystack, needles, start=1, end=0)
var/temp
var/char = ""
var/len = length(needles)
for(var/i=1, i<=len, i++)
temp = findtextEx(haystack, ascii2text(text2ascii(needles,i)), start, end) //Note: ascii2text(text2ascii) is faster than copytext()
if(temp)
end = temp
return end
for(var/i = 1, i <= len, i += length(char))
char = needles[i]
. = findtextEx(haystack, char, start, end)
if(.)
return
return 0
/proc/parsemarkdown_basic_step1(t, limited=FALSE)
if(length(t) <= 0)
@@ -571,23 +543,28 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
return t
#define string2charlist(string) (splittext(string, regex("(.)")) - splittext(string, ""))
/proc/text2charlist(text)
var/char = ""
var/lentext = length(text)
. = list()
for(var/i = 1, i <= lentext, i += length(char))
char = text[i]
. += char
/proc/rot13(text = "")
var/list/textlist = string2charlist(text)
var/list/result = list()
for(var/c in textlist)
var/ca = text2ascii(c)
if(ca >= text2ascii("a") && ca <= text2ascii("m"))
ca += 13
else if(ca >= text2ascii("n") && ca <= text2ascii("z"))
ca -= 13
else if(ca >= text2ascii("A") && ca <= text2ascii("M"))
ca += 13
else if(ca >= text2ascii("N") && ca <= text2ascii("Z"))
ca -= 13
result += ascii2text(ca)
return jointext(result, "")
var/lentext = length(text)
var/char = ""
var/ascii = 0
. = ""
for(var/i = 1, i <= lentext, i += length(char))
char = text[i]
ascii = text2ascii(char)
switch(ascii)
if(65 to 77, 97 to 109) //A to M, a to m
ascii += 13
if(78 to 90, 110 to 122) //N to Z, n to z
ascii -= 13
. += ascii2text(ascii)
//Takes a list of values, sanitizes it down for readability and character count,
//then exports it as a json file at data/npc_saves/[filename].json.
@@ -599,7 +576,8 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
return
//Regular expressions are, as usual, absolute magic
var/regex/all_invalid_symbols = new("\[^ -~]+")
//Any characters outside of 32 (space) to 126 (~) because treating things you don't understand as "magic" is really stupid
var/regex/all_invalid_symbols = new(@"[^ -~]{1}")
var/list/accepted = list()
for(var/string in proposed)
@@ -607,34 +585,44 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
continue
var/buffer = ""
var/early_culling = TRUE
for(var/pos = 1, pos <= length(string), pos++)
var/let = copytext(string, pos, (pos + 1) % length(string))
if(early_culling && !findtext(let,GLOB.is_alphanumeric))
var/lentext = length(string)
var/let = ""
for(var/pos = 1, pos <= lentext, pos += length(let))
let = string[pos]
if(!findtext(let, GLOB.is_alphanumeric))
continue
early_culling = FALSE
buffer += let
if(!findtext(buffer,GLOB.is_alphanumeric))
buffer = copytext(string, pos)
break
if(early_culling) //Never found any letters! Bail!
continue
var/punctbuffer = ""
var/cutoff = length(buffer)
for(var/pos = length(buffer), pos >= 0, pos--)
var/let = copytext(buffer, pos, (pos + 1) % length(buffer))
if(findtext(let,GLOB.is_alphanumeric))
var/cutoff = 0
lentext = length_char(buffer)
for(var/pos = 1, pos <= lentext, pos++)
let = copytext_char(buffer, -pos, -pos + 1)
if(!findtext(let, GLOB.is_punctuation)) //This won't handle things like Nyaaaa!~ but that's fine
break
if(findtext(let,GLOB.is_punctuation))
punctbuffer = let + punctbuffer //Note this isn't the same thing as using +=
cutoff = pos
punctbuffer += let
cutoff += length(let)
if(punctbuffer) //We clip down excessive punctuation to get the letter count lower and reduce repeats. It's not perfect but it helps.
var/exclaim = FALSE
var/question = FALSE
var/periods = 0
for(var/pos = length(punctbuffer), pos >= 0, pos--)
var/punct = copytext(punctbuffer, pos, (pos + 1) % length(punctbuffer))
if(!exclaim && findtext(punct,"!"))
lentext = length(punctbuffer)
for(var/pos = 1, pos <= lentext, pos += length(let))
let = punctbuffer[pos]
if(!exclaim && findtext(let, "!"))
exclaim = TRUE
if(!question && findtext(punct,"?"))
if(question)
break
if(!question && findtext(let, "?"))
question = TRUE
if(!exclaim && !question && findtext(punct,"."))
if(exclaim)
break
if(!exclaim && !question && findtext(let, ".")) //? and ! take priority over periods
periods += 1
if(exclaim)
if(question)
@@ -643,15 +631,13 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
punctbuffer = "!"
else if(question)
punctbuffer = "?"
else if(periods)
if(periods > 1)
punctbuffer = "..."
else
punctbuffer = "" //Grammer nazis be damned
buffer = copytext(buffer, 1, cutoff) + punctbuffer
if(!findtext(buffer,GLOB.is_alphanumeric))
continue
if(!buffer || length(buffer) > 280 || length(buffer) <= cullshort || buffer in accepted)
else if(periods > 1)
punctbuffer = "..."
else
punctbuffer = "" //Grammer nazis be damned
buffer = copytext(buffer, 1, -cutoff) + punctbuffer
lentext = length_char(buffer)
if(!buffer || lentext > 280 || lentext <= cullshort || (buffer in accepted))
continue
accepted += buffer
@@ -688,7 +674,7 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
var/leng = length(string)
var/next_space = findtext(string, " ", next_backslash + 1)
var/next_space = findtext(string, " ", next_backslash + length(string[next_backslash]))
if(!next_space)
next_space = leng - next_backslash
@@ -696,8 +682,8 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
return string
var/base = next_backslash == 1 ? "" : copytext(string, 1, next_backslash)
var/macro = lowertext(copytext(string, next_backslash + 1, next_space))
var/rest = next_backslash > leng ? "" : copytext(string, next_space + 1)
var/macro = lowertext(copytext(string, next_backslash + length(string[next_space]), next_space))
var/rest = next_backslash > leng ? "" : copytext(string, next_space + length(string[next_space]))
//See https://secure.byond.com/docs/ref/info.html#/DM/text/macros
switch(macro)
@@ -769,28 +755,24 @@ GLOBAL_LIST_INIT(binary, list("0","1"))
return "[number]\th"
/proc/unintelligize(message)
var/prefix=copytext(message,1,2)
var/regex/word_boundaries = regex(@"\b[\S]+\b", "g")
var/prefix = message[1]
if(prefix == ";")
message = copytext(message,2)
else if(prefix in list(":","#"))
prefix += copytext(message,2,3)
message = copytext(message,3)
message = copytext(message, 1 + length(prefix))
else if(prefix in list(":", "#"))
prefix += message[1 + length(prefix)]
message = copytext(message, length(prefix))
else
prefix=""
prefix = ""
var/list/words = splittext(message," ")
var/list/rearranged = list()
for(var/i=1;i<=words.len;i++)
var/cword = pick(words)
words.Remove(cword)
var/suffix = copytext(cword,length(cword)-1,length(cword))
while(length(cword)>0 && suffix in list(".",",",";","!",":","?"))
cword = copytext(cword,1 ,length(cword)-1)
suffix = copytext(cword,length(cword)-1,length(cword) )
while(word_boundaries.Find(message))
var/cword = word_boundaries.match
if(length(cword))
rearranged += cword
message = "[prefix][jointext(rearranged," ")]"
. = message
shuffle_inplace(rearranged)
return "[prefix][jointext(rearranged, " ")]"
#define is_alpha(X) ((text2ascii(X) <= 122) && (text2ascii(X) >= 97))
#define is_digit(X) ((length(X) == 1) && (length(text2num(X)) == 1))
+5 -4
View File
@@ -8,14 +8,15 @@
index = findtext(t, char)
return t
proc/TextPreview(var/string,var/len=40)
if(length(string) <= len)
if(!length(string))
/proc/TextPreview(string, len = 40)
var/char_len = length_char(string)
if(char_len <= len)
if(char_len)
return "\[...\]"
else
return string
else
return "[copytext(string, 1, 37)]..."
return "[copytext_char(string, 1, 37)]..."
GLOBAL_LIST_EMPTY(mentorlog)
GLOBAL_PROTECT(mentorlog)
+5 -5
View File
@@ -542,17 +542,17 @@
//assumes format #RRGGBB #rrggbb
/proc/color_hex2num(A)
if(!A)
if(!A || length(A) != length_char(A))
return 0
var/R = hex2num(copytext(A,2,4))
var/G = hex2num(copytext(A,4,6))
var/B = hex2num(copytext(A,6,0))
var/R = hex2num(copytext(A, 2, 4))
var/G = hex2num(copytext(A, 4, 6))
var/B = hex2num(copytext(A, 6, 0))
return R+G+B
//word of warning: using a matrix like this as a color value will simplify it back to a string after being set
/proc/color_hex2color_matrix(string)
var/length = length(string)
if(length != 7 && length != 9)
if((length != 7 && length != 9) || length != length_char(string))
return color_matrix_identity()
var/r = hex2num(copytext(string, 2, 4))/255
var/g = hex2num(copytext(string, 4, 6))/255
+57 -20
View File
@@ -6,25 +6,18 @@
//Inverts the colour of an HTML string
/proc/invertHTML(HTMLstring)
if (!( istext(HTMLstring) ))
if(!istext(HTMLstring))
CRASH("Given non-text argument!")
return
else
if (length(HTMLstring) != 7)
CRASH("Given non-HTML argument!")
return
else if(length(HTMLstring) != 7)
CRASH("Given non-HTML argument!")
return
else if(length_char(HTMLstring) != 7)
CRASH("Given non-hex symbols in argument!")
var/textr = copytext(HTMLstring, 2, 4)
var/textg = copytext(HTMLstring, 4, 6)
var/textb = copytext(HTMLstring, 6, 8)
var/r = hex2num(textr)
var/g = hex2num(textg)
var/b = hex2num(textb)
textr = num2hex(255 - r, 2)
textg = num2hex(255 - g, 2)
textb = num2hex(255 - b, 2)
return text("#[][][]", textr, textg, textb)
return
return rgb(255 - hex2num(textr), 255 - hex2num(textg), 255 - hex2num(textb))
/proc/Get_Angle(atom/movable/start,atom/movable/end)//For beams.
if(!start || !end)
@@ -184,15 +177,15 @@ Turf and target are separate in case you want to teleport some distance from a t
//Returns whether or not a player is a guest using their ckey as an input
/proc/IsGuestKey(key)
if (findtext(key, "Guest-", 1, 7) != 1) //was findtextEx
return 0
return FALSE
var/i, ch, len = length(key)
for (i = 7, i <= len, ++i)
for (i = 7, i <= len, ++i) //we know the first 6 chars are Guest-
ch = text2ascii(key, i)
if (ch < 48 || ch > 57)
return 0
return 1
if (ch < 48 || ch > 57) //0-9
return FALSE
return TRUE
//Generalised helper proc for letting mobs rename themselves. Used to be clname() and ainame()
/mob/proc/apply_pref_name(role, client/C)
@@ -1314,7 +1307,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
/proc/GUID()
var/const/GUID_VERSION = "b"
var/const/GUID_VARIANT = "d"
var/node_id = copytext(md5("[rand()*rand(1,9999999)][world.name][world.hub][world.hub_password][world.internet_address][world.address][world.contents.len][world.status][world.port][rand()*rand(1,9999999)]"), 1, 13)
var/node_id = copytext_char(md5("[rand()*rand(1,9999999)][world.name][world.hub][world.hub_password][world.internet_address][world.address][world.contents.len][world.status][world.port][rand()*rand(1,9999999)]"), 1, 13)
var/time_high = "[num2hex(text2num(time2text(world.realtime,"YYYY")), 2)][num2hex(world.realtime, 6)]"
@@ -1501,3 +1494,47 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
return -1
else
return 0
// Converts browser keycodes to BYOND keycodes.
/proc/browser_keycode_to_byond(keycode)
keycode = text2num(keycode)
switch(keycode)
// letters and numbers
if(65 to 90, 48 to 57)
return ascii2text(keycode)
if(17)
return "Ctrl"
if(18)
return "Alt"
if(16)
return "Shift"
if(37)
return "West"
if(38)
return "North"
if(39)
return "East"
if(40)
return "South"
if(45)
return "Insert"
if(46)
return "Delete"
if(36)
return "Northwest"
if(35)
return "Southwest"
if(33)
return "Northeast"
if(34)
return "Southeast"
if(112 to 123)
return "F[keycode-111]"
if(96 to 105)
return "Numpad[keycode-96]"
if(188)
return ","
if(190)
return "."
if(189)
return "-"
+20
View File
@@ -39,6 +39,26 @@
#error You need version 512 or higher
#endif
//Compatability -- These procs were added in 513.1493, not 513.1490
//Which really shoulda bumped us up to 514 right then and there but instead Lummox is a dumb dumb
#if DM_BUILD < 1493
#define length_char(args...) length(args)
#define text2ascii_char(args...) text2ascii(args)
#define copytext_char(args...) copytext(args)
#define splittext_char(args...) splittext(args)
#define spantext_char(args...) spantext(args)
#define nonspantext_char(args...) nonspantext(args)
#define findtext_char(args...) findtext(args)
#define findtextEx_char(args...) findtextEx(args)
#define findlasttext_char(args...) findlasttext(args)
#define findlasttextEx_char(args...) findlasttextEx(args)
#define replacetext_char(args...) replacetext(args)
#define replacetextEx_char(args...) replacetextEx(args)
// /regex procs
#define Find_char(args...) Find(args)
#define Replace_char(args...) Replace(args)
#endif
//Additional code for the above flags.
#ifdef TESTING
#warn compiling in TESTING mode. testing() debug messages will be visible.
+3 -9
View File
@@ -91,13 +91,7 @@ GLOBAL_LIST_INIT(all_types_bloods,list(
"BUG"
))
GLOBAL_LIST_INIT(blood_types, list(
"blood",
"jellyblood"
GLOBAL_LIST_INIT(blood_reagent_types, list(
/datum/reagent/blood,
/datum/reagent/blood/jellyblood
))
GLOBAL_LIST_INIT(blood_id_types, list(
"blood" = /datum/reagent/blood,
"jellyblood" = /datum/reagent/blood/jellyblood
))
+3
View File
@@ -46,6 +46,9 @@ GLOBAL_PROTECT(lastsignalers)
GLOBAL_LIST_EMPTY(lawchanges) //Stores who uploaded laws to which silicon-based lifeform, and what the law was
GLOBAL_PROTECT(lawchanges)
GLOBAL_VAR(tgui_log)
GLOBAL_PROTECT(tgui_log)
GLOBAL_LIST_EMPTY(combatlog)
GLOBAL_PROTECT(combatlog)
GLOBAL_LIST_EMPTY(IClog)
+2 -8
View File
@@ -140,10 +140,7 @@
if(obj_flags & EMAGGED)
return
if(locked)
bolt_raise(usr)
else
bolt_drop(usr)
toggle_bolt(usr)
/obj/machinery/door/airlock/AIAltClick() // Eletrifies doors.
if(obj_flags & EMAGGED)
@@ -165,10 +162,7 @@
if(obj_flags & EMAGGED)
return
if(!emergency)
emergency_on(usr)
else
emergency_off(usr)
toggle_emergency(usr)
/* APC */
/obj/machinery/power/apc/AICtrlClick() // turns off/on APCs.
-5
View File
@@ -50,11 +50,6 @@
zone_select.update_icon()
static_inventory += zone_select
using = new /obj/screen/craft
using.icon = ui_style
using.hud = src
static_inventory += using
using = new /obj/screen/area_creator
using.icon = ui_style
using.hud = src
-7
View File
@@ -91,13 +91,6 @@
var/obj/screen/using
var/obj/screen/inventory/inv_box
using = new /obj/screen/craft
using.icon = ui_style
if(!widescreenlayout) // CIT CHANGE
using.screen_loc = ui_boxcraft // CIT CHANGE
using.hud = src
static_inventory += using
using = new/obj/screen/language_menu
using.icon = ui_style
if(!widescreenlayout) // CIT CHANGE
-6
View File
@@ -66,12 +66,6 @@
icon_state = "craft"
screen_loc = ui_crafting
/obj/screen/craft/Click()
var/mob/living/M = usr
if(isobserver(usr))
return
M.OpenCraftingMenu()
/obj/screen/area_creator
name = "create new area"
icon = 'icons/mob/screen_midnight.dmi'
@@ -171,7 +171,8 @@
key_name = copytext(str_val, 1, key_pos)
if(lowercase)
key_name = lowertext(key_name)
key_value = copytext(str_val, key_pos + 1)
if(key_pos)
key_value = copytext(str_val, key_pos + length(str_val[key_pos]))
var/new_key
var/new_value
var/continue_check_value
@@ -109,13 +109,13 @@
if(!L)
continue
var/firstchar = copytext(L, 1, 2)
var/firstchar = L[1]
if(firstchar == "#")
continue
var/lockthis = firstchar == "@"
if(lockthis)
L = copytext(L, 2)
L = copytext(L, length(firstchar) + 1)
var/pos = findtext(L, " ")
var/entry = null
@@ -123,7 +123,7 @@
if(pos)
entry = lowertext(copytext(L, 1, pos))
value = copytext(L, pos + 1)
value = copytext(L, pos + length(L[pos]))
else
entry = lowertext(L)
@@ -269,7 +269,7 @@
t = trim(t)
if(length(t) == 0)
continue
else if(copytext(t, 1, 2) == "#")
else if(t[1] == "#")
continue
var/pos = findtext(t, " ")
@@ -278,7 +278,7 @@
if(pos)
command = lowertext(copytext(t, 1, pos))
data = copytext(t, pos + 1)
data = copytext(t, pos + length(t[pos]))
else
command = lowertext(t)
+1 -1
View File
@@ -26,7 +26,7 @@ SUBSYSTEM_DEF(nightshift)
/datum/controller/subsystem/nightshift/proc/check_nightshift()
var/emergency = GLOB.security_level >= SEC_LEVEL_RED
var/announcing = TRUE
var/time = STATION_TIME(FALSE)
var/time = STATION_TIME(FALSE, world.time)
var/night_time = (time < nightshift_end_time) || (time > nightshift_start_time)
if(high_security_mode != emergency)
high_security_mode = emergency
+12 -12
View File
@@ -39,34 +39,34 @@ SUBSYSTEM_DEF(pai)
switch(option)
if("name")
t = input("Enter a name for your pAI", "pAI Name", candidate.name) as text
t = reject_bad_name(stripped_input(usr, "Enter a name for your pAI", "pAI Name", candidate.name, MAX_NAME_LEN), TRUE)
if(t)
candidate.name = copytext(sanitize(t),1,MAX_NAME_LEN)
candidate.name = t
if("desc")
t = input("Enter a description for your pAI", "pAI Description", candidate.description) as message
t = stripped_multiline_input(usr, "Enter a description for your pAI", "pAI Description", candidate.description, MAX_MESSAGE_LEN)
if(t)
candidate.description = copytext(sanitize(t),1,MAX_MESSAGE_LEN)
candidate.description = t
if("role")
t = input("Enter a role for your pAI", "pAI Role", candidate.role) as text
t = stripped_input(usr, "Enter a role for your pAI", "pAI Role", candidate.role, MAX_MESSAGE_LEN)
if(t)
candidate.role = copytext(sanitize(t),1,MAX_MESSAGE_LEN)
candidate.role = t
if("ooc")
t = input("Enter any OOC comments", "pAI OOC Comments", candidate.comments) as message
t = stripped_multiline_input(usr, "Enter any OOC comments", "pAI OOC Comments", candidate.comments, MAX_MESSAGE_LEN)
if(t)
candidate.comments = copytext(sanitize(t),1,MAX_MESSAGE_LEN)
candidate.comments = t
if("save")
candidate.savefile_save(usr)
if("load")
candidate.savefile_load(usr)
//In case people have saved unsanitized stuff.
if(candidate.name)
candidate.name = copytext(sanitize(candidate.name),1,MAX_NAME_LEN)
candidate.name = copytext_char(sanitize(candidate.name),1,MAX_NAME_LEN)
if(candidate.description)
candidate.description = copytext(sanitize(candidate.description),1,MAX_MESSAGE_LEN)
candidate.description = copytext_char(sanitize(candidate.description),1,MAX_MESSAGE_LEN)
if(candidate.role)
candidate.role = copytext(sanitize(candidate.role),1,MAX_MESSAGE_LEN)
candidate.role = copytext_char(sanitize(candidate.role),1,MAX_MESSAGE_LEN)
if(candidate.comments)
candidate.comments = copytext(sanitize(candidate.comments),1,MAX_MESSAGE_LEN)
candidate.comments = copytext_char(sanitize(candidate.comments),1,MAX_MESSAGE_LEN)
if("submit")
if(isobserver(usr))
@@ -46,6 +46,6 @@ PROCESSING_SUBSYSTEM_DEF(networks)
var/hex = md5(string)
if(!hex)
return //errored
. = "[copytext(hex, 1, 9)]" //16 ^ 8 possibilities I think.
. = "[copytext_char(hex, 1, 9)]" //16 ^ 8 possibilities I think.
if(interfaces_by_id[.])
return resolve_collisions? make_address("[num2text(rand(HID_RESTRICTED_END, 999999999), 12)]"):null
+1 -1
View File
@@ -11,7 +11,7 @@ SUBSYSTEM_DEF(tgui)
var/basehtml // The HTML base used for all UIs.
/datum/controller/subsystem/tgui/PreInit()
basehtml = file2text('tgui/tgui.html')
basehtml = file2text('tgui-next/packages/tgui/public/tgui-main.html')
/datum/controller/subsystem/tgui/Shutdown()
close_all_uis()
+1 -1
View File
@@ -23,7 +23,7 @@ SUBSYSTEM_DEF(time_track)
var/time_dilation_text
/datum/controller/subsystem/time_track/fire()
stat_time_text = "Server Time: [time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")]\n\nRound Time: [WORLDTIME2TEXT("hh:mm:ss")]\n\nStation Time: [STATION_TIME_TIMESTAMP("hh:mm:ss")]\n\n[time_dilation_text]"
stat_time_text = "Server Time: [time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")]\n\nRound Time: [WORLDTIME2TEXT("hh:mm:ss")]\n\nStation Time: [STATION_TIME_TIMESTAMP("hh:mm:ss", world.time)]\n\n[time_dilation_text]"
if(++last_measurement == measurement_delay)
last_measurement = 0
+1 -1
View File
@@ -153,7 +153,7 @@
to_chat(src, compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode, FALSE, source))
/mob/camera/imaginary_friend/proc/friend_talk(message)
message = capitalize(trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN)))
message = capitalize(trim(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN)))
if(!message)
return
+11 -9
View File
@@ -199,13 +199,16 @@
var/list/new_message = list()
for(var/word in message_split)
var/suffix = copytext(word,-1)
var/suffix = ""
var/suffix_foundon = 0
for(var/potential_suffix in list("." , "," , ";" , "!" , ":" , "?"))
suffix_foundon = findtext(word, potential_suffix, -length(potential_suffix))
if(suffix_foundon)
suffix = potential_suffix
break
// Check if we have a suffix and break it out of the word
if(suffix in list("." , "," , ";" , "!" , ":" , "?"))
word = copytext(word,1,-1)
else
suffix = ""
if(suffix_foundon)
word = copytext(word, 1, suffix_foundon)
word = html_decode(word)
@@ -216,10 +219,9 @@
new_message += pick("uh","erm")
break
else
var/list/charlist = string2charlist(word) // Stupid shit code
var/list/charlist = text2charlist(word)
shuffle_inplace(charlist)
charlist.len = round(charlist.len * 0.5,1)
new_message += html_encode(jointext(charlist,"")) + suffix
new_message += jointext(charlist, "") + suffix
message = jointext(new_message, " ")
+6 -6
View File
@@ -39,12 +39,12 @@
//title_image = ntitle_image
/datum/browser/proc/add_stylesheet(name, file)
stylesheets["[ckey(name)].css"] = file
register_asset("[ckey(name)].css", file)
/datum/browser/proc/add_script(name, file)
scripts["[ckey(name)].js"] = file
register_asset("[ckey(name)].js", file)
if(istype(name, /datum/asset/spritesheet))
var/datum/asset/spritesheet/sheet = name
stylesheets["spritesheet_[sheet.name].css"] = "data/spritesheets/[sheet.name]"
else
stylesheets["[ckey(name)].css"] = file
register_asset("[ckey(name)].css", file)
/datum/browser/proc/set_content(ncontent)
content = ncontent
@@ -1,4 +1,17 @@
/datum/personal_crafting
/datum/component/personal_crafting/Initialize()
if(!ismob(parent))
return COMPONENT_INCOMPATIBLE
RegisterSignal(parent, COMSIG_MOB_CLIENT_LOGIN, .proc/create_mob_button)
/datum/component/personal_crafting/proc/create_mob_button(mob/user, client/CL)
var/datum/hud/H = user.hud_used
var/obj/screen/craft/C = new()
C.icon = H.ui_style
H.static_inventory += C
CL.screen += C
RegisterSignal(C, COMSIG_CLICK, .proc/component_ui_interact)
/datum/component/personal_crafting
var/busy
var/viewing_category = 1 //typical powergamer starting on the Weapons tab
var/viewing_subcategory = 1
@@ -38,9 +51,6 @@
var/display_craftable_only = FALSE
var/display_compact = TRUE
/* This is what procs do:
get_environment - gets a list of things accessable for crafting by user
get_surroundings - takes a list of things and makes a list of key-types to values-amounts of said type in the list
@@ -50,16 +60,15 @@
del_reqs - takes recipe and a user, loops over the recipes reqs var and tries to find everything in the list make by get_environment and delete it/add to parts list, then returns the said list
*/
/datum/personal_crafting/proc/check_contents(datum/crafting_recipe/R, list/contents)
/datum/component/personal_crafting/proc/check_contents(datum/crafting_recipe/R, list/contents)
contents = contents["other"]
main_loop:
for(var/A in R.reqs)
var/needed_amount = R.reqs[A]
for(var/B in contents)
if(ispath(B, A))
if (R.blacklist.Find(B))
continue
if(contents[B] >= R.reqs[A])
continue main_loop
else
@@ -74,7 +83,7 @@
return 0
return 1
/datum/personal_crafting/proc/get_environment(mob/user)
/datum/component/personal_crafting/proc/get_environment(mob/user)
. = list()
for(var/obj/item/I in user.held_items)
. += I
@@ -89,8 +98,10 @@
if(AM.flags_1 & HOLOGRAM_1)
continue
. += AM
for(var/slot in list(SLOT_R_STORE, SLOT_L_STORE))
. += user.get_item_by_slot(slot)
/datum/personal_crafting/proc/get_surroundings(mob/user)
/datum/component/personal_crafting/proc/get_surroundings(mob/user)
. = list()
.["tool_behaviour"] = list()
.["other"] = list()
@@ -111,7 +122,7 @@
.["other"][A.type] += A.volume
.["other"][I.type] += 1
/datum/personal_crafting/proc/check_tools(mob/user, datum/crafting_recipe/R, list/contents)
/datum/component/personal_crafting/proc/check_tools(mob/user, datum/crafting_recipe/R, list/contents)
if(!R.tools.len)
return TRUE
var/list/possible_tools = list()
@@ -142,7 +153,7 @@
return FALSE
return TRUE
/datum/personal_crafting/proc/construct_item(mob/user, datum/crafting_recipe/R)
/datum/component/personal_crafting/proc/construct_item(mob/user, datum/crafting_recipe/R)
var/list/contents = get_surroundings(user)
var/send_feedback = 1
if(check_contents(R, contents))
@@ -156,9 +167,11 @@
var/list/parts = del_reqs(R, user)
var/atom/movable/I = new R.result (get_turf(user.loc))
I.CheckParts(parts, R)
if(isitem(I))
user.put_in_hands(I)
if(send_feedback)
SSblackbox.record_feedback("tally", "object_crafted", 1, I.type)
log_craft("[I] crafted by [user] at [loc_name(I.loc)]")
log_craft("[I] crafted by [user] at [loc_name(I.loc)]")
return 0
return "."
return ", missing tool."
@@ -189,7 +202,7 @@
del_reqs return the list of parts resulting object will receive as argument of CheckParts proc, on the atom level it will add them all to the contents, on all other levels it calls ..() and does whatever is needed afterwards but from contents list already
*/
/datum/personal_crafting/proc/del_reqs(datum/crafting_recipe/R, mob/user)
/datum/component/personal_crafting/proc/del_reqs(datum/crafting_recipe/R, mob/user)
var/list/surroundings
var/list/Deletion = list()
. = list()
@@ -287,15 +300,18 @@
Deletion.Cut(Deletion.len)
qdel(DL)
/datum/component/personal_crafting/proc/component_ui_interact(obj/screen/craft/image, location, control, params, user)
if(user == parent)
ui_interact(user)
/datum/personal_crafting/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.not_incapacitated_turf_state)
/datum/component/personal_crafting/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.not_incapacitated_turf_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
ui = new(user, src, ui_key, "personal_crafting", "Crafting Menu", 700, 800, master_ui, state)
ui.open()
/datum/personal_crafting/ui_data(mob/user)
/datum/component/personal_crafting/ui_data(mob/user)
var/list/data = list()
var/list/subs = list()
var/cur_subcategory = CAT_NONE
@@ -331,21 +347,20 @@
return data
/datum/personal_crafting/ui_act(action, params)
/datum/component/personal_crafting/ui_act(action, params)
if(..())
return
switch(action)
if("make")
var/datum/crafting_recipe/TR = locate(params["recipe"])
var/datum/crafting_recipe/TR = locate(params["recipe"]) in GLOB.crafting_recipes
busy = TRUE
ui_interact(usr) //explicit call to show the busy display
ui_interact(usr)
var/fail_msg = construct_item(usr, TR)
if(!fail_msg)
to_chat(usr, "<span class='notice'>[TR.name] constructed.</span>")
else
to_chat(usr, "<span class='warning'>Construction failed[fail_msg]</span>")
busy = FALSE
ui_interact(usr)
if("forwardCat") //Meow
viewing_category = next_cat(FALSE)
. = TRUE
@@ -365,21 +380,20 @@
display_compact = !display_compact
. = TRUE
//Next works nicely with modular arithmetic
/datum/personal_crafting/proc/next_cat(readonly = TRUE)
/datum/component/personal_crafting/proc/next_cat(readonly = TRUE)
if (!readonly)
viewing_subcategory = 1
. = viewing_category % categories.len + 1
/datum/personal_crafting/proc/next_subcat()
/datum/component/personal_crafting/proc/next_subcat()
if(islist(subcategories[viewing_category]))
var/list/subs = subcategories[viewing_category]
. = viewing_subcategory % subs.len + 1
//Previous can go fuck itself
/datum/personal_crafting/proc/prev_cat(readonly = TRUE)
/datum/component/personal_crafting/proc/prev_cat(readonly = TRUE)
if (!readonly)
viewing_subcategory = 1
if(viewing_category == categories.len)
@@ -389,7 +403,7 @@
if(. <= 0)
. = categories.len
/datum/personal_crafting/proc/prev_subcat()
/datum/component/personal_crafting/proc/prev_subcat()
if(islist(subcategories[viewing_category]))
var/list/subs = subcategories[viewing_category]
if(viewing_subcategory == subs.len)
@@ -402,7 +416,7 @@
. = null
/datum/personal_crafting/proc/build_recipe_data(datum/crafting_recipe/R)
/datum/component/personal_crafting/proc/build_recipe_data(datum/crafting_recipe/R)
var/list/data = list()
data["name"] = R.name
data["ref"] = "[REF(R)]"
@@ -441,3 +455,4 @@
if(!learned_recipes)
learned_recipes = list()
learned_recipes |= R
@@ -0,0 +1,25 @@
/datum/crafting_recipe
var/name = "" //in-game display name
var/list/reqs = list() //type paths of items consumed associated with how many are needed
var/list/blacklist = list() //type paths of items explicitly not allowed as an ingredient
var/result //type path of item resulting from this craft
var/list/tools = list() //type paths of items needed but not consumed
var/time = 30 //time in deciseconds
var/list/parts = list() //type paths of items that will be placed in the result
var/list/chem_catalysts = list() //like tools but for reagents
var/category = CAT_NONE //where it shows up in the crafting UI
var/subcategory = CAT_NONE
var/always_availible = TRUE //Set to FALSE if it needs to be learned first.
/datum/crafting_recipe/New()
if(!(result in reqs))
blacklist += result
/**
* Run custom pre-craft checks for this recipe
*
* user: The /mob that initiated the crafting
* collected_requirements: A list of lists of /obj/item instances that satisfy reqs. Top level list is keyed by requirement path.
*/
/datum/crafting_recipe/proc/check_requirements(mob/user, list/collected_requirements)
return TRUE
@@ -18,6 +18,10 @@
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
/datum/crafting_recipe/strobeshield/New()
..()
blacklist |= subtypesof(/obj/item/shield/riot/)
/datum/crafting_recipe/makeshiftshield
name = "Makeshift Metal Shield"
result = /obj/item/shield/makeshift
@@ -109,6 +113,18 @@
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
/datum/crafting_recipe/switchblade_ms
name = "Switchblade"
result = /obj/item/switchblade/crafted
reqs = list(/obj/item/weaponcrafting/stock = 1,
/obj/item/weaponcrafting/receiver = 1,
/obj/item/kitchen/knife = 1,
/obj/item/stack/cable_coil = 2)
tools = list(TOOL_WELDER)
time = 45
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
//////////////////
///BOMB CRAFTING//
//////////////////
+1 -1
View File
@@ -11,5 +11,5 @@
/datum/component/slippery/proc/Slip(datum/source, atom/movable/AM)
var/mob/victim = AM
if(istype(victim) && !victim.is_flying() && victim.slip(intensity, parent, lube_flags) && callback)
if(istype(victim) && victim.slip(intensity, parent, lube_flags) && callback)
callback.Invoke(victim)
+1 -1
View File
@@ -294,4 +294,4 @@ GLOBAL_LIST_EMPTY(uplinks)
if(!T)
return
explosion(T,1,2,3)
qdel(parent) //Alternatively could brick the uplink.
qdel(parent) //Alternatively could brick the uplink.
+1 -20
View File
@@ -945,26 +945,7 @@
A.create_reagents(amount)
if(A.reagents)
var/chosen_id
switch(alert(usr, "Choose a method.", "Add Reagents", "Search", "Choose from a list", "I'm feeling lucky"))
if("Search")
var/valid_id
while(!valid_id)
chosen_id = input(usr, "Enter the ID of the reagent you want to add.", "Search reagents") as null|text
if(isnull(chosen_id)) //Get me out of here!
break
if(!ispath(text2path(chosen_id)))
chosen_id = pick_closest_path(chosen_id, make_types_fancy(subtypesof(/datum/reagent)))
if(ispath(chosen_id))
valid_id = TRUE
else
valid_id = TRUE
if(!valid_id)
to_chat(usr, "<span class='warning'>A reagent with that ID doesn't exist!</span>")
if("Choose from a list")
chosen_id = input(usr, "Choose a reagent to add.", "Choose a reagent.") as null|anything in subtypesof(/datum/reagent)
if("I'm feeling lucky")
chosen_id = pick(subtypesof(/datum/reagent))
var/chosen_id = choose_reagent_id(usr)
if(chosen_id)
var/amount = input(usr, "Choose the amount to add.", "Choose the amount.", A.reagents.maximum_volume) as num
if(amount)
@@ -22,14 +22,16 @@ Bonus
stealth = -3
resistance = -2
stage_speed = -2
transmittable = -4
transmittable = -2
level = 3
severity = 3
base_message_chance = 15
symptom_delay_min = 10
symptom_delay_max = 30
threshold_desc = "<b>Stage Speed 8:</b> Causes choking more frequently.<br>\
<b>Stealth 4:</b> The symptom remains hidden until active."
threshold_desc = list(
"Stage Speed 8" = "Causes choking more frequently.",
"Stealth 4" = "The symptom remains hidden until active."
)
/datum/symptom/choking/Start(datum/disease/advance/A)
if(!..())
@@ -99,8 +101,10 @@ Bonus
symptom_delay_min = 14
symptom_delay_max = 30
var/paralysis = FALSE
threshold_desc = "<b>Stage Speed 8:</b> Additionally synthesizes pancuronium and sodium thiopental inside the host.<br>\
<b>Transmission 8:</b> Doubles the damage caused by the symptom."
threshold_desc = list(
"Stage Speed 8" = "Additionally synthesizes pancuronium and sodium thiopental inside the host.",
"Transmission 8" = "Doubles the damage caused by the symptom."
)
/datum/symptom/asphyxiation/Start(datum/disease/advance/A)
@@ -29,9 +29,11 @@ Bonus
symptom_delay_min = 10
symptom_delay_max = 30
var/brain_damage = FALSE
threshold_desc = "<b>Resistance 6:</b> Causes brain damage over time.<br>\
<b>Transmission 6:</b> Increases confusion duration.<br>\
<b>Stealth 4:</b> The symptom remains hidden until active."
threshold_desc = list(
"Resistance 6" = "Causes brain damage over time.",
"Transmission 6" = "Increases confusion duration and strength.",
"Stealth 4" = "The symptom remains hidden until active.",
)
/datum/symptom/confusion/Start(datum/disease/advance/A)
if(!..())
@@ -29,12 +29,13 @@ BONUS
symptom_delay_min = 2
symptom_delay_max = 15
var/infective = FALSE
threshold_desc = "<b>Resistance 3:</b> Host will drop small items when coughing.<br>\
<b>Resistance 10:</b> Occasionally causes coughing fits that stun the host.<br>\
<b>Stage Speed 6:</b> Increases cough frequency.<br>\
<b>If Airborne:</b> Coughing will infect bystanders.<br>\
<b>Stealth 4:</b> The symptom remains hidden until active."
threshold_desc = list(
"Resistance 11" = "The host will drop small items when coughing.",
"Resistance 15" = "Occasionally causes coughing fits that stun the host. The extra coughs do not spread the virus.",
"Stage Speed 6" = "Increases cough frequency.",
"Transmission 7" = "Coughing will now infect bystanders up to 2 tiles away.",
"Stealth 4" = "The symptom remains hidden until active.",
)
/datum/symptom/cough/Start(datum/disease/advance/A)
if(!..())
return
@@ -28,8 +28,10 @@ Bonus
base_message_chance = 100
symptom_delay_min = 25
symptom_delay_max = 80
threshold_desc = "<b>Resistance 9:</b> Causes permanent deafness, instead of intermittent.<br>\
<b>Stealth 4:</b> The symptom remains hidden until active."
threshold_desc = list(
"Resistance 9" = "Causes permanent deafness, instead of intermittent.",
"Stealth 4" = "The symptom remains hidden until active.",
)
/datum/symptom/deafness/Start(datum/disease/advance/A)
if(!..())
@@ -27,8 +27,10 @@ Bonus
base_message_chance = 50
symptom_delay_min = 15
symptom_delay_max = 40
threshold_desc = "<b>Transmission 6:</b> Also causes druggy vision.<br>\
<b>Stealth 4:</b> The symptom remains hidden until active."
threshold_desc = list(
"Transmission 6" = "Also causes druggy vision.",
"Stealth 4" = "The symptom remains hidden until active.",
)
/datum/symptom/dizzy/Start(datum/disease/advance/A)
if(!..())
@@ -28,9 +28,10 @@ Bonus
symptom_delay_min = 10
symptom_delay_max = 30
var/unsafe = FALSE //over the heat threshold
threshold_desc = "<b>Resistance 5:</b> Increases fever intensity, fever can overheat and harm the host.<br>\
<b>Resistance 10:</b> Further increases fever intensity."
threshold_desc = list(
"Resistance 5" = "Increases fever intensity, fever can overheat and harm the host.",
"Resistance 10" = "Further increases fever intensity.",
)
/datum/symptom/fever/Start(datum/disease/advance/A)
if(!..())
return
@@ -19,9 +19,9 @@ Bonus
name = "Spontaneous Combustion"
desc = "The virus turns fat into an extremely flammable compound, and raises the body's temperature, making the host burst into flames spontaneously."
stealth = 1
stealth = -1
resistance = -4
stage_speed = -4
stage_speed = -3
transmittable = -4
level = 6
severity = 5
@@ -29,11 +29,12 @@ Bonus
symptom_delay_min = 20
symptom_delay_max = 75
var/infective = FALSE
threshold_desc = "<b>Stage Speed 4:</b> Increases the intensity of the flames.<br>\
<b>Stage Speed 8:</b> Further increases flame intensity.<br>\
<b>Transmission 8:</b> Host will spread the virus through skin flakes when bursting into flame.<br>\
<b>Stealth 4:</b> The symptom remains hidden until active."
threshold_desc = list(
"Stage Speed 4" = "Increases the intensity of the flames.",
"Stage Speed 8" = "Further increases flame intensity.",
"Transmission 8" = "Host will spread the virus through skin flakes when bursting into flame.",
"Stealth 4" = "The symptom remains hidden until active.",
)
/datum/symptom/fire/Start(datum/disease/advance/A)
if(!..())
return
@@ -22,7 +22,7 @@ Bonus
stealth = -3
resistance = -4
stage_speed = 0
transmittable = -4
transmittable = -3
level = 6
severity = 5
base_message_chance = 50
@@ -30,8 +30,11 @@ Bonus
symptom_delay_max = 60
var/bleed = FALSE
var/pain = FALSE
threshold_desc = "<b>Resistance 7:</b> Host will bleed profusely during necrosis.<br>\
<b>Transmission 8:</b> Causes extreme pain to the host, weakening it."
threshold_desc = list(
"Resistance 9" = "Doubles the intensity of the immolation effect, but reduces the frequency of all of this symptom's effects.",
"Stage Speed 8" = "Increases explosion radius and explosion damage to the host when the host is wet.",
"Transmission 8" = "Additionally synthesizes chlorine trifluoride and napalm inside the host. More chemicals are synthesized if the resistance 9 threshold has been met."
)
/datum/symptom/flesh_eating/Start(datum/disease/advance/A)
if(!..())
@@ -96,8 +99,11 @@ Bonus
symptom_delay_max = 6
var/chems = FALSE
var/zombie = FALSE
threshold_desc = "<b>Stage Speed 7:</b> Synthesizes Heparin and Lipolicide inside the host, causing increased bleeding and hunger.<br>\
<b>Stealth 5:</b> The symptom remains hidden until active."
threshold_desc = list(
"Stage Speed 7" = "Synthesizes Heparin and Lipolicide inside the host, causing increased bleeding and hunger.",
"Stealth 5" = "The symptom remains hidden until active.",
)
/datum/symptom/flesh_death/Start(datum/disease/advance/A)
if(!..())
@@ -30,9 +30,12 @@ Bonus
symptom_delay_min = 60
symptom_delay_max = 120
var/no_reset = FALSE
threshold_desc = "<b>Resistance 8:</b> Causes two harmful mutations at once.<br>\
<b>Stage Speed 10:</b> Increases mutation frequency.<br>\
<b>Stealth 5:</b> The mutations persist even if the virus is cured."
threshold_desc = list(
"Resistance 8" = "The negative and mildly negative mutations caused by the virus are mutadone-proof (but will still be undone when the virus is cured if the resistance 14 threshold is not met).",
"Resistance 14" = "The host's genetic alterations are not undone when the virus is cured.",
"Stage Speed 10" = "The virus activates dormant mutations at a much faster rate.",
"Stealth 5" = "Only activates negative mutations in hosts."
)
/datum/symptom/genetic_mutation/Activate(datum/disease/advance/A)
if(!..())
@@ -18,7 +18,7 @@ Bonus
/datum/symptom/hallucigen
name = "Hallucigen"
desc = "The virus stimulates the brain, causing occasional hallucinations."
stealth = -2
stealth = -1
resistance = -3
stage_speed = -3
transmittable = -1
@@ -28,8 +28,10 @@ Bonus
symptom_delay_min = 25
symptom_delay_max = 90
var/fake_healthy = FALSE
threshold_desc = "<b>Stage Speed 7:</b> Increases the amount of hallucinations.<br>\
<b>Stealth 4:</b> The virus mimics positive symptoms.."
threshold_desc = list(
"Stage Speed 7" = "Increases the amount of hallucinations.",
"Stealth 4" = "The virus mimics positive symptoms.",
)
/datum/symptom/hallucigen/Start(datum/disease/advance/A)
if(!..())
@@ -29,9 +29,11 @@ BONUS
base_message_chance = 100
symptom_delay_min = 15
symptom_delay_max = 30
threshold_desc = "<b>Stage Speed 6:</b> Headaches will cause severe pain, that weakens the host.<br>\
<b>Stage Speed 9:</b> Headaches become less frequent but far more intense, preventing any action from the host.<br>\
<b>Stealth 4:</b> Reduces headache frequency until later stages."
threshold_desc = list(
"Stage Speed 6" = "Headaches will cause severe pain, that weakens the host.",
"Stage Speed 9" = "Headaches become less frequent but far more intense, preventing any action from the host.",
"Stealth 4" = "Reduces headache frequency until later stages.",
)
/datum/symptom/headache/Start(datum/disease/advance/A)
if(!..())
+32 -20
View File
@@ -10,9 +10,10 @@
symptom_delay_min = 1
symptom_delay_max = 1
var/passive_message = "" //random message to infected but not actively healing people
threshold_desc = "<b>Stage Speed 6:</b> Doubles healing speed.<br>\
<b>Stealth 4:</b> Healing will no longer be visible to onlookers."
threshold_desc = list(
"Stage Speed 6" = "Doubles healing speed.",
"Stealth 4" = "Healing will no longer be visible to onlookers.",
)
/datum/symptom/heal/Start(datum/disease/advance/A)
if(!..())
return
@@ -54,8 +55,10 @@
level = 6
passive_message = "<span class='notice'>You miss the feeling of starlight on your skin.</span>"
var/nearspace_penalty = 0.3
threshold_desc = "<b>Stage Speed 6:</b> Increases healing speed.<br>\
<b>Transmission 6:</b> Removes penalty for only being close to space."
threshold_desc = list(
"Stage Speed 6" = "Increases healing speed.",
"Transmission 6" = "Removes penalty for only being close to space.",
)
/datum/symptom/heal/starlight/Start(datum/disease/advance/A)
if(!..())
@@ -105,8 +108,10 @@
level = 7
var/food_conversion = FALSE
desc = "The virus rapidly breaks down any foreign chemicals in the bloodstream."
threshold_desc = "<b>Resistance 7:</b> Increases chem removal speed.<br>\
<b>Stage Speed 6:</b> Consumed chemicals nourish the host."
threshold_desc = list(
"Resistance 7" = "Increases chem removal speed.",
"Stage Speed 6" = "Consumed chemicals nourish the host.",
)
/datum/symptom/heal/chem/Start(datum/disease/advance/A)
if(!..())
@@ -139,9 +144,10 @@
var/reduced_hunger = FALSE
desc = "The virus causes the host's metabolism to accelerate rapidly, making them process chemicals twice as fast,\
but also causing increased hunger."
threshold_desc = "<b>Stealth 3:</b> Reduces hunger rate.<br>\
<b>Stage Speed 10:</b> Chemical metabolization is tripled instead of doubled."
threshold_desc = list(
"Stealth 3" = "Reduces hunger rate.",
"Stage Speed 10" = "Chemical metabolization is tripled instead of doubled.",
)
/datum/symptom/heal/metabolism/Start(datum/disease/advance/A)
if(!..())
return
@@ -172,8 +178,9 @@
transmittable = -1
level = 6
passive_message = "<span class='notice'>You feel tingling on your skin as light passes over it.</span>"
threshold_desc = "<b>Stage Speed 8:</b> Doubles healing speed."
threshold_desc = list(
"Stage Speed 8" = "Doubles healing speed.",
)
/datum/symptom/heal/darkness/Start(datum/disease/advance/A)
if(!..())
return
@@ -222,9 +229,11 @@
var/deathgasp = FALSE
var/stabilize = FALSE
var/active_coma = FALSE //to prevent multiple coma procs
threshold_desc = "<b>Stealth 2:</b> Host appears to die when falling into a coma.<br>\
<b>Resistance 4:</b> The virus also stabilizes the host while they are in critical condition.<br>\
<b>Stage Speed 7:</b> Increases healing speed."
threshold_desc = list(
"Stealth 2" = "Host appears to die when falling into a coma.",
"Resistance 4" = "The virus also stabilizes the host while they are in critical condition.",
"Stage Speed 7" = "Increases healing speed.",
)
/datum/symptom/heal/coma/Start(datum/disease/advance/A)
if(!..())
@@ -313,8 +322,10 @@
level = 6
passive_message = "<span class='notice'>Your skin feels oddly dry...</span>"
var/absorption_coeff = 1
threshold_desc = "<b>Resistance 5:</b> Water is consumed at a much slower rate.<br>\
<b>Stage Speed 7:</b> Increases healing speed."
threshold_desc = list(
"Resistance 5" = "Water is consumed at a much slower rate.",
"Stage Speed 7" = "Increases healing speed.",
)
/datum/symptom/heal/water/Start(datum/disease/advance/A)
if(!..())
@@ -369,9 +380,10 @@
level = 8
passive_message = "<span class='notice'>You feel an odd attraction to plasma.</span>"
var/temp_rate = 1
threshold_desc = "<b>Transmission 6:</b> Increases temperature adjustment rate and heals toxin lovers.<br>\
<b>Stage Speed 7:</b> Increases healing speed."
threshold_desc = list(
"Transmission 6" = "Additionally increases temperature adjustment rate and heals those who love toxins",
"Resistance 7" = "Increases healing speed.",
)
/datum/symptom/heal/plasma/Start(datum/disease/advance/A)
if(!..())
return
@@ -29,8 +29,10 @@ BONUS
symptom_delay_min = 5
symptom_delay_max = 25
var/scratch = FALSE
threshold_desc = "<b>Transmission 6:</b> Increases frequency of itching.<br>\
<b>Stage Speed 7:</b> The host will scrath itself when itching, causing superficial damage."
threshold_desc = list(
"Transmission 6" = "Increases frequency of itching.",
"Stage Speed 7" = "The host will scrath itself when itching, causing superficial damage.",
)
/datum/symptom/itching/Start(datum/disease/advance/A)
if(!..())
@@ -10,8 +10,10 @@
symptom_delay_min = 1
symptom_delay_max = 1
var/reverse_boost = FALSE
threshold_desc = "<b>Transmission 5:</b> Increases the virus' growth rate while nanites are present.<br>\
<b>Stage Speed 7:</b> Increases the replication boost."
threshold_desc = list(
"Transmission 5" = "Increases the virus' growth rate while nanites are present.",
"Stage Speed 7" = "Increases the replication boost."
)
/datum/symptom/nano_boost/Start(datum/disease/advance/A)
if(!..())
@@ -42,8 +44,10 @@
symptom_delay_min = 1
symptom_delay_max = 1
var/reverse_boost = FALSE
threshold_desc = "<b>Stage Speed 5:</b> Increases the virus' growth rate while nanites are present.<br>\
<b>Resistance 7:</b> Severely increases the rate at which the nanites are destroyed."
threshold_desc = list(
"Stage Speed 5" = "Increases the virus' growth rate while nanites are present.",
"Resistance 7" = "Severely increases the rate at which the nanites are destroyed."
)
/datum/symptom/nano_destroy/Start(datum/disease/advance/A)
if(!..())
@@ -18,7 +18,7 @@ Bonus
stealth = -1
resistance = -2
stage_speed = -3
transmittable = -4
transmittable = 0
level = 6
symptom_delay_min = 15
symptom_delay_max = 80
@@ -26,8 +26,10 @@ Bonus
var/sleep_level = 0
var/sleepy_ticks = 0
var/stamina = FALSE
threshold_desc = "<b>Transmission 7:</b> Also relaxes the muscles, weakening and slowing the host.<br>\
<b>Resistance 10:</b> Causes narcolepsy more often, increasing the chance of the host falling asleep."
threshold_desc = list(
"Transmission 4" = "Causes the host to periodically emit a yawn that spreads the virus in a manner similar to that of a sneeze.",
"Stage Speed 10" = "Causes narcolepsy more often, increasing the chance of the host falling asleep.",
)
/datum/symptom/narcolepsy/Start(datum/disease/advance/A)
if(!..())
@@ -28,7 +28,9 @@ Bonus
symptom_delay_min = 1
symptom_delay_max = 1
var/regenerate_blood = FALSE
threshold_desc = "<b>Resistance 8:</b>Additionally regenerates lost blood.<br>"
threshold_desc = list(
"Resistance 8" = "Additionally regenerates lost blood."
)
/datum/symptom/oxygen/Start(datum/disease/advance/A)
if(!..())
@@ -11,9 +11,11 @@
var/purge_alcohol = FALSE
var/trauma_heal_mild = FALSE
var/trauma_heal_severe = FALSE
threshold_desc = "<b>Resistance 6:</b> Heals minor brain traumas.<br>\
<b>Resistance 9:</b> Heals severe brain traumas.<br>\
<b>Transmission 8:</b> Purges alcohol in the bloodstream."
threshold_desc = list(
"Resistance 6" = "Heals minor brain traumas.",
"Resistance 9" = "Heals severe brain traumas.",
"Transmission 8" = "Purges alcohol in the bloodstream.",
)
/datum/symptom/mind_restoration/Start(datum/disease/advance/A)
if(!..())
@@ -20,15 +20,17 @@ Bonus
desc = "The virus inhibits the body's thermoregulation, cooling the body down."
stealth = 0
resistance = 2
stage_speed = 2
stage_speed = 3
transmittable = 2
level = 2
severity = 2
symptom_delay_min = 10
symptom_delay_max = 30
var/unsafe = FALSE //over the cold threshold
threshold_desc = "<b>Stage Speed 5:</b> Increases cooling speed; the host can fall below safe temperature levels.<br>\
<b>Stage Speed 10:</b> Further increases cooling speed."
threshold_desc = list(
"Stage Speed 5" = "Increases cooling speed,; the host can fall below safe temperature levels.",
"Stage Speed 10" = "Further increases cooling speed."
)
/datum/symptom/fever/Start(datum/disease/advance/A)
if(!..())
@@ -27,8 +27,10 @@ Bonus
severity = 1
symptom_delay_min = 5
symptom_delay_max = 35
threshold_desc = "<b>Transmission 9:</b> Increases sneezing range, spreading the virus over a larger area.<br>\
<b>Stealth 4:</b> The symptom remains hidden until active."
threshold_desc = list(
"Transmission 9" = "Increases sneezing range, spreading the virus over 6 meter cone instead of over a 4 meter cone.",
"Stealth 4" = "The symptom remains hidden until active.",
)
/datum/symptom/sneeze/Start(datum/disease/advance/A)
if(!..())
@@ -26,7 +26,7 @@ BONUS
//////////////////////////////////////
Viral evolution
Moderate stealth reductopn.
Moderate stealth reduction.
Major decreases to resistance.
increases stage speed.
increase to transmission
@@ -29,9 +29,10 @@ Bonus
symptom_delay_min = 25
symptom_delay_max = 80
var/remove_eyes = FALSE
threshold_desc = "<b>Resistance 12:</b> Weakens extraocular muscles, eventually leading to complete detachment of the eyes.<br>\
<b>Stealth 4:</b> The symptom remains hidden until active."
threshold_desc = list(
"Resistance 12" = "Weakens extraocular muscles, eventually leading to complete detachment of the eyes.",
"Stealth 4" = "The symptom remains hidden until active.",
)
/datum/symptom/visionloss/Start(datum/disease/advance/A)
if(!..())
return
@@ -66,7 +67,7 @@ Bonus
eyes.applyOrganDamage(eyes.maxHealth)
else
M.visible_message("<span class='warning'>[M]'s eyes fall off their sockets!</span>", "<span class='userdanger'>Your eyes fall off their sockets!</span>")
eyes.Remove(M)
eyes.Remove()
eyes.forceMove(get_turf(M))
else
to_chat(M, "<span class='userdanger'>Your eyes burn horrifically!</span>")
@@ -31,9 +31,11 @@ Bonus
var/scramble_language = FALSE
var/datum/language/current_language
var/datum/language_holder/original_language
threshold_desc = "<b>Transmission 14:</b> The host's language center of the brain is damaged, leading to complete inability to speak or understand any language.<br>\
<b>Stage Speed 7:</b> Changes voice more often.<br>\
<b>Stealth 3:</b> The symptom remains hidden until active."
threshold_desc = list(
"Transmission 14" = "The host's language center of the brain is damaged, leading to complete inability to speak or understand any language.",
"Stage Speed 7" = "Changes voice more often.",
"Stealth 3" = "The symptom remains hidden until active."
)
/datum/symptom/voice_change/Start(datum/disease/advance/A)
if(!..())
@@ -25,8 +25,8 @@ Bonus
desc = "The virus causes nausea and irritates the stomach, causing occasional vomit."
stealth = -2
resistance = -1
stage_speed = 0
transmittable = 1
stage_speed = -1
transmittable = 2
level = 3
severity = 3
base_message_chance = 100
@@ -34,9 +34,11 @@ Bonus
symptom_delay_max = 80
var/vomit_blood = FALSE
var/proj_vomit = 0
threshold_desc = "<b>Resistance 7:</b> Host will vomit blood, causing internal damage.<br>\
<b>Transmission 7:</b> Host will projectile vomit, increasing vomiting range.<br>\
<b>Stealth 4:</b> The symptom remains hidden until active."
threshold_desc = list(
"Resistance 7" = "Host will vomit blood, causing internal damage.",
"Transmission 7" = "Host will projectile vomit, increasing vomiting range.",
"Stealth 4" = "The symptom remains hidden until active."
)
/datum/symptom/vomit/Start(datum/disease/advance/A)
if(!..())
@@ -29,7 +29,9 @@ Bonus
base_message_chance = 100
symptom_delay_min = 15
symptom_delay_max = 45
threshold_desc = "<b>Stealth 4:</b> The symptom is less noticeable."
threshold_desc = list(
"Stealth 4" = "The symptom is less noticeable."
)
/datum/symptom/weight_loss/Start(datum/disease/advance/A)
if(!..())
+3 -3
View File
@@ -370,14 +370,14 @@
/////////////////////////// DNA HELPER-PROCS //////////////////////////////
/proc/getleftblocks(input,blocknumber,blocksize)
if(blocknumber > 1)
return copytext(input,1,((blocksize*blocknumber)-(blocksize-1)))
return copytext_char(input,1,((blocksize*blocknumber)-(blocksize-1)))
/proc/getrightblocks(input,blocknumber,blocksize)
if(blocknumber < (length(input)/blocksize))
return copytext(input,blocksize*blocknumber+1,length(input)+1)
return copytext_char(input,blocksize*blocknumber+1,length(input)+1)
/proc/getblock(input, blocknumber, blocksize=DNA_BLOCK_SIZE)
return copytext(input, blocksize*(blocknumber-1)+1, (blocksize*blocknumber)+1)
return copytext_char(input, blocksize*(blocknumber-1)+1, (blocksize*blocknumber)+1)
/proc/setblock(istring, blocknumber, replacement, blocksize=DNA_BLOCK_SIZE)
if(!istring || !blocknumber || !replacement || !blocksize)
+1
View File
@@ -18,6 +18,7 @@
var/list/mob_type_ignore_stat_typecache
var/stat_allowed = CONSCIOUS
var/static/list/emote_list = list()
var/static/regex/stop_bad_mime = regex(@"says|exclaims|yells|asks")
/datum/emote/New()
if(key_third_person)
+3 -3
View File
@@ -43,7 +43,7 @@
for(var/line in testmerge)
var/datum/tgs_revision_information/test_merge/tm = line
var/cm = tm.pull_request_commit
var/details = ": '" + html_encode(tm.title) + "' by " + html_encode(tm.author) + " at commit " + html_encode(copytext(cm, 1, min(length(cm), 11)))
var/details = ": '" + html_encode(tm.title) + "' by " + html_encode(tm.author) + " at commit " + html_encode(copytext_char(cm, 1, 11))
if(details && findtext(details, "\[s\]") && (!usr || !usr.client.holder))
continue
. += "<a href=\"[CONFIG_GET(string/githuburl)]/pull/[tm.number]\">#[tm.number][details]</a><br>"
@@ -57,11 +57,11 @@
// Round ID
if(GLOB.round_id)
msg += "<b>Round ID:</b> [GLOB.round_id]"
msg += "<b>BYOND Version:</b> [world.byond_version].[world.byond_build]"
if(DM_VERSION != world.byond_version || DM_BUILD != world.byond_build)
msg += "<b>Compiled with BYOND Version:</b> [DM_VERSION].[DM_BUILD]"
// Revision information
var/datum/getrev/revdata = GLOB.revdata
msg += "<b>Server revision compiled on:</b> [revdata.date]"
+2 -2
View File
@@ -257,8 +257,8 @@
var/splitpoint = findtext(prepared_line," ")
if(!splitpoint)
continue
var/command = copytext(prepared_line,1,splitpoint)
var/value = copytext(prepared_line,splitpoint+1)
var/command = copytext(prepared_line, 1, splitpoint)
var/value = copytext(prepared_line, splitpoint + length(prepared_line[splitpoint]))
switch(command)
if("DELAY")
var/delay_value = text2num(value)
+1 -1
View File
@@ -31,7 +31,7 @@
reset_streak(D)
streak = streak+element
if(length(streak) > max_streak_length)
streak = copytext(streak,2)
streak = copytext(streak, 1 + length(streak[1]))
return
/datum/martial_art/proc/reset_streak(mob/living/carbon/human/new_target)
+7 -1
View File
@@ -50,6 +50,12 @@
D.forcesay(GLOB.hit_appends)
return 1
/datum/martial_art/boxing/teach(mob/living/carbon/human/H, make_temporary = TRUE)
. = ..()
if(.)
if(H.pulling && ismob(H.pulling))
H.stop_pulling()
/obj/item/clothing/gloves/boxing
var/datum/martial_art/boxing/style = new
@@ -58,7 +64,7 @@
return
if(slot == SLOT_GLOVES)
var/mob/living/carbon/human/H = user
style.teach(H,1)
style.teach(H,TRUE)
return
/obj/item/clothing/gloves/boxing/dropped(mob/user)
+49 -5
View File
@@ -1,8 +1,6 @@
#define SIDE_KICK_COMBO "DH"
#define SHOULDER_FLIP_COMBO "GHDGHH"
#define REPULSE_PUNCH_COMBO "GHGH"
#define FOOT_SMASH_COMBO "HH"
#define DEFT_SWITCH_COMBO "GDD"
/datum/martial_art/the_rising_bass
name = "The Rising Bass"
@@ -10,6 +8,9 @@
dodge_chance = 100
allow_temp_override = FALSE
help_verb = /mob/living/carbon/human/proc/rising_bass_help
var/datum/action/risingbassmove/repulsepunch = new/datum/action/risingbassmove/repulsepunch()
var/datum/action/risingbassmove/deftswitch = new/datum/action/risingbassmove/deftswitch()
var/repulsecool = 0
/datum/martial_art/the_rising_bass/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(findtext(streak,SIDE_KICK_COMBO))
@@ -20,7 +21,7 @@
streak = ""
shoulderFlip(A,D)
return 1
if(findtext(streak,REPULSE_PUNCH_COMBO))
if(findtext(streak,"rplse"))
streak = ""
repulsePunch(A,D)
return 1
@@ -28,13 +29,46 @@
streak = ""
footSmash(A,D)
return 1
if(findtext(streak,DEFT_SWITCH_COMBO))
if(findtext(streak,"deft"))
streak = ""
deftSwitch(A,D)
return 1
return 0
//Repulse Punch - Slams the opponent far away from you.
/datum/action/risingbassmove
name = ""
icon_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = ""
var/movestreak = ""
/datum/action/risingbassmove/Trigger()
if(owner.incapacitated())
to_chat(owner, "<span class='warning'>You can't use [name] while you're incapacitated.</span>")
return
var/mob/living/carbon/human/H = owner
if (H.mind.martial_art.streak == "[movestreak]")
H.mind.martial_art.streak = ""
to_chat(H,"<span class='danger'>You relax your muscles and return to a neutral position.</span>")
else
if(HAS_TRAIT(H, TRAIT_PACIFISM))
to_chat(H, "<span class='warning'>You don't want to harm other people!</span>")
return
to_chat(H,"<span class='danger'>You get ready to use the [name] maneuver!</span>")
H.mind.martial_art.streak = "[movestreak]"
/datum/action/risingbassmove/repulsepunch
name = "Repulse Punch"
button_icon_state = "repulsepunch"
movestreak = "rplse"
/datum/action/risingbassmove/deftswitch
name = "Deft Switch"
button_icon_state = "deftswitch"
movestreak = "deft"
/datum/martial_art/the_rising_bass/proc/sideKick(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(!D.IsKnockdown() || D.lying == 0)
var/turf/H = get_step(D, A.dir & (NORTH | SOUTH) ? pick(EAST, WEST) : pick(NORTH, SOUTH))
@@ -75,7 +109,7 @@
return basic_hit(A,D)
/datum/martial_art/the_rising_bass/proc/repulsePunch(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(!D.IsKnockdown() || !D.lying)
if(!D.IsKnockdown() || !D.lying || repulsecool > world.time)
A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
D.visible_message("<span class='warning'>[A] smashes [D] in the chest, throwing them away!</span>", \
"<span class='userdanger'>[A] smashes you in the chest, repelling you away!</span>")
@@ -85,6 +119,7 @@
D.apply_damage(10, BRUTE, BODY_ZONE_CHEST)
D.Knockdown(90)
log_combat(A, D, "repulse punched (Rising Bass)")
repulsecool = world.time + 3 SECONDS
return 1
return basic_hit(A,D)
@@ -132,6 +167,11 @@
return 1
return ..()
/datum/martial_art/the_rising_bass/add_to_streak(element,mob/living/carbon/human/D)
if (streak == "deft" || streak == "rplse")
return
. = ..()
/mob/living/carbon/human/proc/rising_bass_help()
set name = "Recall Teachings"
set desc = "Remember the martial techniques of the Rising Bass clan."
@@ -149,10 +189,14 @@
. = ..()
if(!.)
return
deftswitch.Grant(H)
repulsepunch.Grant(H)
ADD_TRAIT(H, TRAIT_NOGUNS, RISING_BASS_TRAIT)
ADD_TRAIT(H, TRAIT_AUTO_CATCH_ITEM, RISING_BASS_TRAIT)
/datum/martial_art/the_rising_bass/on_remove(mob/living/carbon/human/H)
. = ..()
deftswitch.Remove(H)
repulsepunch.Remove(H)
REMOVE_TRAIT(H, TRAIT_NOGUNS, RISING_BASS_TRAIT)
REMOVE_TRAIT(H, TRAIT_AUTO_CATCH_ITEM, RISING_BASS_TRAIT)
+2 -2
View File
@@ -139,7 +139,7 @@
SEND_SIGNAL(new_character, COMSIG_MOB_ON_NEW_MIND)
/datum/mind/proc/store_memory(new_text)
if((length(memory) + length(new_text)) <= MAX_MESSAGE_LEN)
if((length_char(memory) + length_char(new_text)) <= MAX_MESSAGE_LEN)
memory += "[new_text]<BR>"
/datum/mind/proc/wipe_memory()
@@ -409,7 +409,7 @@
assigned_role = new_role
else if (href_list["memory_edit"])
var/new_memo = copytext(sanitize(input("Write new memory", "Memory", memory) as null|message),1,MAX_MESSAGE_LEN)
var/new_memo = stripped_multiline_input(usr, "Write new memory", "Memory", memory, MAX_MESSAGE_LEN)
if (isnull(new_memo))
return
memory = new_memo
+2 -2
View File
@@ -32,9 +32,9 @@ GLOBAL_LIST_EMPTY(mutations_list)
/datum/mutation/human/proc/set_se(se_string, on = 1)
if(!se_string || length(se_string) < DNA_STRUC_ENZYMES_BLOCKS * DNA_BLOCK_SIZE)
return
var/before = copytext(se_string, 1, ((dna_block - 1) * DNA_BLOCK_SIZE) + 1)
var/before = copytext_char(se_string, 1, ((dna_block - 1) * DNA_BLOCK_SIZE) + 1)
var/injection = num2hex(on ? rand(lowest_value, (256 * 16) - 1) : rand(0, lowest_value - 1), DNA_BLOCK_SIZE)
var/after = copytext(se_string, (dna_block * DNA_BLOCK_SIZE) + 1, 0)
var/after = copytext_char(se_string, (dna_block * DNA_BLOCK_SIZE) + 1, 0)
return before + injection + after
/datum/mutation/human/proc/set_block(mob/living/carbon/owner, on = 1)
+20
View File
@@ -35,6 +35,26 @@
suffix = "Box/Engine/engine_tesla.dmm"
name = "Box Tesla"
/datum/map_template/ruin/station/box/engine/teg
id = "engine_teg"
suffix = "Box/Engine/engine_tesla.dmm"
name = "Box TEG"
/datum/map_template/ruin/station/box/engine/empty
id = "engine_empty"
suffix = "Box/Engine/engine_tesla.dmm"
name = "Box Empty"
/datum/map_template/ruin/station/box/engine/am
id = "engine_am"
suffix = "Box/Engine/engine_tesla.dmm"
name = "Box Antimatter"
/datum/map_template/ruin/station/box/engine/budget
id = "engine_budget"
suffix = "Box/Engine/engine_tesla.dmm"
name = "Box P.A.C.M.A.N"
// Lavaland
// Mining Base
/datum/map_template/ruin/station/lavaland/mining_base
+6 -2
View File
@@ -18,14 +18,18 @@
for(var/spawner in GLOB.mob_spawners)
var/list/this = list()
this["name"] = spawner
this["desc"] = ""
this["short_desc"] = ""
this["flavor_text"] = ""
this["important_warning"] = ""
this["refs"] = list()
for(var/spawner_obj in GLOB.mob_spawners[spawner])
this["refs"] += "[REF(spawner_obj)]"
if(!this["desc"])
if(istype(spawner_obj, /obj/effect/mob_spawn))
var/obj/effect/mob_spawn/MS = spawner_obj
this["desc"] = MS.flavour_text
this["short_desc"] = MS.short_desc
this["flavor_text"] = MS.flavour_text
this["important_info"] = MS.important_info
else
var/obj/O = spawner_obj
this["desc"] = O.desc
+2 -2
View File
@@ -88,8 +88,8 @@
var/list/entry = list()
entry["parent"] = "[type]"
entry["name"] = verbpath.desc
if (copytext(verbpath.name,1,2) == "@")
entry["command"] = copytext(verbpath.name,2)
if (verbpath.name[1] == "@")
entry["command"] = copytext(verbpath.name, length(verbpath.name[1]) + 1)
else
entry["command"] = replacetext(verbpath.name, " ", "-")
+3 -3
View File
@@ -118,7 +118,7 @@
return TRUE
/datum/wires/proc/is_dud(wire)
return dd_hasprefix(wire, WIRE_DUD_PREFIX)
return findtext(wire, WIRE_DUD_PREFIX)
/datum/wires/proc/is_dud_color(color)
return is_dud(get_wire(color))
@@ -215,8 +215,8 @@
/datum/wires/ui_interact(mob/user, ui_key = "wires", datum/tgui/ui = null, force_open = FALSE, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if (!ui)
ui = new(user, src, ui_key, "wires", "[holder.name] wires", 350, 150 + wires.len * 30, master_ui, state)
if(!ui)
ui = new(user, src, ui_key, "wires", "[holder.name] Wires", 350, 150 + wires.len * 30, master_ui, state)
ui.open()
/datum/wires/ui_data(mob/user)
+12 -4
View File
@@ -505,9 +505,8 @@
return final_rgb
/atom/proc/clean_blood()
if(islist(blood_DNA))
blood_DNA = null
return TRUE
. = blood_DNA? TRUE : FALSE
blood_DNA = null
/atom/proc/wash_cream()
return TRUE
@@ -728,6 +727,13 @@
/atom/proc/multitool_act(mob/living/user, obj/item/I)
return
/atom/proc/multitool_check_buffer(user, obj/item/I, silent = FALSE)
if(!istype(I, /obj/item/multitool))
if(user && !silent)
to_chat(user, "<span class='warning'>[I] has no data buffer!</span>")
return FALSE
return TRUE
/atom/proc/screwdriver_act(mob/living/user, obj/item/I)
SEND_SIGNAL(src, COMSIG_ATOM_SCREWDRIVER_ACT, user, I)
@@ -761,6 +767,8 @@
log_whisper(log_text)
if(LOG_EMOTE)
log_emote(log_text)
if(LOG_SUBTLER)
log_subtler(log_text)
if(LOG_DSAY)
log_dsay(log_text)
if(LOG_PDA)
@@ -863,4 +871,4 @@ Proc for attack log creation, because really why not
return TRUE
/atom/proc/intercept_zImpact(atom/movable/AM, levels = 1)
. |= SEND_SIGNAL(src, COMSIG_ATOM_INTERCEPT_Z_FALL, AM, levels)
. |= SEND_SIGNAL(src, COMSIG_ATOM_INTERCEPT_Z_FALL, AM, levels)
+19 -19
View File
@@ -57,10 +57,8 @@
/obj/item/melee/transforming/energy/sword/bananium
name = "bananium sword"
desc = "An elegant weapon, for a more civilized age."
force = 0
throwforce = 0
force_on = 0
throwforce_on = 0
force_on = 15
throwforce_on = 15
hitsound = null
attack_verb_on = list("slipped")
clumsy_check = FALSE
@@ -69,24 +67,26 @@
heat = 0
light_color = "#ffff00"
var/next_trombone_allowed = 0
var/datum/component/slippery/slipper
/obj/item/melee/transforming/energy/sword/bananium/Initialize()
. = ..()
AddComponent(/datum/component/slippery, 60, GALOSHES_DONT_HELP)
var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
slipper = LoadComponent(/datum/component/slippery, 81, GALOSHES_DONT_HELP)
slipper.signal_enabled = active
/obj/item/melee/transforming/energy/sword/bananium/attack(mob/living/M, mob/living/user)
..()
if(active)
var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
slipper.Slip(M)
slipper.lube_flags |= FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING
slipper.Slip(src, M)
slipper.lube_flags &= ~(FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING)
/obj/item/melee/transforming/energy/sword/bananium/throw_impact(atom/hit_atom, throwingdatum)
. = ..()
if(active)
var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
slipper.Slip(hit_atom)
slipper.lube_flags |= FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING
slipper.Slip(src, hit_atom)
slipper.lube_flags &= ~(FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING)
/obj/item/melee/transforming/energy/sword/bananium/attackby(obj/item/I, mob/living/user, params)
if((world.time > next_trombone_allowed) && istype(I, /obj/item/melee/transforming/energy/sword/bananium))
@@ -98,7 +98,6 @@
/obj/item/melee/transforming/energy/sword/bananium/transform_weapon(mob/living/user, supress_message_text)
..()
var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
slipper.signal_enabled = active
/obj/item/melee/transforming/energy/sword/bananium/ignition_effect(atom/A, mob/user)
@@ -108,8 +107,9 @@
if(!active)
transform_weapon(user, TRUE)
user.visible_message("<span class='suicide'>[user] is [pick("slitting [user.p_their()] stomach open with", "falling on")] [src]! It looks like [user.p_theyre()] trying to commit seppuku, but the blade slips off of [user.p_them()] harmlessly!</span>")
var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
slipper.Slip(user)
slipper.lube_flags |= FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING
slipper.Slip(src, user)
slipper.lube_flags &= ~(FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING)
return SHAME
//BANANIUM SHIELD
@@ -126,16 +126,15 @@
on_force = 0
on_throwforce = 0
on_throw_speed = 1
var/datum/component/slippery/slipper
/obj/item/shield/energy/bananium/Initialize()
. = ..()
AddComponent(/datum/component/slippery, 60, GALOSHES_DONT_HELP)
var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
slipper = LoadComponent(/datum/component/slippery, 81, GALOSHES_DONT_HELP)
slipper.signal_enabled = active
/obj/item/shield/energy/bananium/attack_self(mob/living/carbon/human/user)
..()
var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
slipper.signal_enabled = active
/obj/item/shield/energy/bananium/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback)
@@ -149,8 +148,9 @@
if(active)
var/caught = hit_atom.hitby(src, FALSE, FALSE, throwingdatum=throwingdatum)
if(iscarbon(hit_atom) && !caught)//if they are a carbon and they didn't catch it
var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
slipper.Slip(hit_atom)
slipper.lube_flags |= FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING
slipper.Slip(src, hit_atom)
slipper.lube_flags &= ~(FLYING_DOESNT_HELP|SLIP_WHEN_CRAWLING)
if(thrownby && !caught)
throw_at(thrownby, throw_range+2, throw_speed, null, 1)
else
@@ -212,7 +212,7 @@
M.equip_to_slot_or_del(the_stash, SLOT_WEAR_MASK, TRUE, TRUE, TRUE, TRUE)
/obj/item/clothing/mask/fakemoustache/sticky
var/unstick_time = 600
var/unstick_time = 2 MINUTES
/obj/item/clothing/mask/fakemoustache/sticky/Initialize()
. = ..()

Some files were not shown because too many files have changed in this diff Show More