From daa0fed2986dd06d84bce2280000ec633ad30ab2 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Sat, 2 Sep 2017 23:04:51 -0400 Subject: [PATCH 01/37] we vlambeer now (adds screenshake) --- code/citadel/cit_screenshake.dm | 44 +++++++++++++++++++++++++++++++++ tgstation.dme | 1 + 2 files changed, 45 insertions(+) create mode 100644 code/citadel/cit_screenshake.dm diff --git a/code/citadel/cit_screenshake.dm b/code/citadel/cit_screenshake.dm new file mode 100644 index 0000000000..5bcfac8428 --- /dev/null +++ b/code/citadel/cit_screenshake.dm @@ -0,0 +1,44 @@ +//we vlambeer now + +/obj/item/gun/energy + ..() + recoil = 0.1 + +/obj/item/gun/energy/kinetic_accelerator + ..() + recoil = 0.8 + +/obj/item/gun/ballistic + ..() + recoil = 0.25 + +/obj/item/gun/ballistic/shotgun + ..() + recoil = 1 + +/obj/item/gun/ballistic/revolver + ..() + recoil = 0.5 + +/obj/item/gun/ballistic/revolver/doublebarrel + ..() + recoil = 1 + +/obj/item/gun/syringe + ..() + recoil = 0.1 + +/obj/item/pneumatic_cannon/fire_items(turf/target, mob/user) + . = ..() + shake_camera(user, (pressureSetting * 0.75 + 1), (pressureSetting * 0.75)) + +/obj/item/attack(mob/living/M, mob/living/user) + . = ..() + if(force && force >=11) + shake_camera(user, ((force - 10) * 0.01 + 1), ((force - 10) * 0.01)) + shake_camera(M, ((force - 10) * 0.02 + 1), ((force - 10) * 0.02)) + +/obj/item/attack_obj(obj/O, mob/living/user) + . = ..() + if(force && force >= 20) + shake_camera(user, ((force - 15) * 0.02 + 1), ((force - 15) * 0.02)) diff --git a/tgstation.dme b/tgstation.dme index ee43dcafd7..6ac05e8b52 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -169,6 +169,7 @@ #include "code\citadel\cit_guns.dm" #include "code\citadel\cit_kegs.dm" #include "code\citadel\cit_reagents.dm" +#include "code\citadel\cit_screenshake.dm" #include "code\citadel\cit_spawners.dm" #include "code\citadel\cit_uniforms.dm" #include "code\citadel\cit_vendors.dm" From 10d7b0cf56bcf04ae75523fc0c55f492a77ed3cd Mon Sep 17 00:00:00 2001 From: deathride58 Date: Sat, 2 Sep 2017 23:54:05 -0400 Subject: [PATCH 02/37] Nerfs travis --- tgstation.dme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tgstation.dme b/tgstation.dme index 6ac05e8b52..cf4d73304e 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -169,7 +169,6 @@ #include "code\citadel\cit_guns.dm" #include "code\citadel\cit_kegs.dm" #include "code\citadel\cit_reagents.dm" -#include "code\citadel\cit_screenshake.dm" #include "code\citadel\cit_spawners.dm" #include "code\citadel\cit_uniforms.dm" #include "code\citadel\cit_vendors.dm" @@ -2264,6 +2263,7 @@ #include "code\modules\VR\vr_sleeper.dm" #include "code\modules\zombie\items.dm" #include "code\modules\zombie\organs.dm" +#include "code\citadel\cit_screenshake.dm" #include "interface\interface.dm" #include "interface\menu.dm" #include "interface\stylesheet.dm" From feeb76e472188dac729ad3699948c9e14378a4dc Mon Sep 17 00:00:00 2001 From: deathride58 Date: Sun, 3 Sep 2017 05:24:14 -0400 Subject: [PATCH 03/37] Nerfs KA screenshake, moves cit_screenshake.dm to modular_citadel/, and adds a screenshake pref. --- code/citadel/cit_screenshake.dm | 44 --------------- code/modules/client/preferences.dm | 7 +++ code/modules/client/preferences_savefile.dm | 3 + modular_citadel/README.md | 3 + modular_citadel/cit_screenshake.dm | 62 +++++++++++++++++++++ tgstation.dme | 2 +- 6 files changed, 76 insertions(+), 45 deletions(-) delete mode 100644 code/citadel/cit_screenshake.dm create mode 100644 modular_citadel/README.md create mode 100644 modular_citadel/cit_screenshake.dm diff --git a/code/citadel/cit_screenshake.dm b/code/citadel/cit_screenshake.dm deleted file mode 100644 index 5bcfac8428..0000000000 --- a/code/citadel/cit_screenshake.dm +++ /dev/null @@ -1,44 +0,0 @@ -//we vlambeer now - -/obj/item/gun/energy - ..() - recoil = 0.1 - -/obj/item/gun/energy/kinetic_accelerator - ..() - recoil = 0.8 - -/obj/item/gun/ballistic - ..() - recoil = 0.25 - -/obj/item/gun/ballistic/shotgun - ..() - recoil = 1 - -/obj/item/gun/ballistic/revolver - ..() - recoil = 0.5 - -/obj/item/gun/ballistic/revolver/doublebarrel - ..() - recoil = 1 - -/obj/item/gun/syringe - ..() - recoil = 0.1 - -/obj/item/pneumatic_cannon/fire_items(turf/target, mob/user) - . = ..() - shake_camera(user, (pressureSetting * 0.75 + 1), (pressureSetting * 0.75)) - -/obj/item/attack(mob/living/M, mob/living/user) - . = ..() - if(force && force >=11) - shake_camera(user, ((force - 10) * 0.01 + 1), ((force - 10) * 0.01)) - shake_camera(M, ((force - 10) * 0.02 + 1), ((force - 10) * 0.02)) - -/obj/item/attack_obj(obj/O, mob/living/user) - . = ..() - if(force && force >= 20) - shake_camera(user, ((force - 15) * 0.02 + 1), ((force - 15) * 0.02)) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 1df28192db..bec543b0f6 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -46,6 +46,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/preferred_map = null var/uses_glasses_colour = 0 + + var/screenshake = TRUE //character preferences var/real_name //our character's name @@ -361,8 +363,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Disabled" else dat += "High" + dat += "
" + dat += "Screen shake: [(screenshake) ? "Full" : "None"]
" + dat += "" dat += "

Special Role Settings

" @@ -1486,6 +1491,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["exhibitionist"] = TRUE else features["exhibitionist"] = FALSE + if("screenshake") + screenshake = !screenshake if("publicity") if(unlock_content) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index a04a34cf00..5e1357288d 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -190,6 +190,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["menuoptions"] >> menuoptions //citadel code S["arousable"] >> arousable + S["screenshake"] >> screenshake //try to fix any outdated data if necessary if(needs_update >= 0) @@ -214,6 +215,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car ghost_others = sanitize_inlist(ghost_others, GLOB.ghost_others_options, GHOST_OTHERS_DEFAULT_OPTION) menuoptions = SANITIZE_LIST(menuoptions) be_special = SANITIZE_LIST(be_special) + screenshake = sanitize_integer(screenshake, 0, 1, initial(screenshake)) return 1 @@ -256,6 +258,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["tip_delay"], tip_delay) //citadel code S["arousable"] << arousable + WRITE_FILE(S["screenshake"], screenshake) return 1 diff --git a/modular_citadel/README.md b/modular_citadel/README.md new file mode 100644 index 0000000000..dfae177607 --- /dev/null +++ b/modular_citadel/README.md @@ -0,0 +1,3 @@ +Hooray modularity! +Things that modify core files without directly touching said core files go here. This is similar to how Hippie handles things. +This stops dreammaker from throwing errors and warnings if you try to compile these files while they're inside code/citadel/. diff --git a/modular_citadel/cit_screenshake.dm b/modular_citadel/cit_screenshake.dm new file mode 100644 index 0000000000..64418f2c55 --- /dev/null +++ b/modular_citadel/cit_screenshake.dm @@ -0,0 +1,62 @@ +//we vlambeer now + +/shake_camera(mob/M, duration, strength=1)//byond's wonky with this shit + if(!M || !M.client || duration <= 0) + return + var/client/C = M.client + if(!C.prefs.screenshake)//possible todo: implement a reduced screenshake setting that cuts screenshake to a quarter of its normal amount? this works perfectly for now, though. + return + var/oldx = C.pixel_x + var/oldy = C.pixel_y + var/max = strength*world.icon_size + var/min = -(strength*world.icon_size) + + for(var/i in 0 to duration-1) + if (i == 0) + animate(C, pixel_x=rand(min,max), pixel_y=rand(min,max), time=1) + else + animate(pixel_x=rand(min,max), pixel_y=rand(min,max), time=1) + animate(pixel_x=oldx, pixel_y=oldy, time=1) + +/obj/item/gun/energy + ..() + recoil = 0.1 + +/obj/item/gun/energy/kinetic_accelerator + ..() + recoil = 0.5 + +/obj/item/gun/ballistic + ..() + recoil = 0.25 + +/obj/item/gun/ballistic/shotgun + ..() + recoil = 1 + +/obj/item/gun/ballistic/revolver + ..() + recoil = 0.5 + +/obj/item/gun/ballistic/revolver/doublebarrel + ..() + recoil = 1 + +/obj/item/gun/syringe + ..() + recoil = 0.1 + +/obj/item/pneumatic_cannon/fire_items(turf/target, mob/user) + . = ..() + shake_camera(user, (pressureSetting * 0.75 + 1), (pressureSetting * 0.75)) + +/obj/item/attack(mob/living/M, mob/living/user) + . = ..() + if(force && force >=11) + shake_camera(user, ((force - 10) * 0.01 + 1), ((force - 10) * 0.01)) + shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015)) + +/obj/item/attack_obj(obj/O, mob/living/user) + . = ..() + if(force && force >= 20) + shake_camera(user, ((force - 15) * 0.01 + 1), ((force - 15) * 0.01)) diff --git a/tgstation.dme b/tgstation.dme index cf4d73304e..9cede06a91 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2263,7 +2263,7 @@ #include "code\modules\VR\vr_sleeper.dm" #include "code\modules\zombie\items.dm" #include "code\modules\zombie\organs.dm" -#include "code\citadel\cit_screenshake.dm" +#include "modular_citadel\cit_screenshake.dm" #include "interface\interface.dm" #include "interface\menu.dm" #include "interface\stylesheet.dm" From f2963840bc28cea1cb4aeb105db4cf2ea7bf73d8 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Sun, 3 Sep 2017 13:15:44 -0400 Subject: [PATCH 04/37] Coding at 5 am is a horrible idea --- modular_citadel/cit_screenshake.dm | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modular_citadel/cit_screenshake.dm b/modular_citadel/cit_screenshake.dm index 64418f2c55..fab9b5a795 100644 --- a/modular_citadel/cit_screenshake.dm +++ b/modular_citadel/cit_screenshake.dm @@ -1,11 +1,14 @@ //we vlambeer now -/shake_camera(mob/M, duration, strength=1)//byond's wonky with this shit +/proc/shake_camera(mob/M, duration, strength=1)//byond's wonky with this shit if(!M || !M.client || duration <= 0) return var/client/C = M.client - if(!C.prefs.screenshake)//possible todo: implement a reduced screenshake setting that cuts screenshake to a quarter of its normal amount? this works perfectly for now, though. - return + switch(C.prefs.screenshake) + if(0)//possible todo: implement a reduced screenshake setting that cuts screenshake to a quarter of its normal amount? this works perfectly for now, though. + return + if(2) + duration = duration*0.25 var/oldx = C.pixel_x var/oldy = C.pixel_y var/max = strength*world.icon_size From 5a618ed54830492a393c66ad8afbe9ff250afb0e Mon Sep 17 00:00:00 2001 From: deathride58 Date: Sun, 3 Sep 2017 13:22:50 -0400 Subject: [PATCH 05/37] adds reduced option for screenshake --- code/modules/client/preferences.dm | 14 +++++++++++--- code/modules/client/preferences_savefile.dm | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index bec543b0f6..8002ce0ab4 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -47,7 +47,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/uses_glasses_colour = 0 - var/screenshake = TRUE + var/screenshake = 1 //character preferences var/real_name //our character's name @@ -366,7 +366,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "
" - dat += "Screen shake: [(screenshake) ? "Full" : "None"]
" + dat += "Screen shake: [(screenshake) ? "Full" : [(!screenshake) ? "None" : "Reduced"]]
" dat += "" @@ -1492,7 +1492,15 @@ GLOBAL_LIST_EMPTY(preferences_datums) else features["exhibitionist"] = FALSE if("screenshake") - screenshake = !screenshake + switch(screenshake) + if(0) + screenshake = 1 + if(1) + screenshake = 2 + if(2) + screenshake = 0 + else + screenshake = 1 if("publicity") if(unlock_content) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 5e1357288d..c2bd9d5f7c 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -215,7 +215,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car ghost_others = sanitize_inlist(ghost_others, GLOB.ghost_others_options, GHOST_OTHERS_DEFAULT_OPTION) menuoptions = SANITIZE_LIST(menuoptions) be_special = SANITIZE_LIST(be_special) - screenshake = sanitize_integer(screenshake, 0, 1, initial(screenshake)) + screenshake = sanitize_integer(screenshake, 0, 2, initial(screenshake)) return 1 From f606b77f63aa79759278d73cd8a6c41ea88a2167 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Sun, 3 Sep 2017 13:23:58 -0400 Subject: [PATCH 06/37] coding at 1 PM is a bad idea --- modular_citadel/cit_screenshake.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/cit_screenshake.dm b/modular_citadel/cit_screenshake.dm index fab9b5a795..07f29be004 100644 --- a/modular_citadel/cit_screenshake.dm +++ b/modular_citadel/cit_screenshake.dm @@ -1,6 +1,6 @@ //we vlambeer now -/proc/shake_camera(mob/M, duration, strength=1)//byond's wonky with this shit +/shake_camera(mob/M, duration, strength=1)//byond's wonky with this shit if(!M || !M.client || duration <= 0) return var/client/C = M.client From 72de6c3968abb2ce0cee3ff99afceac577fd20af Mon Sep 17 00:00:00 2001 From: deathride58 Date: Sun, 3 Sep 2017 17:20:58 -0400 Subject: [PATCH 07/37] Nested ternaries? --- code/modules/client/preferences.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 8002ce0ab4..92da0331dd 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -366,7 +366,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "
" - dat += "Screen shake: [(screenshake) ? "Full" : [(!screenshake) ? "None" : "Reduced"]]
" + dat += "Screen shake: [(screenshake) ? "Full" : ((!screenshake) ? "None" : "Reduced")]
" dat += "" From a8328aad8e1a313c69ca980fd487c685109771a6 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Sun, 3 Sep 2017 18:34:16 -0400 Subject: [PATCH 08/37] Overcomplicates things --- code/modules/client/preferences.dm | 15 ++++++++++++++- code/modules/client/preferences_savefile.dm | 3 +++ modular_citadel/cit_screenshake.dm | 20 +++++++++++--------- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 92da0331dd..e94203121b 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -48,6 +48,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/uses_glasses_colour = 0 var/screenshake = 1 + var/damagescreenshake = 2 //character preferences var/real_name //our character's name @@ -366,7 +367,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "
" - dat += "Screen shake: [(screenshake) ? "Full" : ((!screenshake) ? "None" : "Reduced")]
" + dat += "Screen Shake: [(screenshake==1) ? "Full" : ((screenshake==0) ? "None" : "Reduced")]
" + + dat += "Damage Screen Shake: [(damagescreenshake==1) ? "On" : ((damagescreenshake==0) ? "Off" : "Only when down")]
" dat += "" @@ -1501,6 +1504,16 @@ GLOBAL_LIST_EMPTY(preferences_datums) screenshake = 0 else screenshake = 1 + if("damagescreenshake") + switch(damagescreenshake) + if(0) + damagescreenshake = 1 + if(1) + damagescreenshake = 2 + if(2) + damagescreenshake = 0 + else + damagescreenshake = 1 if("publicity") if(unlock_content) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index c2bd9d5f7c..80b603ff58 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -191,6 +191,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //citadel code S["arousable"] >> arousable S["screenshake"] >> screenshake + S["damagescreenshake"] >> damagescreenshake //try to fix any outdated data if necessary if(needs_update >= 0) @@ -216,6 +217,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car menuoptions = SANITIZE_LIST(menuoptions) be_special = SANITIZE_LIST(be_special) screenshake = sanitize_integer(screenshake, 0, 2, initial(screenshake)) + damagescreenshake = sanitize_integer(damagescreenshake, 0, 2, initial(damagescreenshake)) return 1 @@ -259,6 +261,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //citadel code S["arousable"] << arousable WRITE_FILE(S["screenshake"], screenshake) + WRITE_FILE(S["damagescreenshake"], damagescreenshake) return 1 diff --git a/modular_citadel/cit_screenshake.dm b/modular_citadel/cit_screenshake.dm index 07f29be004..bfaaf61028 100644 --- a/modular_citadel/cit_screenshake.dm +++ b/modular_citadel/cit_screenshake.dm @@ -1,18 +1,15 @@ //we vlambeer now -/shake_camera(mob/M, duration, strength=1)//byond's wonky with this shit +/obj/proc/shake_camera(mob/M, duration, strength=1)//byond's wonky with this shit if(!M || !M.client || duration <= 0) return var/client/C = M.client - switch(C.prefs.screenshake) - if(0)//possible todo: implement a reduced screenshake setting that cuts screenshake to a quarter of its normal amount? this works perfectly for now, though. - return - if(2) - duration = duration*0.25 + if (C.prefs.screenshake==0) + return var/oldx = C.pixel_x var/oldy = C.pixel_y - var/max = strength*world.icon_size - var/min = -(strength*world.icon_size) + var/max = ((C.prefs.screenshake==1) ? strength : strength*0.25) *world.icon_size + var/min = -(((C.prefs.screenshake==1) ? strength : strength*0.25)*world.icon_size) for(var/i in 0 to duration-1) if (i == 0) @@ -57,7 +54,12 @@ . = ..() if(force && force >=11) shake_camera(user, ((force - 10) * 0.01 + 1), ((force - 10) * 0.01)) - shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015)) + if(M.client.prefs) + switch (M.client.prefs.damagescreenshake) + if (1) + shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015)) + if (2)//setting is "only when down." check for knockdown status before applying this. + shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015)) /obj/item/attack_obj(obj/O, mob/living/user) . = ..() From 91e5dbe0f380c947fa31652c9e669139d1de27c9 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Sun, 3 Sep 2017 18:54:25 -0400 Subject: [PATCH 09/37] "only when down" should now work --- modular_citadel/cit_screenshake.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modular_citadel/cit_screenshake.dm b/modular_citadel/cit_screenshake.dm index bfaaf61028..e4e3c81078 100644 --- a/modular_citadel/cit_screenshake.dm +++ b/modular_citadel/cit_screenshake.dm @@ -52,14 +52,15 @@ /obj/item/attack(mob/living/M, mob/living/user) . = ..() - if(force && force >=11) + if(force && force >=15) shake_camera(user, ((force - 10) * 0.01 + 1), ((force - 10) * 0.01)) if(M.client.prefs) switch (M.client.prefs.damagescreenshake) if (1) shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015)) - if (2)//setting is "only when down." check for knockdown status before applying this. - shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015)) + if (2) + if (M.IsKnockdown) + shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015)) /obj/item/attack_obj(obj/O, mob/living/user) . = ..() From ba52824b3a04c10ab78f483a18356bb7587efd3d Mon Sep 17 00:00:00 2001 From: deathride58 Date: Sun, 3 Sep 2017 19:06:26 -0400 Subject: [PATCH 10/37] Coding at 6 PM is a bad idea --- modular_citadel/cit_screenshake.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/cit_screenshake.dm b/modular_citadel/cit_screenshake.dm index e4e3c81078..4345a7115c 100644 --- a/modular_citadel/cit_screenshake.dm +++ b/modular_citadel/cit_screenshake.dm @@ -59,7 +59,7 @@ if (1) shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015)) if (2) - if (M.IsKnockdown) + if (M.IsKnockdown()) shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015)) /obj/item/attack_obj(obj/O, mob/living/user) From a9e1b583a40cb0d279fe873f4bb853671aec10bf Mon Sep 17 00:00:00 2001 From: deathride58 Date: Sun, 3 Sep 2017 19:27:57 -0400 Subject: [PATCH 11/37] (hopefully) fixes runtimes --- modular_citadel/cit_screenshake.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_citadel/cit_screenshake.dm b/modular_citadel/cit_screenshake.dm index 4345a7115c..8bdc4003ab 100644 --- a/modular_citadel/cit_screenshake.dm +++ b/modular_citadel/cit_screenshake.dm @@ -54,7 +54,7 @@ . = ..() if(force && force >=15) shake_camera(user, ((force - 10) * 0.01 + 1), ((force - 10) * 0.01)) - if(M.client.prefs) + if(M.client) switch (M.client.prefs.damagescreenshake) if (1) shake_camera(M, ((force - 10) * 0.015 + 1), ((force - 10) * 0.015)) From bfc9aba71011a25679689b57100d899150f301c9 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Sun, 3 Sep 2017 20:12:23 -0400 Subject: [PATCH 12/37] damage screen shake will no longer show when screen shake is disabled --- code/modules/client/preferences.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index e94203121b..f8909b8f4a 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -369,7 +369,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Screen Shake: [(screenshake==1) ? "Full" : ((screenshake==0) ? "None" : "Reduced")]
" - dat += "Damage Screen Shake: [(damagescreenshake==1) ? "On" : ((damagescreenshake==0) ? "Off" : "Only when down")]
" + if (!user.client.prefs.screenshake==0) + dat += "Damage Screen Shake: [(damagescreenshake==1) ? "On" : ((damagescreenshake==0) ? "Off" : "Only when down")]
" dat += "" From ba9b5a0481b3ed4cbaa3b999244ac2d869e978d6 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Sat, 23 Sep 2017 00:58:32 -0500 Subject: [PATCH 13/37] probably stops Ashligger station attacks --- code/modules/mining/mine_items.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 15d05d37fe..7b17de3fd6 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -73,6 +73,9 @@ to_chat(user, "You get a feeling that leaving the station might be a REALLY dumb idea...") dumb_rev_heads += user.mind return + if(user.faction == "ashwalker") + to_chat(user,"The unfamiliar light board makes no sense to your primitive mind. You cannot figure out the controls.") + return ..() /**********************Mining car (Crate like thing, not the rail car)**************************/ From 05bbc437822604de36ae4fa45119366258eb5584 Mon Sep 17 00:00:00 2001 From: Michiyamenotehifunana <31995558+Michiyamenotehifunana@users.noreply.github.com> Date: Sat, 23 Sep 2017 15:05:11 +0800 Subject: [PATCH 14/37] Wave 2 of guns Spinfusor, X9, Magpistol. --- code/citadel/cit_guns.dm | 280 +++++++++++++++++++++++++++++++++++- icons/obj/guns/cit_guns.dmi | Bin 2368 -> 11194 bytes sound/weapons/magpistol.ogg | Bin 0 -> 20376 bytes 3 files changed, 279 insertions(+), 1 deletion(-) create mode 100644 sound/weapons/magpistol.ogg diff --git a/code/citadel/cit_guns.dm b/code/citadel/cit_guns.dm index ec1caacdab..efab785d12 100644 --- a/code/citadel/cit_guns.dm +++ b/code/citadel/cit_guns.dm @@ -28,6 +28,8 @@ build_path = /obj/item/gun/energy/laser/carbine/nopin category = list("Weapons") +////////////Anti Tank Pistol//////////// + /obj/item/gun/ballistic/automatic/pistol/antitank name = "Anti Tank Pistol" desc = "A massively impractical and silly monstrosity of a pistol that fires .50 calliber rounds. The recoil is likely to dislocate your wrist." @@ -45,7 +47,6 @@ fire_sound = 'sound/weapons/blastcannon.ogg' spread = 30 //damn thing has no rifling. - /obj/item/gun/ballistic/automatic/pistol/antitank/update_icon() ..() if(magazine) @@ -61,3 +62,280 @@ pin = /obj/item/device/firing_pin/implant/pindicate origin_tech = "combat=7;syndicate=6" +/////////////spinfusor stuff//////////////// + +/obj/item/projectile/bullet/spinfusor + name ="spinfusor disk" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state= "spinner" + damage = 30 + dismemberment = 25 + +/obj/item/projectile/bullet/spinfusor/on_hit(atom/target, blocked = FALSE) //explosion to emulate the spinfusor's AOE + ..() + explosion(target, -1, -1, 2, 0, -1) + return 1 + +/obj/item/ammo_casing/caseless/spinfusor + name = "spinfusor disk" + desc = "A magnetic disk designed specifically for the Stormhammer magnetic cannon. Warning: extremely volatile!" + projectile_type = /obj/item/projectile/bullet/spinfusor + caliber = "spinfusor" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "disk" + throwforce = 15 //still deadly when thrown + throw_speed = 3 + +/obj/item/ammo_casing/caseless/spinfusor/throw_impact(atom/target) //disks detonate when thrown + if(!..()) // not caught in mid-air + visible_message("[src] detonates!") + playsound(src.loc, "sparks", 50, 1) + explosion(target, -1, -1, 1, 1, -1) + qdel(src) + return 1 + +/obj/item/ammo_box/magazine/internal/spinfusor + name = "spinfusor internal magazine" + ammo_type = /obj/item/ammo_casing/caseless/spinfusor + caliber = "spinfusor" + max_ammo = 1 + +/obj/item/gun/ballistic/automatic/spinfusor + name = "Stormhammer Magnetic Cannon" + desc = "An innovative weapon utilizing mag-lev technology to spin up a magnetic fusor and launch it at extreme velocities." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "spinfusor" + item_state = "spinfusor" + mag_type = /obj/item/ammo_box/magazine/internal/spinfusor + fire_sound = 'sound/weapons/rocketlaunch.ogg' + w_class = WEIGHT_CLASS_BULKY + can_suppress = 0 + burst_size = 1 + fire_delay = 20 + select = 0 + actions_types = list() + casing_ejector = 0 + origin_tech = "combat=6;magnets=6" + +/obj/item/gun/ballistic/automatic/spinfusor/attackby(obj/item/A, mob/user, params) + var/num_loaded = magazine.attackby(A, user, params, 1) + if(num_loaded) + to_chat(user, "You load [num_loaded] disk\s into \the [src].") + update_icon() + chamber_round() + +/obj/item/gun/ballistic/automatic/spinfusor/attack_self(mob/living/user) + return //caseless rounds are too glitchy to unload properly. Best to make it so that you cannot remove disks from the spinfusor + +/obj/item/gun/ballistic/automatic/spinfusor/update_icon() + ..() + icon_state = "spinfusor[magazine ? "-[get_ammo(1)]" : ""]" + +/obj/item/ammo_box/aspinfusor + name = "ammo box (spinfusor disks)" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "spinfusorbox" + ammo_type = /obj/item/ammo_casing/caseless/spinfusor + max_ammo = 8 + +/datum/supply_pack/security/armory/spinfusor + name = "Stormhammer Spinfusor Crate" + cost = 7000 + contains = list(/obj/item/gun/ballistic/automatic/spinfusor, + /obj/item/gun/ballistic/automatic/spinfusor) + crate_name = "spinfusor crate" + +/datum/supply_pack/security/armory/spinfusorammo + name = "Spinfusor Disk Crate" + cost = 4000 + contains = list(/obj/item/ammo_box/aspinfusor, + /obj/item/ammo_box/aspinfusor, + /obj/item/ammo_box/aspinfusor, + /obj/item/ammo_box/aspinfusor) + crate_name = "spinfusor disk crate" + +///////XCOM X9 AR/////// + +/obj/item/gun/ballistic/automatic/x9 //will be adminspawn only so ERT or something can use them + name = "\improper X9 Assault Rifle" + desc = "A rather old design of a cheap, reliable assault rifle made for combat against unknown enemies. Uses 5.56mm ammo." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "x9" + item_state = "arg" + slot_flags = 0 + origin_tech = "combat=7;engineering=7" + mag_type = /obj/item/ammo_box/magazine/m556 //Uses the m90gl's magazine, just like the NT-ARG + fire_sound = 'sound/weapons/gunshot_smg.ogg' + can_suppress = 0 + burst_size = 6 //in line with XCOMEU stats. This can fire 5 bursts from a full magazine. + fire_delay = 1 + spread = 30 //should be 40 for XCOM memes, but since its adminspawn only, might as well make it useable + recoil = 1 + +////////XCOM2 Magpistol///////// + +//////projectiles////// + +/obj/item/projectile/bullet/mags + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magjectile" + damage = 25 + armour_penetration = 10 + light_range = 2 + light_color = LIGHT_COLOR_RED + +/obj/item/projectile/bullet/nlmags //non-lethal boolets + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magjectile-nl" + damage = 2 + knockdown = 15 + stamina = 50 + armour_penetration = -10 + light_range = 2 + light_color = LIGHT_COLOR_BLUE + + +/////actual ammo///// + +/obj/item/ammo_casing/caseless/amags + desc = "A ferromagnetic slug intended to be launched out of a compatible weapon." + caliber = "mags" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "mag-casing-live" + projectile_type = /obj/item/projectile/bullet/mags + +/obj/item/ammo_casing/caseless/anlmags + desc = "A specialized ferromagnetic slug designed with a less-than-lethal payload." + caliber = "mags" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "mag-casing-live" + projectile_type = /obj/item/projectile/bullet/nlmags + +//////magazines///// + +/obj/item/ammo_box/magazine/mmags + name = "magpistol magazine (non-lethal disabler)" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "nlmagmag" + origin_tech = "magnets=5" + ammo_type = /obj/item/ammo_casing/caseless/anlmags + caliber = "mags" + max_ammo = 7 + multiple_sprites = 2 + +/obj/item/ammo_box/magazine/mmags/lethal + name = "magpistol magazine (lethal)" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "smallmagmag" + origin_tech = "combat=5" + ammo_type = /obj/item/ammo_casing/caseless/amags + +//////the gun itself////// + +/obj/item/gun/ballistic/automatic/pistol/mag + name = "magpistol" + desc = "A handgun utilizing maglev technologies to propel a ferromagnetic slug to extreme velocities." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magpistol" + force = 10 + fire_sound = 'sound/weapons/magpistol.ogg' + mag_type = /obj/item/ammo_box/magazine/mmags + can_suppress = 0 + casing_ejector = 0 + fire_delay = 5 + origin_tech = "combat=4;magnets=4" + +/obj/item/gun/ballistic/automatic/pistol/mag/update_icon() + ..() + if(magazine) + cut_overlays() + add_overlay("magpistol-magazine") + else + cut_overlays() + icon_state = "[initial(icon_state)][chambered ? "" : "-e"]" + +///research memes/// + +/obj/item/gun/ballistic/automatic/pistol/mag/nopin + pin = null + +/datum/design/magpistol + name = "Magpistol" + desc = "A weapon which fires ferromagnetic slugs." + id = "magpisol" + req_tech = list("combat" = 5, "magnets" = 6, "powerstorage" = 5) + build_type = PROTOLATHE + materials = list(MAT_METAL = 7500, MAT_GLASS = 1000, MAT_URANIUM = 1000, MAT_TITANIUM = 5000, MAT_SILVER = 2000) + build_path = /obj/item/gun/ballistic/automatic/pistol/mag/nopin + category = list("Weapons") + +/datum/design/mag_magpistol + name = "Magpistol Magazine" + desc = "A 7 round magazine for the Magpistol." + id = "mag_magpistol" + req_tech = list("combat" = 5, "magnets" = 6, "materials" = 5, "syndicate" = 3) + build_type = PROTOLATHE + materials = list(MAT_METAL = 4000, MAT_SILVER = 500) + build_path = /obj/item/ammo_box/magazine/mmags/lethal + category = list("Ammo") + +/datum/design/mag_magpistol/nl + name = "Magpistol Magazine (Non-Lethal)" + desc = "A 7 round non-lethal magazine for the Magpistol." + id = "mag_magpistol_nl" + req_tech = list("combat" = 5, "magnets" = 6, "materials" = 5) + materials = list(MAT_METAL = 3000, MAT_SILVER = 250, MAT_TITANIUM = 250) + build_path = /obj/item/ammo_box/magazine/mmags + +//////toy memes///// + +/obj/item/projectile/bullet/reusable/foam_dart/mag + name = "magfoam dart" + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "magjectile-toy" + ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag + light_range = 2 + light_color = LIGHT_COLOR_YELLOW + +/obj/item/ammo_casing/caseless/foam_dart/mag + name = "magfoam dart" + desc = "A foam dart with fun light-up projectiles powered by magnets!" + projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/mag + +/obj/item/ammo_box/magazine/internal/shot/toy/mag + ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag + max_ammo = 7 + +/obj/item/gun/ballistic/shotgun/toy/mag + name = "foam force magpistol" + desc = "A fancy toy sold alongside light-up foam force darts. Ages 8 and up." + icon = 'icons/obj/guns/cit_guns.dmi' + icon_state = "toymag" + item_state = "gun" + mag_type = /obj/item/ammo_box/magazine/internal/shot/toy/mag + fire_sound = 'sound/weapons/magpistol.ogg' + slot_flags = SLOT_BELT + w_class = WEIGHT_CLASS_SMALL + +/obj/item/ammo_box/foambox/mag + name = "ammo box (Magnetic Foam Darts)" + icon = 'icons/obj/guns/toy.dmi' + icon_state = "foambox" + ammo_type = /obj/item/ammo_casing/caseless/foam_dart/mag + max_ammo = 42 + +/datum/design/magfoam_dart + name = "Box of MagFoam Darts" + id = "magfoam_dart" + build_type = AUTOLATHE + materials = list(MAT_METAL = 300, MAT_GLASS = 200) + build_path = /obj/item/ammo_box/foambox/mag + category = list("initial", "Misc") + +/datum/design/foam_magpistol + name = "Foam Force Magpistol" + id = "magfoam_launcher" + build_type = AUTOLATHE + materials = list(MAT_METAL = 7500, MAT_GLASS = 1000) + build_path = /obj/item/gun/ballistic/shotgun/toy/mag + category = list("hacked", "Misc") diff --git a/icons/obj/guns/cit_guns.dmi b/icons/obj/guns/cit_guns.dmi index b5a2ae8fdcf5230bdeedaf88f6cd9f2ef1621ea3..2db84677d2ed3c067a2768f462592125a7624a24 100644 GIT binary patch literal 11194 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 literal 2368 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 Date: Sat, 23 Sep 2017 02:11:55 -0500 Subject: [PATCH 15/37] faction memes don't work, restrict access instead. --- code/modules/mining/mine_items.dm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 7b17de3fd6..38381ae9c5 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -67,15 +67,13 @@ possible_destinations = "mining_home;mining_away;landing_zone_dock;mining_public" no_destination_swap = 1 var/global/list/dumb_rev_heads = list() + req_access = list(ACCESS_MINING) // should slow the ashwalkers down. /obj/machinery/computer/shuttle/mining/attack_hand(mob/user) if((user.z in GLOB.station_z_levels) && user.mind && (user.mind in SSticker.mode.head_revolutionaries) && !(user.mind in dumb_rev_heads)) to_chat(user, "You get a feeling that leaving the station might be a REALLY dumb idea...") dumb_rev_heads += user.mind return - if(user.faction == "ashwalker") - to_chat(user,"The unfamiliar light board makes no sense to your primitive mind. You cannot figure out the controls.") - return ..() /**********************Mining car (Crate like thing, not the rail car)**************************/ From 28e9bc7d8cc8e0bb4de61c97e6db30c7cba0ab33 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Sat, 23 Sep 2017 02:18:02 -0500 Subject: [PATCH 16/37] added a IC clause to make enforcement easier. --- code/game/objects/structures/ghost_role_spawners.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index 08ff56a8a0..5ff2d93c6e 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -44,7 +44,8 @@ anchored = FALSE density = FALSE flavour_text = "You are an ash walker. Your tribe worships the Necropolis. The wastes are sacred ground, its monsters a blessed bounty. \ - You have seen lights in the distance... they foreshadow the arrival of outsiders that seek to tear apart the Necropolis and its domain. Fresh sacrifices for your nest." + You have seen lights in the distance... they foreshadow the arrival of outsiders that seek to tear apart the Necropolis and its domain. Fresh sacrifices for your nest. \ + You do not know how their magic works, nor where they come from, or the significance of their items." assignedrole = "Ash Walker" /obj/effect/mob_spawn/human/ash_walker/special(mob/living/new_spawn) From 391c82e68db14fa6e7ef24f21336a41b552567b4 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Sat, 23 Sep 2017 02:23:32 -0500 Subject: [PATCH 17/37] Update ghost_role_spawners.dm --- code/game/objects/structures/ghost_role_spawners.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index 5ff2d93c6e..5f9c2dd724 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -45,7 +45,7 @@ density = FALSE flavour_text = "You are an ash walker. Your tribe worships the Necropolis. The wastes are sacred ground, its monsters a blessed bounty. \ You have seen lights in the distance... they foreshadow the arrival of outsiders that seek to tear apart the Necropolis and its domain. Fresh sacrifices for your nest. \ - You do not know how their magic works, nor where they come from, or the significance of their items." + You do not know how their magic works, nor where they come from, or the significance of their items." assignedrole = "Ash Walker" /obj/effect/mob_spawn/human/ash_walker/special(mob/living/new_spawn) From 08d4b2084e7129234b1f2aef3f5014ec999c2d78 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Sat, 23 Sep 2017 02:32:44 -0500 Subject: [PATCH 18/37] Update ghost_role_spawners.dm --- code/game/objects/structures/ghost_role_spawners.dm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index 5f9c2dd724..3bc5c2e762 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -43,9 +43,7 @@ death = FALSE anchored = FALSE density = FALSE - flavour_text = "You are an ash walker. Your tribe worships the Necropolis. The wastes are sacred ground, its monsters a blessed bounty. \ - You have seen lights in the distance... they foreshadow the arrival of outsiders that seek to tear apart the Necropolis and its domain. Fresh sacrifices for your nest. \ - You do not know how their magic works, nor where they come from, or the significance of their items." + flavour_text = "You are an ash walker. Your tribe worships the Necropolis. The wastes are sacred ground, its monsters a blessed bounty. You have seen lights in the distance... they foreshadow the arrival of outsiders that seek to tear apart the Necropolis and its domain. Fresh sacrifices for your nest. You do not know how their magic works, nor where they come from, or the significance of their items." assignedrole = "Ash Walker" /obj/effect/mob_spawn/human/ash_walker/special(mob/living/new_spawn) From 78f24fae3b66b18c393a7c8590994f3650ee0ae5 Mon Sep 17 00:00:00 2001 From: Poojawa Date: Sat, 23 Sep 2017 04:02:03 -0500 Subject: [PATCH 19/37] some initial nerfing work --- .../modules/clothing/spacesuits/flightsuit.dm | 53 ++++++++++++++----- 1 file changed, 41 insertions(+), 12 deletions(-) diff --git a/code/modules/clothing/spacesuits/flightsuit.dm b/code/modules/clothing/spacesuits/flightsuit.dm index 4f251d68e3..0c16a2b764 100644 --- a/code/modules/clothing/spacesuits/flightsuit.dm +++ b/code/modules/clothing/spacesuits/flightsuit.dm @@ -18,7 +18,7 @@ var/icon_state_boost = "flightpack_boost" var/item_state_boost = "flightpack_boost" actions_types = list(/datum/action/item_action/flightpack/toggle_flight, /datum/action/item_action/flightpack/engage_boosters, /datum/action/item_action/flightpack/toggle_stabilizers, /datum/action/item_action/flightpack/change_power, /datum/action/item_action/flightpack/toggle_airbrake) - armor = list(melee = 20, bullet = 20, laser = 20, energy = 10, bomb = 30, bio = 100, rad = 75, fire = 100, acid = 75) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 10, bomb = 30, bio = 100, rad = 10, fire = 50, acid = 35) w_class = WEIGHT_CLASS_BULKY slot_flags = SLOT_BACK @@ -34,7 +34,7 @@ var/flight = FALSE var/flight_passflags = PASSTABLE var/powersetting = 1 - var/powersetting_high = 3 + var/powersetting_high = 6 var/powersetting_low = 1 var/override_safe = FALSE @@ -84,7 +84,7 @@ var/emp_disable_threshold = 3 //3 weak ion, 2 strong ion hits. var/emp_disabled = FALSE - var/crash_damage = 0 //Same thing, but for crashes. This is in addition to possible amounts of brute damage to the wearer. + var/crash_damage = 10 //Same thing, but for crashes. This is in addition to possible amounts of brute damage to the wearer. var/crash_damage_low = 1 var/crash_damage_high = 2.5 var/crash_disable_threshold = 5 @@ -102,9 +102,13 @@ var/obj/item/stock_parts/capacitor/part_cap = null var/obj/item/stock_parts/micro_laser/part_laser = null var/obj/item/stock_parts/matter_bin/part_bin = null + var/obj/item/stock_parts/cell/cell = null //Wew lad. about damn time now var/crashing = FALSE //Are we currently getting wrecked? + var/s_delay = 50 // cell replacement delay + + /obj/item/device/flightpack/proc/changeWearer(mob/changeto) if(wearer) LAZYREMOVE(wearer.user_movement_hooks, src) @@ -128,6 +132,8 @@ part_cap = new /obj/item/stock_parts/capacitor/super(src) part_laser = new /obj/item/stock_parts/micro_laser/ultra(src) part_bin = new /obj/item/stock_parts/matter_bin/super(src) + cell = new/obj/item/stock_parts/cell/high + cell.charge = 9000 ..() /obj/item/device/flightpack/proc/usermessage(message, span = "boldnotice", mob/mob_override = null) @@ -816,6 +822,22 @@ part_cap.forceMove(get_turf(src)) part_cap = I changed = TRUE + if(istype(S, /obj/item/stock_parts/cell)) + var/obj/item/stock_parts/cell/CELL = S + if(CELL.maxcharge > cell.maxcharge) + usermessage("Higher maximum capacity detected.\nUpgrading...", mob_override = user) + if (do_after(user,s_delay, target = src)) + user.transferItemToLoc(CELL, src) + CELL.charge = min(CELL.charge+cell.charge, CELL.maxcharge) + var/obj/item/stock_parts/cell/old_cell = cell + old_cell.charge = 0 + user.put_in_hands(old_cell) + old_cell.add_fingerprint(user) + old_cell.update_icon() + cell = CELL + usermessage("Upgrade complete. Maximum capacity: [round(cell.maxcharge/100)]%", mob_override = user) + else + usermessage("Procedure interrupted. Protocol terminated.", mob_override = user) if(changed) update_parts() ..() @@ -847,7 +869,7 @@ var/obj/item/device/flightpack/pack = null var/mob/living/carbon/human/wearer = null var/active = FALSE - resistance_flags = FIRE_PROOF | ACID_PROOF + resistance_flags = FIRE_PROOF /obj/item/clothing/shoes/flightshoes/Destroy() pack = null @@ -901,22 +923,28 @@ var/deployedpack = FALSE var/deployedshoes = FALSE var/locked = FALSE - resistance_flags = FIRE_PROOF | ACID_PROOF + resistance_flags = FIRE_PROOF helmettype = /obj/item/clothing/head/helmet/space/hardsuit/flightsuit jetpack = null var/flightpack var/flight = FALSE allowed = list(/obj/item/device/flashlight, /obj/item/tank/internals, /obj/item/gun, /obj/item/reagent_containers/spray/pepper, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs) actions_types = list(/datum/action/item_action/flightsuit/toggle_helmet, /datum/action/item_action/flightsuit/toggle_boots, /datum/action/item_action/flightsuit/toggle_flightpack, /datum/action/item_action/flightsuit/lock_suit) - armor = list(melee = 20, bullet = 20, laser = 20, energy = 10, bomb = 30, bio = 100, rad = 75, fire = 100, acid = 100) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 10, bomb = 30, bio = 100, rad = 10, fire = 50, acid = 35) var/maint_panel = FALSE - max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT + var/obj/item/stock_parts/cell/cell + var/s_delay = 50 + +/obj/item/clothing/suit/space/hardsuit/flightsuit/get_cell() + return cell /obj/item/clothing/suit/space/hardsuit/flightsuit/full/Initialize() . = ..() makepack() makeshoes() resync() + get_cell() /obj/item/clothing/suit/space/hardsuit/flightsuit/proc/usermessage(message, span = "boldnotice") var/mob/targ = user @@ -931,6 +959,7 @@ to_chat(user, "SUIT: [locked ? "LOCKED" : "UNLOCKED"]") to_chat(user, "FLIGHTPACK: [deployedpack ? "ENGAGED" : "DISENGAGED"] FLIGHTSHOES : [deployedshoes ? "ENGAGED" : "DISENGAGED"] HELMET : [suittoggled ? "ENGAGED" : "DISENGAGED"]") to_chat(user, "Its maintainence panel is [maint_panel ? "OPEN" : "CLOSED"]") + to_chat(user, "Current energy capacity: [DisplayPower(cell.charge)]") /obj/item/clothing/suit/space/hardsuit/flightsuit/Destroy() dropped() @@ -1223,12 +1252,12 @@ icon_state = "flighthelmet" item_state = "flighthelmet" item_color = "flight" - resistance_flags = FIRE_PROOF | ACID_PROOF - brightness_on = 7 + resistance_flags = FIRE_PROOF + brightness_on = 4 light_color = "#30ffff" - armor = list(melee = 20, bullet = 20, laser = 20, energy = 10, bomb = 30, bio = 100, rad = 75, fire = 100, acid = 100) - max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT - var/list/datahuds = list(DATA_HUD_SECURITY_ADVANCED, DATA_HUD_MEDICAL_ADVANCED, DATA_HUD_DIAGNOSTIC) + armor = list(melee = 0, bullet = 0, laser = 0, energy = 10, bomb = 30, bio = 100, rad = 10, fire = 50, acid = 35) + max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT + var/list/datahuds = list(DATA_HUD_SECURITY_BASIC , DATA_HUD_MEDICAL_BASIC, DATA_HUD_DIAGNOSTIC) var/zoom_range = 14 var/zoom = FALSE actions_types = list(/datum/action/item_action/toggle_helmet_light, /datum/action/item_action/flightpack/zoom) From 20700dab57f2fc1eefcf955498a22f7c6840a6fa Mon Sep 17 00:00:00 2001 From: deathride58 Date: Sat, 23 Sep 2017 11:18:48 -0400 Subject: [PATCH 20/37] change for the sake of change - laying the groundwork to let players directly change the percentage of screenshake --- code/modules/client/preferences.dm | 19 ++++++------------- code/modules/client/preferences_savefile.dm | 2 +- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index f8909b8f4a..92551d485d 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -47,7 +47,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/uses_glasses_colour = 0 - var/screenshake = 1 + var/screenshake = 100 var/damagescreenshake = 2 //character preferences @@ -364,10 +364,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Disabled" else dat += "High" - dat += "
" - dat += "Screen Shake: [(screenshake==1) ? "Full" : ((screenshake==0) ? "None" : "Reduced")]
" + dat += "Screen Shake: [(screenshake==100) ? "Full" : ((screenshake==0) ? "None" : [screenshake])]
" if (!user.client.prefs.screenshake==0) dat += "Damage Screen Shake: [(damagescreenshake==1) ? "On" : ((damagescreenshake==0) ? "Off" : "Only when down")]
" @@ -1495,16 +1494,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["exhibitionist"] = TRUE else features["exhibitionist"] = FALSE - if("screenshake") - switch(screenshake) - if(0) - screenshake = 1 - if(1) - screenshake = 2 - if(2) - screenshake = 0 - else - screenshake = 1 + if ("screenshake") + var/desiredshake = input(user, "Set the amount of screenshake you want. \n(0 = disabled, 100 = full, 200 = maximum.)", "Character Preference", screenshake) as null|num + if (!isnull(desiredshake)) + screenshake = desiredshake if("damagescreenshake") switch(damagescreenshake) if(0) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index a6acba8c69..9daad5cae7 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -217,7 +217,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car ghost_others = sanitize_inlist(ghost_others, GLOB.ghost_others_options, GHOST_OTHERS_DEFAULT_OPTION) menuoptions = SANITIZE_LIST(menuoptions) be_special = SANITIZE_LIST(be_special) - screenshake = sanitize_integer(screenshake, 0, 2, initial(screenshake)) + screenshake = sanitize_integer(screenshake, 0, 200, initial(screenshake)) damagescreenshake = sanitize_integer(damagescreenshake, 0, 2, initial(damagescreenshake)) From 4e793a5630d1c32948018f52e3b9eb6e5fd67b80 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Sat, 23 Sep 2017 13:17:21 -0400 Subject: [PATCH 21/37] Should work --- code/modules/client/preferences.dm | 2 +- modular_citadel/cit_screenshake.dm | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 92551d485d..d40c4ea87c 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -366,7 +366,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "High" dat += "
" - dat += "Screen Shake: [(screenshake==100) ? "Full" : ((screenshake==0) ? "None" : [screenshake])]
" + dat += "Screen Shake: [(screenshake==100) ? "Full" : ((screenshake==0) ? "None" : "[screenshake]")]
" if (!user.client.prefs.screenshake==0) dat += "Damage Screen Shake: [(damagescreenshake==1) ? "On" : ((damagescreenshake==0) ? "Off" : "Only when down")]
" diff --git a/modular_citadel/cit_screenshake.dm b/modular_citadel/cit_screenshake.dm index 8bdc4003ab..2d0110c4e7 100644 --- a/modular_citadel/cit_screenshake.dm +++ b/modular_citadel/cit_screenshake.dm @@ -8,8 +8,9 @@ return var/oldx = C.pixel_x var/oldy = C.pixel_y - var/max = ((C.prefs.screenshake==1) ? strength : strength*0.25) *world.icon_size - var/min = -(((C.prefs.screenshake==1) ? strength : strength*0.25)*world.icon_size) + var/clientscreenshake = (C.prefs.screenshake * 0.01) + var/max = (strength*clientscreenshake) * world.icon_size + var/min = -((strength*clientscreenshake) * world.icon_size) for(var/i in 0 to duration-1) if (i == 0) From 5b1b550c0ec7704682820318581d1f6e62ce5b68 Mon Sep 17 00:00:00 2001 From: jughu Date: Sun, 24 Sep 2017 00:34:24 +0200 Subject: [PATCH 22/37] Update holy_weapons.dm --- code/game/objects/items/holy_weapons.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index 3e8ac576ff..c21a01b555 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -9,6 +9,7 @@ throw_speed = 3 throw_range = 4 throwforce = 10 + unique_rename = 1 w_class = WEIGHT_CLASS_TINY var/reskinned = FALSE From 617eb4c889bb59a5f865a4a6c6304d0c5ce95b54 Mon Sep 17 00:00:00 2001 From: jughu Date: Sun, 24 Sep 2017 01:04:39 +0200 Subject: [PATCH 23/37] The new hip --- code/game/objects/items/holy_weapons.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index c21a01b555..f3134ef6c6 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -9,7 +9,7 @@ throw_speed = 3 throw_range = 4 throwforce = 10 - unique_rename = 1 + unique_rename = TRUE w_class = WEIGHT_CLASS_TINY var/reskinned = FALSE From 60bdb54024ed93790b272e9d8d46f4a60942fbe5 Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Sat, 23 Sep 2017 21:33:20 -0700 Subject: [PATCH 24/37] You can now Indiana Jones one explosion. --- .../crates_lockers/closets/secure/freezer.dm | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm index 11f087d052..b2ad2917eb 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm @@ -1,8 +1,23 @@ +<<<<<<< HEAD /obj/structure/closet/secure_closet/freezer icon_state = "freezer" /obj/structure/closet/secure_closet/freezer/kitchen name = "kitchen Cabinet" +======= +/obj/structure/closet/secure_closet/freezer + icon_state = "freezer" + var/jones = FALSE + +/obj/structure/closet/secure_closet/freezer/ex_act() + if(!jones) + jones = TRUE + else + ..() + +/obj/structure/closet/secure_closet/freezer/kitchen + name = "kitchen Cabinet" +>>>>>>> ac67dfe... You can now Indiana Jones one explosion. (#30961) req_access = list(ACCESS_KITCHEN) /obj/structure/closet/secure_closet/freezer/kitchen/PopulateContents() From ac8e74e5172d006333c0c36bde35c7bf66e636b4 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Sun, 24 Sep 2017 08:35:36 -0500 Subject: [PATCH 25/37] Update freezer.dm --- .../crates_lockers/closets/secure/freezer.dm | 136 +++++++++--------- 1 file changed, 64 insertions(+), 72 deletions(-) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm index b2ad2917eb..087f58c89f 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm @@ -1,10 +1,3 @@ -<<<<<<< HEAD -/obj/structure/closet/secure_closet/freezer - icon_state = "freezer" - -/obj/structure/closet/secure_closet/freezer/kitchen - name = "kitchen Cabinet" -======= /obj/structure/closet/secure_closet/freezer icon_state = "freezer" var/jones = FALSE @@ -17,71 +10,70 @@ /obj/structure/closet/secure_closet/freezer/kitchen name = "kitchen Cabinet" ->>>>>>> ac67dfe... You can now Indiana Jones one explosion. (#30961) req_access = list(ACCESS_KITCHEN) - -/obj/structure/closet/secure_closet/freezer/kitchen/PopulateContents() - ..() - for(var/i = 0, i < 3, i++) - new /obj/item/reagent_containers/food/condiment/flour(src) - new /obj/item/reagent_containers/food/condiment/rice(src) - new /obj/item/reagent_containers/food/condiment/sugar(src) - -/obj/structure/closet/secure_closet/freezer/kitchen/maintenance - name = "maintenance refrigerator" - desc = "This refrigerator looks quite dusty, is there anything edible still inside?" - req_access = list() - -/obj/structure/closet/secure_closet/freezer/kitchen/maintenance/PopulateContents() - ..() - for(var/i = 0, i < 5, i++) - new /obj/item/reagent_containers/food/condiment/milk(src) - for(var/i = 0, i < 5, i++) - new /obj/item/reagent_containers/food/condiment/soymilk(src) - for(var/i = 0, i < 2, i++) - new /obj/item/storage/fancy/egg_box(src) - -/obj/structure/closet/secure_closet/freezer/kitchen/mining - req_access = list() - -/obj/structure/closet/secure_closet/freezer/meat - name = "meat fridge" - -/obj/structure/closet/secure_closet/freezer/meat/PopulateContents() - ..() - for(var/i = 0, i < 4, i++) - new /obj/item/reagent_containers/food/snacks/meat/slab/monkey(src) -/obj/structure/closet/secure_closet/freezer/fridge - name = "refrigerator" - -/obj/structure/closet/secure_closet/freezer/fridge/PopulateContents() - ..() - for(var/i = 0, i < 5, i++) - new /obj/item/reagent_containers/food/condiment/milk(src) - for(var/i = 0, i < 5, i++) - new /obj/item/reagent_containers/food/condiment/soymilk(src) - for(var/i = 0, i < 2, i++) - new /obj/item/storage/fancy/egg_box(src) - -/obj/structure/closet/secure_closet/freezer/money - name = "freezer" - desc = "This contains cold hard cash." + +/obj/structure/closet/secure_closet/freezer/kitchen/PopulateContents() + ..() + for(var/i = 0, i < 3, i++) + new /obj/item/reagent_containers/food/condiment/flour(src) + new /obj/item/reagent_containers/food/condiment/rice(src) + new /obj/item/reagent_containers/food/condiment/sugar(src) + +/obj/structure/closet/secure_closet/freezer/kitchen/maintenance + name = "maintenance refrigerator" + desc = "This refrigerator looks quite dusty, is there anything edible still inside?" + req_access = list() + +/obj/structure/closet/secure_closet/freezer/kitchen/maintenance/PopulateContents() + ..() + for(var/i = 0, i < 5, i++) + new /obj/item/reagent_containers/food/condiment/milk(src) + for(var/i = 0, i < 5, i++) + new /obj/item/reagent_containers/food/condiment/soymilk(src) + for(var/i = 0, i < 2, i++) + new /obj/item/storage/fancy/egg_box(src) + +/obj/structure/closet/secure_closet/freezer/kitchen/mining + req_access = list() + +/obj/structure/closet/secure_closet/freezer/meat + name = "meat fridge" + +/obj/structure/closet/secure_closet/freezer/meat/PopulateContents() + ..() + for(var/i = 0, i < 4, i++) + new /obj/item/reagent_containers/food/snacks/meat/slab/monkey(src) +/obj/structure/closet/secure_closet/freezer/fridge + name = "refrigerator" + +/obj/structure/closet/secure_closet/freezer/fridge/PopulateContents() + ..() + for(var/i = 0, i < 5, i++) + new /obj/item/reagent_containers/food/condiment/milk(src) + for(var/i = 0, i < 5, i++) + new /obj/item/reagent_containers/food/condiment/soymilk(src) + for(var/i = 0, i < 2, i++) + new /obj/item/storage/fancy/egg_box(src) + +/obj/structure/closet/secure_closet/freezer/money + name = "freezer" + desc = "This contains cold hard cash." req_access = list(ACCESS_HEADS_VAULT) - -/obj/structure/closet/secure_closet/freezer/money/PopulateContents() - ..() - for(var/i = 0, i < 3, i++) - new /obj/item/stack/spacecash/c1000(src) - for(var/i = 0, i < 5, i++) - new /obj/item/stack/spacecash/c500(src) - for(var/i = 0, i < 6, i++) - new /obj/item/stack/spacecash/c200(src) - -/obj/structure/closet/secure_closet/freezer/cream_pie - name = "cream pie closet" - desc = "Contains pies filled with cream and/or custard, you sickos." + +/obj/structure/closet/secure_closet/freezer/money/PopulateContents() + ..() + for(var/i = 0, i < 3, i++) + new /obj/item/stack/spacecash/c1000(src) + for(var/i = 0, i < 5, i++) + new /obj/item/stack/spacecash/c500(src) + for(var/i = 0, i < 6, i++) + new /obj/item/stack/spacecash/c200(src) + +/obj/structure/closet/secure_closet/freezer/cream_pie + name = "cream pie closet" + desc = "Contains pies filled with cream and/or custard, you sickos." req_access = list(ACCESS_THEATRE) - -/obj/structure/closet/secure_closet/freezer/pie/PopulateContents() - ..() - new /obj/item/reagent_containers/food/snacks/pie/cream(src) + +/obj/structure/closet/secure_closet/freezer/pie/PopulateContents() + ..() + new /obj/item/reagent_containers/food/snacks/pie/cream(src) From 3505e14b45dd9f9eac3e37f76271140a966ed21c Mon Sep 17 00:00:00 2001 From: Joan Lung <3886584+ChangelingRain@users.noreply.github.com> Date: Sun, 24 Sep 2017 11:09:42 -0400 Subject: [PATCH 26/37] Airlocks are once again actually open when they appear to be open, instead of being uninteractable for a noticeable period (#30899) * Airlocks are once again actually open when they appear to be open, instead of being uninteractable for a noticeable period * tweak * fix --- code/game/machinery/doors/airlock.dm | 35 ++++++++++-------- .../airlocks/abductor/abductor_airlock.dmi | Bin 2370 -> 2374 bytes .../obj/doors/airlocks/survival/survival.dmi | Bin 22406 -> 22410 bytes .../airlocks/survival/survival_overlays.dmi | Bin 18377 -> 18378 bytes 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 54292a3af3..e7fa7447b5 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1347,19 +1347,19 @@ return TRUE operating = TRUE update_icon(AIRLOCK_OPENING, 1) - src.set_opacity(0) - sleep(5) - density = FALSE - sleep(9) - src.layer = OPEN_DOOR_LAYER - update_icon(AIRLOCK_OPEN, 1) + sleep(1) set_opacity(0) - operating = FALSE - air_update_turf(1) update_freelook_sight() + sleep(4) + density = FALSE + air_update_turf(1) + sleep(1) + layer = OPEN_DOOR_LAYER + update_icon(AIRLOCK_OPEN, 1) + operating = FALSE if(delayed_close_requested) delayed_close_requested = FALSE - addtimer(CALLBACK(src, .proc/close), 2) + addtimer(CALLBACK(src, .proc/close), 1) return TRUE @@ -1391,21 +1391,24 @@ return TRUE operating = TRUE update_icon(AIRLOCK_CLOSING, 1) - src.layer = CLOSED_DOOR_LAYER + layer = CLOSED_DOOR_LAYER if(air_tight) density = TRUE - sleep(5) - density = TRUE + air_update_turf(1) + sleep(1) + if(!air_tight) + density = TRUE + air_update_turf(1) + sleep(4) if(!safe) crush() - sleep(9) - update_icon(AIRLOCK_CLOSED, 1) if(visible && !glass) set_opacity(1) + update_freelook_sight() + sleep(1) + update_icon(AIRLOCK_CLOSED, 1) operating = FALSE delayed_close_requested = FALSE - air_update_turf(1) - update_freelook_sight() if(safe) CheckForMobs() return TRUE diff --git a/icons/obj/doors/airlocks/abductor/abductor_airlock.dmi b/icons/obj/doors/airlocks/abductor/abductor_airlock.dmi index d0ef3d2462d3765ee2b6deb53ae4048aab020f35..58be8d778e9dc3833d7a1dfe77c82a6dd23009da 100644 GIT binary patch delta 68 zcmV-K0K5Of62=mcUIC$zUv@KrYy&-09TG4XXHI^80jgafchk+T{Ji3lqSE9NV8G%E a1Z4$RKNoNe002f-W#NgymA|tD0X_(>?i(Ng delta 64 zcmV-G0Kfmn62cOYUICqvUv@7+Y#pqSi!&!bzW~)tko%}^W`16ANl|HX2{52=c}iKq W)z1YSq5z9GT(QDQ44<p3HSp%a#5mWNrbE>>^wiE9wvZ^&jKs^RFhb&Z zATerl8^cn3=!1qtG)(NZibyEqJR}MdSJ&UQheW<&JZrlPGWNDR&7DXnJ@s!$rbE>>^t2&5_RuH~M-ne*(gclD zL1MCQoYGoi>XU^=Hq0EY$w(L%A~Z@8x6t2hgofHMUaa2*IY0h4=FTLHo%=U53aO-$ y#TpVb^YSekW{&$rYm`)fMC@Y0OZk diff --git a/icons/obj/doors/airlocks/survival/survival_overlays.dmi b/icons/obj/doors/airlocks/survival/survival_overlays.dmi index e8bede8217d4b2738a2357913d64238161df66dc..94c1a9fa34a127b46ed3d86d80155a3fe6263d56 100644 GIT binary patch delta 294 zcmV+>0one^j{(Y$0gxnr4SG~qbVOxyV{&P5bZKvH004NLosz+B!yphu&+rwi=>z(%k{qfk!M zFO*2s?F~4v>~WqJSJZM&JD!AR^c@;;n--LVVP(b!wSsH?X{OLjM53*AKU28Ypl*b= zAtCY*Zk)FfMNF1ihvtd0C3MRFSCP;*DAP@+c^xmL$ah(h@0Ql0Ot)0^f9BSqNz3~% sTYAQC%Rl8!HWw@y^?#J9;ARe7!~R%7b*SkbZiFE`7$Y%KvpE5fM(v)C1poj5 delta 293 zcmV+=0owk`j{(V#0gxnr40=>pbVOxyV{&P5bZKvH004NLm6E}3!yphu&+rwiWB#>@H<$eGpMKO zH%c^GbpZ*S{mo!;Myuzv_nYvDu|wBhrUhcOOfWvGm4b>tGlga%66<~VpCTxSwrQy~OhZ|noQvYedp rU(02?r*ak Date: Sun, 24 Sep 2017 10:32:43 -0500 Subject: [PATCH 28/37] Automatic changelog generation for PR #2907 [ci skip] --- html/changelogs/AutoChangeLog-pr-2907.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2907.yml diff --git a/html/changelogs/AutoChangeLog-pr-2907.yml b/html/changelogs/AutoChangeLog-pr-2907.yml new file mode 100644 index 0000000000..352432595c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2907.yml @@ -0,0 +1,8 @@ +author: "Toriate" +delete-after: True +changes: + - rscadd: "Adds Spinfusors, ordered from cargo, security locked crate" + - rscadd: "Adds the X9 Assault Rifle, adminspawn only" + - rscadd: "Adds the Magpistol, made in science, non-lethal by default, unlocked slightly later than the AEG" + - rscadd: "Adds the Foam Force Magpistol and Magfoam, made in autolathes" + - soundadd: "adds the Magpistol's firing sound" From 30ad17101bcd3be954fa39666c4d8b491f964446 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Sep 2017 10:34:52 -0500 Subject: [PATCH 29/37] Automatic changelog generation for PR #2583 [ci skip] --- html/changelogs/AutoChangeLog-pr-2583.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2583.yml diff --git a/html/changelogs/AutoChangeLog-pr-2583.yml b/html/changelogs/AutoChangeLog-pr-2583.yml new file mode 100644 index 0000000000..fff14dec8e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2583.yml @@ -0,0 +1,8 @@ +author: "deathride58" +delete-after: True +changes: + - rscadd: "Firing most guns will now cause your screen to shake subtly." + - rscadd: "Being hit by melee weapons with a force over 10 will now cause subtle screenshake" + - rscadd: "Hitting someone with a melee weapon with a force over 10 will now cause subtle screenshake" + - rscadd: "Hitting an object with a melee weapon with a force over 20 will now cause subtle screenshake" + - rscadd: "Added two options to the Game Settings menu: Screen Shake and Damage Screen Shake. Screen Shake controls (most) screenshake in the game, and allows you to set the percentage of screenshake from most sources, or simply turn it off entirely. Damage Screen Shake controls the screenshake when you get hit by weapons, and has three settings, on, off, and only when down. The defaults are 100%, and only when down, respectively." From df607bb24c640335d21b6cf77cf79c6499d62c39 Mon Sep 17 00:00:00 2001 From: MoreRobustThanYou Date: Sun, 24 Sep 2017 12:54:22 -0400 Subject: [PATCH 30/37] Implant Chairs now also support organs (#30982) * Implant Chairs now also support organs * Update implantchair.dm * Update implantchair.dm --- code/game/objects/items/implants/implantchair.dm | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/implants/implantchair.dm b/code/game/objects/items/implants/implantchair.dm index 2f59020cbe..76c61ade81 100644 --- a/code/game/objects/items/implants/implantchair.dm +++ b/code/game/objects/items/implants/implantchair.dm @@ -85,10 +85,17 @@ update_icon() /obj/machinery/implantchair/proc/implant_action(mob/living/M) - var/obj/item/implant/I = new implant_type - if(I.implant(M)) - visible_message("[M] has been implanted by the [name].") - return 1 + var/obj/item/I = new implant_type + if(istype(I, /obj/item/implant)) + var/obj/item/implant/P = I + if(P.implant(M)) + visible_message("[M] has been implanted by [src].") + return TRUE + else if(istype(I, /obj/item/organ)) + var/obj/item/organ/P = I + P.Insert(M, drop_if_replaced = FALSE) + visible_message("[M] has been implanted by [src].") + return TRUE /obj/machinery/implantchair/update_icon() icon_state = initial(icon_state) From 1e403a0aba64c7f3721cc717f22d86538dea92f0 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Sep 2017 14:47:52 -0500 Subject: [PATCH 32/37] Automatic changelog generation for PR #2909 [ci skip] --- html/changelogs/AutoChangeLog-pr-2909.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2909.yml diff --git a/html/changelogs/AutoChangeLog-pr-2909.yml b/html/changelogs/AutoChangeLog-pr-2909.yml new file mode 100644 index 0000000000..65e957021b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2909.yml @@ -0,0 +1,7 @@ +author: "Poojawa" +delete-after: True +changes: + - tweak: "Flightsuits require power cells now to function" + - tweak: "Flightsuit HUDs reduced to AI standards rather than full advanced." + - tweak: "Suits will heavily drain while in gravity, but not much without it." + - tweak: "Swap batteries via clicking on your suit with one." From 38de7498e4ae3d492b02efea0cb3139a0d0628ac Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Sep 2017 14:48:13 -0500 Subject: [PATCH 33/37] Automatic changelog generation for PR #2929 [ci skip] --- html/changelogs/AutoChangeLog-pr-2929.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2929.yml diff --git a/html/changelogs/AutoChangeLog-pr-2929.yml b/html/changelogs/AutoChangeLog-pr-2929.yml new file mode 100644 index 0000000000..884f951047 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2929.yml @@ -0,0 +1,4 @@ +author: "More Robust Than You" +delete-after: True +changes: + - rscadd: "Implant Chairs now also support organs" From 5b05af9036973e0dc84c7e63639ff50ebffc121d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 24 Sep 2017 14:49:21 -0500 Subject: [PATCH 34/37] Automatic changelog generation for PR #2923 [ci skip] --- html/changelogs/AutoChangeLog-pr-2923.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2923.yml diff --git a/html/changelogs/AutoChangeLog-pr-2923.yml b/html/changelogs/AutoChangeLog-pr-2923.yml new file mode 100644 index 0000000000..6ab464e82c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2923.yml @@ -0,0 +1,4 @@ +author: "Improvedname" +delete-after: True +changes: + - tweak: "You can now rename holy weapons" From 382d549c2ffb240238b14d79ad6121b9878dbaa5 Mon Sep 17 00:00:00 2001 From: pubby Date: Sun, 24 Sep 2017 17:37:31 -0500 Subject: [PATCH 35/37] Allow AIs to greentext survive (#30959) * Change AI objectives from survive to exist * Cyberboss simplification --- code/datums/antagonists/datum_traitor.dm | 6 +++--- code/game/gamemodes/objective.dm | 8 ++++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/code/datums/antagonists/datum_traitor.dm b/code/datums/antagonists/datum_traitor.dm index 245c620dd3..eeb803ca1e 100644 --- a/code/datums/antagonists/datum_traitor.dm +++ b/code/datums/antagonists/datum_traitor.dm @@ -186,9 +186,9 @@ kill_objective.find_target() add_objective(kill_objective) - var/datum/objective/survive/survive_objective = new - survive_objective.owner = owner - add_objective(survive_objective) + var/datum/objective/survive/exist/exist_objective = new + exist_objective.owner = owner + add_objective(exist_objective) /datum/antagonist/traitor/proc/forge_single_objective() return 0 /datum/antagonist/traitor/human/forge_single_objective() //Returns how many objectives are added diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 8329298910..75ed90d712 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -348,6 +348,14 @@ return FALSE return TRUE +//Like survive, but works for silicons and zombies and such. +/datum/objective/survive/exist/considered_alive(var/datum/mind/M) + if(M && M.current) + if(isliving(M.current)) + var/mob/living/L = M.current + return L.stat != DEAD + return FALSE + /datum/objective/martyr explanation_text = "Die a glorious death." From 2071dfd1a50783df438752b6279c8a0737658a1e Mon Sep 17 00:00:00 2001 From: Poojawa Date: Sun, 24 Sep 2017 21:21:33 -0500 Subject: [PATCH 37/37] Readds alert level sounds (#2920) --- code/modules/security_levels/security_levels.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/security_levels/security_levels.dm b/code/modules/security_levels/security_levels.dm index e83061b232..1fa3e89d3a 100644 --- a/code/modules/security_levels/security_levels.dm +++ b/code/modules/security_levels/security_levels.dm @@ -41,6 +41,7 @@ GLOBAL_VAR_INIT(security_level, 0) if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL) SSshuttle.emergency.modTimer(2) GLOB.security_level = SEC_LEVEL_BLUE + sound_to_playing_players('sound/misc/voybluealert.ogg') for(var/obj/machinery/firealarm/FA in GLOB.machines) if(FA.z in GLOB.station_z_levels) FA.update_icon() @@ -60,7 +61,7 @@ GLOBAL_VAR_INIT(security_level, 0) var/obj/machinery/computer/communications/CC = locate(/obj/machinery/computer/communications,world) if(CC) CC.post_status("alert", "redalert")*/ - + sound_to_playing_players('sound/misc/voyalert.ogg') for(var/obj/machinery/firealarm/FA in GLOB.machines) if(FA.z in GLOB.station_z_levels) FA.update_icon() @@ -74,6 +75,7 @@ GLOBAL_VAR_INIT(security_level, 0) else if(GLOB.security_level == SEC_LEVEL_BLUE) SSshuttle.emergency.modTimer(0.5) GLOB.security_level = SEC_LEVEL_DELTA + sound_to_playing_players('sound/misc/deltakalaxon.ogg') for(var/obj/machinery/firealarm/FA in GLOB.machines) if(FA.z in GLOB.station_z_levels) FA.update_icon()