From 6b15aeb69ad096d3c17742ca9b5dedb561048a1b Mon Sep 17 00:00:00 2001 From: Remie Richards Date: Sun, 3 May 2015 23:34:05 +0100 Subject: [PATCH 01/13] Fixes centerX and centerY not being correctly centered, corrects sphere logic. why is it called sphereMagic? because as far as I'm concerned, it is magic, it was previously named centerZ but it actually was quite a ways off being the center of any spheres. Idk what it does, but It serves a vital part of building mathematically correct spheres. --- .../procedural mapping/mapGenerator.dm | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/code/modules/procedural mapping/mapGenerator.dm b/code/modules/procedural mapping/mapGenerator.dm index 887ddfc40a4..f480a2b11f3 100644 --- a/code/modules/procedural mapping/mapGenerator.dm +++ b/code/modules/procedural mapping/mapGenerator.dm @@ -49,30 +49,29 @@ if(!checkRegion(Start, End)) return 0 - var/centerX = abs(max(End.x-Start.x,1)) - var/centerY = abs(max(End.y-Start.y,1)) - + var/centerX = max(abs((End.x+Start.x)/2),1) + var/centerY = max(abs((End.y+Start.y)/2),1) var/lilZ = min(Start.z,End.z) var/bigZ = max(Start.z,End.z) - var/centerZ = max(abs(bigZ-(lilZ/2)),1) //Spherical maps! woo! + var/sphereMagic = max(abs(bigZ-(lilZ/2)),1) //Spherical maps! woo! var/radius = abs(max(centerX,centerY)) //take the biggest displacement as the radius if(replace) undefineRegion() - //Sphere mode engage - var/evenCheckZ = 0 - if(max(bigZ,lilZ) % 2 == 0) - evenCheckZ = centerZ+1 + //Even sphere correction engage + var/offByOneOffset = 1 + if(bigZ % 2 == 0) + offByOneOffset = 0 - for(var/i = lilZ, i <= bigZ, i++) + for(var/i = lilZ, i <= bigZ+offByOneOffset, i++) var/theRadius = radius - if(i != centerZ) + if(i != sphereMagic) if(i != evenCheckZ) - theRadius = max(radius/max((2*abs(centerZ-i)),1),1) + theRadius = max(radius/max((2*abs(sphereMagic-i)),1),1) map |= circlerange(locate(centerX,centerY,i),theRadius) From 984e337c47d1fe8ea7e86be85919b928b8e3e640 Mon Sep 17 00:00:00 2001 From: Remie Richards Date: Sun, 3 May 2015 23:39:04 +0100 Subject: [PATCH 02/13] minor correction. --- code/modules/procedural mapping/mapGenerator.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/procedural mapping/mapGenerator.dm b/code/modules/procedural mapping/mapGenerator.dm index f480a2b11f3..c0b89549f3e 100644 --- a/code/modules/procedural mapping/mapGenerator.dm +++ b/code/modules/procedural mapping/mapGenerator.dm @@ -70,8 +70,7 @@ for(var/i = lilZ, i <= bigZ+offByOneOffset, i++) var/theRadius = radius if(i != sphereMagic) - if(i != evenCheckZ) - theRadius = max(radius/max((2*abs(sphereMagic-i)),1),1) + theRadius = max(radius/max((2*abs(sphereMagic-i)),1),1) map |= circlerange(locate(centerX,centerY,i),theRadius) From d8e6893e359a635127d4cd2920e324b60154bf89 Mon Sep 17 00:00:00 2001 From: Krausus Date: Fri, 8 May 2015 07:20:44 -0400 Subject: [PATCH 03/13] Improves dumping of "quick" containers Allows all "quick" containers to be dumped into a disposal (click) or onto a table (drag-drop). --- .../objects/items/weapons/storage/storage.dm | 12 ++++++++++ code/modules/recycling/disposal.dm | 24 +++++++------------ 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index b22b813d1c1..e705521954d 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -38,6 +38,18 @@ show_to(M) return + if((allow_quick_empty || allow_quick_gather) && istype(over_object, /obj/structure/table) \ + && contents.len && over_object.Adjacent(usr)) + var/turf/T = get_turf(over_object) + hide_from(usr) + usr.face_atom(src) + usr.visible_message("[usr] empties \the [src] onto \the [over_object].", + "You empty \the [src] onto \the [over_object].") + for(var/obj/item/I in contents) + remove_from_storage(I, T) + update_icon() // For content-sensitive icons + return + if (!( istype(over_object, /obj/screen) )) return ..() if (!(src.loc == usr) || (src.loc && src.loc.loc == usr)) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index d1506aa8dbc..5bc8b20a6bb 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -93,22 +93,14 @@ user << "You can't place that item inside the disposal unit." return - if(istype(I, /obj/item/weapon/storage/bag/trash)) - var/obj/item/weapon/storage/bag/trash/T = I - if(T.contents.len) - user << "\blue You empty the bag." - for(var/obj/item/O in T.contents) - T.remove_from_storage(O,src) - T.update_icon() - update() - return - - if(istype(I, /obj/item/weapon/storage/part_replacer)) - var/obj/item/weapon/storage/part_replacer/P = I - if(P.contents.len) - user << "\blue You empty the RPED's contents." - for(var/obj/item/O in P.contents) - P.remove_from_storage(O,src) + if(istype(I, /obj/item/weapon/storage)) + var/obj/item/weapon/storage/S = I + if((S.allow_quick_empty || S.allow_quick_gather) && S.contents.len) + S.hide_from(user) + user.visible_message("[user] empties \the [S] into \the [src].", "You empty \the [S] into \the [src].") + for(var/obj/item/O in S.contents) + S.remove_from_storage(O, src) + S.update_icon() // For content-sensitive icons update() return From cb0a65b96fb8a1424222b13e2ff90332915a4c69 Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Fri, 8 May 2015 17:32:34 -0400 Subject: [PATCH 04/13] Let's try this --- code/modules/projectiles/ammunition.dm | 9 +- .../projectiles/ammunition/ammo_casings.dm | 12 +-- code/modules/projectiles/gun.dm | 84 +++++++++++-------- code/modules/projectiles/projectile.dm | 4 + 4 files changed, 67 insertions(+), 42 deletions(-) diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 136d589b75d..4bd1032aa4a 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -10,8 +10,9 @@ var/caliber = "" //Which kind of guns it can be loaded into var/projectile_type = ""//The bullet type to create when New() is called var/obj/item/projectile/BB = null //The loaded bullet - var/buck = 0 + var/pellets = 0 var/deviation = 0 + var/spread = 0 /obj/item/ammo_casing/New() @@ -50,6 +51,12 @@ else user << "\blue There is no bullet in the casing to inscribe anything into." +/obj/item/ammo_casing/proc/newshot() //For energy weapons, shotgun shells and wands (!). + if (!BB) + BB = new projectile_type(src) + return + + //Boxes of ammo /obj/item/ammo_box diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index b6313d6eae4..0e56fb17009 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -46,7 +46,7 @@ desc = "A 12 gauge buckshot shell." icon_state = "gshell" projectile_type = "/obj/item/projectile/bullet/pellet" - buck = 5 + pellets = 5 deviation = 0.8 @@ -64,7 +64,7 @@ icon_state = "gshell" projectile_type = "/obj/item/projectile/bullet/pellet/weak" m_amt = 250 - buck = 5 + pellets = 5 deviation = 0.8 /obj/item/ammo_casing/shotgun/improvised/overload @@ -74,12 +74,12 @@ icon_state = "improvshell" projectile_type = /obj/item/projectile/bullet/pellet/random m_amt = 250 - buck = 5 + pellets = 5 deviation = 1.0 /obj/item/ammo_casing/shotgun/improvised/overload/New() ..() - buck = rand(3, 8) + pellets = rand(3, 8) /obj/item/ammo_casing/shotgun/stunslug name = "taser slug" @@ -120,7 +120,7 @@ desc = "A shotgun shell which fires a spread of incendiary pellets." icon_state = "ishell2" projectile_type = "/obj/item/projectile/bullet/incendiary/shell/dragonsbreath" - buck = 4 + pellets = 4 deviation = 0.9 /obj/item/ammo_casing/shotgun/ion @@ -129,7 +129,7 @@ The unique properties of the crystal splot the pulse into a spread of individually weaker bolts." icon_state = "ionshell" projectile_type = /obj/item/projectile/ion/weak - buck = 4 + pellets = 4 deviation = 0.9 /obj/item/ammo_casing/shotgun/laserslug diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index a9ef5784dcc..f086b38988b 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -35,13 +35,14 @@ var/automatic = 0 //Used to determine if you can target multiple people. var/tmp/mob/living/last_moved_mob //Used to fire faster at more than one person. var/tmp/told_cant_shoot = 0 //So that it doesn't spam them with the fact they cannot hit them. - var/firerate = 1 // 0 for one bullet after tarrget moves and aim is lowered, + var/firerate = 1 // 0 for one bullet after tarrget moves and aim is lowered, //1 for keep shooting until aim is lowered var/fire_delay = 0 var/last_fired = 0 var/obj/item/device/flashlight/F = null var/can_flashlight = 0 var/heavy_weapon = 0 + var/randomspread = 0 proc/ready_to_fire() if(world.time >= last_fired + fire_delay) @@ -73,8 +74,8 @@ return /obj/item/weapon/gun/afterattack(atom/A as mob|obj|turf|area, mob/living/user as mob|obj, flag, params) - if(flag) return //we're placing gun on a table or in backpack - if(istype(target, /obj/machinery/recharger) && istype(src, /obj/item/weapon/gun/energy)) return//Shouldnt flag take care of this? + if(flag) return //we're placing gun on a table or in backpack + if(istype(target, /obj/machinery/recharger) && istype(src, /obj/item/weapon/gun/energy)) return//Shouldnt flag take care of this? if(user && user.client && user.client.gun_mode && !(A in target)) PreFire(A,user,params) //They're using the new gun system, locate what they're aiming at. else @@ -180,28 +181,47 @@ in_chamber.yo = targloc.y - curloc.y in_chamber.xo = targloc.x - curloc.x - if(istype(user, /mob/living/carbon)) + + var/spread = 0 + if(istype(user, /mob/living/carbon)) //Instead of modifying projectile's originl pixels, we can increase spread. var/mob/living/carbon/mob = user if(mob.shock_stage > 120) - in_chamber.yo += rand(-2,2) - in_chamber.xo += rand(-2,2) + spread += rand(-2,2) else if(mob.shock_stage > 70) - in_chamber.yo += rand(-1,1) - in_chamber.xo += rand(-1,1) + spread += rand(-1,1) + if(params) + var/list/mouse_control = params2list(params) + if(mouse_control["icon-x"]) + in_chamber.p_x = text2num(mouse_control["icon-x"]) + if(mouse_control["icon-y"]) + in_chamber.p_y = text2num(mouse_control["icon-y"]) + if(mouse_control["screen-loc"]) + //Split screen-loc up into X+Pixel_X and Y+Pixel_Y + var/list/screen_loc_params = text2list(mouse_control["screen-loc"], ",") + + //Split X+Pixel_X up into list(X, Pixel_X) + var/list/screen_loc_X = text2list(screen_loc_params[1],":") + + //Split Y+Pixel_Y up into list(Y, Pixel_Y) + var/list/screen_loc_Y = text2list(screen_loc_params[2],":") + + var/x = text2num(screen_loc_X[1]) * 32 + text2num(screen_loc_X[2]) - 32 + var/y = text2num(screen_loc_Y[1]) * 32 + text2num(screen_loc_Y[2]) - 32 + var/ox = round(544/2) //"origin" x - Basically center of the screen. This is a bad way of doing it because if you are able to view MORE than 17 tiles at a time your aim will get fucked. + var/oy = round(544/2) //"origin" y - Basically center of the screen. + + var/angle = Atan2(y - oy, x - ox) + + in_chamber.Angle = angle + + if(chambered) + for (var/i = max(1, chambered.pellets), i > 0, i--) //Previous way of doing it fucked up math for spreading. This way, even the first projectile is part of the spread code. + if(randomspread) //Random spread + spread = (rand() - 0.5) * chambered.deviation + else //Smart spread + spread = (i / chambered.pellets - 0.5) * chambered.deviation - if(chambered) // Beep boop buckshot - var/target_x = targloc.x - var/target_y = targloc.y - var/target_z = targloc.z - if(in_chamber) - in_chamber.process() - while(chambered.buck > 0) - var/dx = round(gaussian(0,chambered.deviation),1) - var/dy = round(gaussian(0,chambered.deviation),1) - targloc = locate(target_x+dx, target_y+dy, target_z) - if(!targloc || targloc == curloc) - break in_chamber = new chambered.projectile_type() prepare_shot(in_chamber) in_chamber.original = target @@ -210,26 +230,19 @@ in_chamber.current = curloc in_chamber.yo = targloc.y - curloc.y in_chamber.xo = targloc.x - curloc.x + if(spread) + in_chamber.Angle += chambered.spread if(in_chamber) in_chamber.process() - chambered.buck-- - - - if(params) - var/list/mouse_control = params2list(params) - if(mouse_control["icon-x"]) - in_chamber.p_x = text2num(mouse_control["icon-x"]) - if(mouse_control["icon-y"]) - in_chamber.p_y = text2num(mouse_control["icon-y"]) - - spawn() + else + if(spread) + in_chamber.Angle += chambered.spread if(in_chamber) in_chamber.process() - sleep(1) - in_chamber = null + sleep(1) + in_chamber = null update_icon() - if(user.hand) user.update_inv_l_hand() else @@ -378,4 +391,5 @@ if(F) if(F.on) user.AddLuminosity(-F.brightness_on) - SetLuminosity(F.brightness_on) \ No newline at end of file + SetLuminosity(F.brightness_on) + diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 8424fb54b69..0bb0b887a6e 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -60,6 +60,10 @@ var/chatlog_attacks = 1 + var/speed = 1 //Amount of deciseconds it takes for projectile to travel. Animation is adjusted accordingly. + var/Angle = 0 //For new projectiles + var/spread = 0 //Amount of degrees by which the projectiles will be spread DURING MOVEMENT. It exists for chaotic types of projectiles, like bees or something. + proc/delete() // Garbage collect the projectiles loc = null From a05e70585e8c111b559a96436f97ab3558810b97 Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Fri, 8 May 2015 17:59:42 -0400 Subject: [PATCH 05/13] Fixes --- code/modules/projectiles/ammunition.dm | 2 +- code/modules/projectiles/ammunition/ammo_casings.dm | 7 ++++--- code/modules/projectiles/projectile.dm | 1 + 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 4bd1032aa4a..6b23a7dae2f 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -10,7 +10,7 @@ var/caliber = "" //Which kind of guns it can be loaded into var/projectile_type = ""//The bullet type to create when New() is called var/obj/item/projectile/BB = null //The loaded bullet - var/pellets = 0 + var/pellets = 1 var/deviation = 0 var/spread = 0 diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index 0e56fb17009..50b5aa6ad6c 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -48,6 +48,7 @@ projectile_type = "/obj/item/projectile/bullet/pellet" pellets = 5 deviation = 0.8 + deviation = 30 /obj/item/ammo_casing/shotgun/beanbag @@ -65,7 +66,7 @@ projectile_type = "/obj/item/projectile/bullet/pellet/weak" m_amt = 250 pellets = 5 - deviation = 0.8 + deviation = 30 /obj/item/ammo_casing/shotgun/improvised/overload name = "overloaded improvised shell" @@ -121,7 +122,7 @@ icon_state = "ishell2" projectile_type = "/obj/item/projectile/bullet/incendiary/shell/dragonsbreath" pellets = 4 - deviation = 0.9 + deviation = 30 /obj/item/ammo_casing/shotgun/ion name = "ion shell" @@ -130,7 +131,7 @@ icon_state = "ionshell" projectile_type = /obj/item/projectile/ion/weak pellets = 4 - deviation = 0.9 + deviation = 30 /obj/item/ammo_casing/shotgun/laserslug name = "laser slug" diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 0bb0b887a6e..251b9b568ea 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -19,6 +19,7 @@ pass_flags = PASSTABLE mouse_opacity = 0 hitsound = 'sound/weapons/pierce.ogg' + animate_movement = 0 var/bumped = 0 //Prevents it from hitting more than one guy at once var/def_zone = "" //Aiming at var/mob/firer = null//Who shot it From a02f56071138d4860ef3a2afa27205e4340f6d6d Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Fri, 8 May 2015 18:32:00 -0400 Subject: [PATCH 06/13] [Goonchem] Cryox/Clonex Change --- code/game/objects/items/random_items.dm | 2 +- code/game/objects/items/weapons/grenades.dm | 2 +- code/modules/reagents/Chemistry-Reagents.dm | 18 ++---------------- code/modules/reagents/Chemistry-Recipes.dm | 14 +++----------- code/setup.dm | 2 +- 5 files changed, 8 insertions(+), 30 deletions(-) diff --git a/code/game/objects/items/random_items.dm b/code/game/objects/items/random_items.dm index 0bbd8ba35aa..1a6ab66a72e 100644 --- a/code/game/objects/items/random_items.dm +++ b/code/game/objects/items/random_items.dm @@ -61,7 +61,7 @@ // identify_probability = 0 New() ..() - var/global/list/chems_only = list("slimejelly","blood","water","lube","charcoal","toxin","cyanide","morphine","epinephrine","space_drugs","serotrotium","oxygen","copper","nitrogen","hydrogen","potassium","mercury","sulfur","carbon","chlorine","fluorine","sodium","phosphorus","lithium","sugar","sacid","facid","glycerol","radium","mutadone","thermite","mutagen","virusfood","iron","gold","silver","uranium","aluminum","silicon","fuel","cleaner","atrazine","plasma","teporone","lexorin","silver_sulfadiazine","salbutamol","perfluorodecalin","omnizine","synaptizine","haloperidol","potass_iodide","pen_acid","mannitol","oculine","styptic_powder","methamphetamine","cryoxadone","clonexadone","spaceacillin","carpotoxin","mindbreaker","fluorosurfactant","fluorosurfactant","ethanol","ammonia","diethylamine","antihol","pancuronium","lipolicide","condensedcapsaicin","frostoil","amanitin","psilocybin","enzyme","nothing","salglu_solution","antifreeze","neurotoxin") + var/global/list/chems_only = list("slimejelly","blood","water","lube","charcoal","toxin","cyanide","morphine","epinephrine","space_drugs","serotrotium","oxygen","copper","nitrogen","hydrogen","potassium","mercury","sulfur","carbon","chlorine","fluorine","sodium","phosphorus","lithium","sugar","sacid","facid","glycerol","radium","mutadone","thermite","mutagen","virusfood","iron","gold","silver","uranium","aluminum","silicon","fuel","cleaner","atrazine","plasma","teporone","lexorin","silver_sulfadiazine","salbutamol","perfluorodecalin","omnizine","synaptizine","haloperidol","potass_iodide","pen_acid","mannitol","oculine","styptic_powder","methamphetamine","cryoxadone","spaceacillin","carpotoxin","mindbreaker","fluorosurfactant","fluorosurfactant","ethanol","ammonia","diethylamine","antihol","pancuronium","lipolicide","condensedcapsaicin","frostoil","amanitin","psilocybin","enzyme","nothing","salglu_solution","antifreeze","neurotoxin") var/global/list/rare_chems = list("minttoxin","nanites","xenomicrobes","adminordrazine") var/datum/reagent/R = pick(chems_only + rare_chems) diff --git a/code/game/objects/items/weapons/grenades.dm b/code/game/objects/items/weapons/grenades.dm index 74d2038edb7..3d6c101a109 100644 --- a/code/game/objects/items/weapons/grenades.dm +++ b/code/game/objects/items/weapons/grenades.dm @@ -30,7 +30,7 @@ B1.reagents.add_reagent("blood",60) if(prob(5)) B1.reagents.add_reagent("blood",1) // Quality control problems, causes a mess - B2.reagents.add_reagent("clonexadone",30) + B2.reagents.add_reagent("cryoxadone",30) beakers += B1 beakers += B2 diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 8766271a170..b8aab9cf616 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -1270,25 +1270,11 @@ datum on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom - if(M.bodytemperature < 170) - M.adjustCloneLoss(-1) + if(M.bodytemperature < 265) + M.adjustCloneLoss(-4) M.adjustOxyLoss(-10) M.heal_organ_damage(12,12) M.adjustToxLoss(-3) - ..() - return - - clonexadone - name = "Clonexadone" - id = "clonexadone" - description = "A liquid compound similar to that used in the cloning process. Can be used to 'finish' clones that get ejected early when used in conjunction with a cryo tube." - reagent_state = LIQUID - color = "#0000C8" // rgb: 200, 165, 220 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(M.bodytemperature < 170) - M.adjustCloneLoss(-3) M.status_flags &= ~DISFIGURED ..() return diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 00f9a662b91..f4fc2e30b34 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -113,8 +113,8 @@ datum name = "mitocholide" id = "mitocholide" result = "mitocholide" - required_reagents = list("synthflesh" = 1, "clonexadone" = 1) - result_amount = 2 + required_reagents = list("synthflesh" = 1, "cryoxadone" = 1, "plasma" = 1) + result_amount = 3 holy_water name = "Holy Water" @@ -132,14 +132,6 @@ datum result_amount = 4 mix_message = "The solution bubbles softly." - clonexadone - name = "Clonexadone" - id = "clonexadone" - result = "clonexadone" - required_reagents = list("cryoxadone" = 1, "sodium" = 1) - required_catalysts = list("plasma" = 5) - result_amount = 2 - spaceacillin name = "Spaceacillin" id = "spaceacillin" @@ -983,7 +975,7 @@ datum name = "Syntiflesh" id = "syntiflesh" result = null - required_reagents = list("blood" = 5, "clonexadone" = 1) + required_reagents = list("blood" = 5, "cryoxadone" = 1) result_amount = 1 on_reaction(var/datum/reagents/holder, var/created_volume) var/location = get_turf(holder.my_atom) diff --git a/code/setup.dm b/code/setup.dm index f629ab3b14f..c14124cb929 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -795,7 +795,7 @@ var/list/be_special_flags = list( #define PULSE_THREADY 5 //occurs during hypovolemic shock //feel free to add shit to lists below var/list/tachycardics = list("coffee", "methamphetamine", "nitroglycerin", "thirteenloko", "nicotine") //increase heart rate -var/list/bradycardics = list("neurotoxin", "cryoxadone", "clonexadone", "space_drugs") //decrease heart rate +var/list/bradycardics = list("neurotoxin", "cryoxadone", "space_drugs") //decrease heart rate var/list/heartstopper = list("capulettium", "capulettium_plus") //this stops the heart var/list/cheartstopper = list() //this stops the heart when overdose is met -- c = conditional From ad691e42bfbd1f01dcc719a05e73038829e23924 Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Sat, 9 May 2015 00:11:32 -0400 Subject: [PATCH 07/13] uniquelist proc optimization (used once in code) --- code/__HELPERS/lists.dm | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index 6f5a9d4e5c1..07e37e1fa9c 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -168,11 +168,9 @@ proc/listclearnulls(list/list) //Return a list with no duplicate entries /proc/uniquelist(var/list/L) - var/list/K = list() - for(var/item in L) - if(!(item in K)) - K += item - return K + . = list() + for(var/i in L) + . |= i //Mergesort: divides up the list into halves to begin the sort /proc/sortKey(var/list/client/L, var/order = 1) From 1029e9afe1f8dbee78c0bfeeee378e0d58e2ee52 Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Sat, 9 May 2015 01:56:25 -0400 Subject: [PATCH 08/13] Ports VG's DeityLink's new explosion method --- code/controllers/configuration.dm | 4 + code/game/atoms.dm | 4 + code/game/machinery/doors/airlock.dm | 2 + code/game/machinery/doors/poddoor.dm | 25 +++++ code/game/machinery/doors/unpowered.dm | 2 +- code/game/objects/explosion.dm | 102 +++++++++++++++++- code/game/turfs/simulated/floor_types.dm | 13 +++ code/game/turfs/simulated/walls.dm | 1 + code/game/turfs/simulated/walls_mineral.dm | 4 + code/game/turfs/simulated/walls_reinforced.dm | 2 +- code/game/turfs/unsimulated/walls.dm | 1 + code/modules/admin/admin_verbs.dm | 3 +- 12 files changed, 155 insertions(+), 8 deletions(-) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index e512fefc53a..a25c43cbbaf 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -62,6 +62,7 @@ var/automute_on = 0 //enables automuting/spam prevention var/jobs_have_minimal_access = 0 //determines whether jobs use minimal access or expanded access. + var/reactionary_explosions = 0 //If we use reactionary explosions, explosions that react to walls and doors var/assistantlimit = 0 //enables assistant limiting var/assistantratio = 2 //how many assistants to security members @@ -340,6 +341,9 @@ if("protect_roles_from_antagonist") config.protect_roles_from_antagonist = 1 + if("reactionary_explosions") + config.reactionary_explosions = 1 + if ("probability") var/prob_pos = findtext(value, " ") var/prob_name = null diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 108c4c8b2f6..d5317a1586d 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -22,6 +22,10 @@ var/global/list/ghdel_profiling = list() // replaced by OPENCONTAINER flags and atom/proc/is_open_container() ///Chemistry. + + //Value used to increment ex_act() if reactionary_explosions is on + var/explosion_block = 0 + //Detective Work, used for the duplicate data points kept in the scanners var/list/original_atom diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 64f9bc02add..ec8b45ef78b 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -49,6 +49,7 @@ var/hasShocked = 0 //Prevents multiple shocks from happening var/frozen = 0 //special condition for airlocks that are frozen shut, this will look weird on not normal airlocks because of a lack of special overlays. autoclose = 1 + explosion_block = 1 /obj/machinery/door/airlock/command name = "Airlock" @@ -283,6 +284,7 @@ name = "High Tech Security Airlock" icon = 'icons/obj/doors/hightechsecurity.dmi' assembly_type = /obj/structure/door_assembly/door_assembly_highsecurity + explosion_block = 2 /obj/machinery/door/airlock/highsecurity/red name = "Secure Armory Airlock" diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index 7348a57181c..36f62d6befd 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/doors/rapid_pdoor.dmi' icon_state = "pdoor1" var/id = 1.0 + explosion_block = 3 /obj/machinery/door/poddoor/preopen icon_state = "pdoor0" @@ -24,6 +25,30 @@ else return 0 +//"BLAST" doors are obviously stronger than regular doors when it comes to BLASTS. +/obj/machinery/door/poddoor/ex_act(severity, target) + switch(severity) + if(1.0) + if(prob(80)) + qdel(src) + else + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(2, 1, src) + s.start() + if(2.0) + if(prob(20)) + qdel(src) + else + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(2, 1, src) + s.start() + + if(3.0) + if(prob(80)) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(2, 1, src) + s.start() + /obj/machinery/door/poddoor/attackby(obj/item/weapon/C as obj, mob/user as mob, params) src.add_fingerprint(user) if (!( istype(C, /obj/item/weapon/crowbar) || (istype(C, /obj/item/weapon/twohanded/fireaxe) && C:wielded == 1) )) diff --git a/code/game/machinery/doors/unpowered.dm b/code/game/machinery/doors/unpowered.dm index 8e03e874a71..90e71dc7b83 100644 --- a/code/game/machinery/doors/unpowered.dm +++ b/code/game/machinery/doors/unpowered.dm @@ -1,7 +1,7 @@ /obj/machinery/door/unpowered autoclose = 0 var/locked = 0 - + explosion_block = 1 Bumped(atom/AM) if(src.locked) diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index d8a5172888f..139788890b9 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -74,16 +74,40 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa for(var/turf/T in trange(max_range, epicenter)) var/dist = cheap_pythag(T.x - x0,T.y - y0) + if(config.reactionary_explosions) + var/turf/Trajectory = T + while(Trajectory != epicenter) + Trajectory = get_step_towards(Trajectory, epicenter) + if(Trajectory.density && Trajectory.explosion_block) + dist += Trajectory.explosion_block + + for(var/obj/machinery/door/D in Trajectory) + if(D.density && D.explosion_block) + dist += D.explosion_block + + var/throw_dist = dist + if(dist < devastation_range) dist = 1 else if(dist < heavy_impact_range) dist = 2 else if(dist < light_impact_range) dist = 3 - else continue + else dist = 0 - T.ex_act(dist) if(T) - for(var/atom_movable in T.contents) //bypass type checking since only atom/movable can be contained by turfs anyway - var/atom/movable/AM = atom_movable - if(AM) AM.ex_act(dist) +// if(flame_dist && prob(40) && !istype(T, /turf/space) && !T.density) +// PoolOrNew(/obj/effect/hotspot, T) //Mostly for ambience! + if(dist > 0) + T.ex_act(dist) + + //--- THROW ITEMS AROUND --- + + var/throw_dir = get_dir(epicenter,T) + for(var/obj/item/I in T) + spawn(0) //Simultaneously not one at a time + if(I) + var/throw_range = rand(throw_dist, max_range) + var/turf/throw_at = get_ranged_target_turf(I, throw_dir, throw_range) + I.throw_speed = 4 //Temporarily change their throw_speed for embedding purposes (Reset when it finishes throwing, regardless of hitting anything) + I.throw_at(throw_at, throw_range, 2)//Throw it at 2 speed, this is purely visual anyway. var/took = (world.timeofday-start)/10 //You need to press the DebugGame verb to see these now....they were getting annoying and we've collected a fair bit of data. Just -test- changes to explosion code using this please so we can compare @@ -109,3 +133,71 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa proc/secondaryexplosion(turf/epicenter, range) for(var/turf/tile in trange(range, epicenter)) tile.ex_act(2) + +/client/proc/check_bomb_impacts() + set name = "Check Bomb Impact" + set category = "Debug" + + var/newmode = alert("Use reactionary explosions?","Check Bomb Impact", "Yes", "No") + + var/turf/epicenter = get_turf(src) + var/dev = 0 + var/heavy = 0 + var/light = 0 + var/list/choices = list("Small Bomb","Medium Bomb","Big Bomb","Custom Bomb") + var/choice = input("Bomb Size?") in choices + switch(choice) + if(null) + return 0 + if("Small Bomb") + dev = 1 + heavy = 2 + light = 3 + if("Medium Bomb") + dev = 2 + heavy = 3 + light = 4 + if("Big Bomb") + dev = 3 + heavy = 5 + light = 7 + if("Custom Bomb") + dev = input("Devestation range (Tiles):") as num + heavy = input("Heavy impact range (Tiles):") as num + light = input("Light impact range (Tiles):") as num + + var/max_range = max(dev, heavy, light) + var/x0 = epicenter.x + var/y0 = epicenter.y + var/list/wipe_colours = list() + for(var/turf/T in trange(max_range, epicenter)) + wipe_colours += T + var/dist = cheap_pythag(T.x - x0, T.y - y0) + + if(newmode == "Yes") + var/turf/TT = T + while(TT != epicenter) + TT = get_step_towards(TT,epicenter) + if(TT.density && TT.explosion_block) + dist += TT.explosion_block + + for(var/obj/machinery/door/D in TT) + if(D.density && D.explosion_block) + dist += D.explosion_block + + if(dist < dev) + T.color = "red" + T.maptext = "Dev" + else if (dist < heavy) + T.color = "yellow" + T.maptext = "Heavy" + else if (dist < light) + T.color = "blue" + T.maptext = "Light" + else + continue + + sleep(100) + for(var/turf/T in wipe_colours) + T.color = null + T.maptext = "" diff --git a/code/game/turfs/simulated/floor_types.dm b/code/game/turfs/simulated/floor_types.dm index 91e4fd2a9b9..5ea347aa51e 100644 --- a/code/game/turfs/simulated/floor_types.dm +++ b/code/game/turfs/simulated/floor_types.dm @@ -66,6 +66,19 @@ F.make_plating() return +/turf/simulated/floor/engine/ex_act(severity,target) + switch(severity) + if(1.0) + if(prob(80)) + ReplaceWithLattice() + else if(prob(50)) + qdel(src) + else + make_plating(1) + if(2.0) + if(prob(50)) + make_plating(1) + /turf/simulated/floor/engine/cult name = "engraved floor" icon_state = "cult" diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 7dbaa7b2492..e4c61e1c754 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -16,6 +16,7 @@ opacity = 1 density = 1 blocks_air = 1 + explosion_block = 1 thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT heat_capacity = 312500 //a little over 5 cm thick , 312500 for 1 m by 2.5 m by 0.25 m plasteel wall diff --git a/code/game/turfs/simulated/walls_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm index 393ff4beb8e..6e5aa0c33a8 100644 --- a/code/game/turfs/simulated/walls_mineral.dm +++ b/code/game/turfs/simulated/walls_mineral.dm @@ -11,6 +11,7 @@ icon_state = "gold0" walltype = "gold" mineral = "gold" + explosion_block = 0 //gold is a soft metal you dingus. //var/electro = 1 //var/shocked = null @@ -29,6 +30,7 @@ icon_state = "diamond0" walltype = "diamond" mineral = "diamond" + explosion_block = 3 /turf/simulated/wall/mineral/clown name = "bananium wall" @@ -43,6 +45,7 @@ icon_state = "sandstone0" walltype = "sandstone" mineral = "sandstone" + explosion_block = 0 /turf/simulated/wall/mineral/uranium name = "uranium wall" @@ -50,6 +53,7 @@ icon_state = "uranium0" walltype = "uranium" mineral = "uranium" + explosion_block = 0 /turf/simulated/wall/mineral/uranium/proc/radiate() if(!active) diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm index 2ef06abefae..bf79c84e7c0 100644 --- a/code/game/turfs/simulated/walls_reinforced.dm +++ b/code/game/turfs/simulated/walls_reinforced.dm @@ -4,7 +4,7 @@ icon_state = "r_wall" opacity = 1 density = 1 - + explosion_block = 2 damage_cap = 200 max_temperature = 6000 diff --git a/code/game/turfs/unsimulated/walls.dm b/code/game/turfs/unsimulated/walls.dm index ca422c46cd6..27b057e5fce 100644 --- a/code/game/turfs/unsimulated/walls.dm +++ b/code/game/turfs/unsimulated/walls.dm @@ -4,6 +4,7 @@ icon_state = "riveted" opacity = 1 density = 1 + explosion_block = 2 /turf/unsimulated/wall/fakeglass name = "window" diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 5b151c850c2..ae3f2c2a5d9 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -144,7 +144,8 @@ var/list/admin_verbs_debug = list( /client/proc/toggledebuglogs, /client/proc/qdel_toggle, // /vg/ /client/proc/gc_dump_hdl, - /client/proc/debugNatureMapGenerator + /client/proc/debugNatureMapGenerator, + /client/proc/check_bomb_impacts ) var/list/admin_verbs_possess = list( /proc/possess, From 5567c99a44ff6ef512c4689f14569db7b454e90d Mon Sep 17 00:00:00 2001 From: Krausus Date: Sat, 9 May 2015 02:25:38 -0400 Subject: [PATCH 09/13] Adds drag-drop emptying to all containers Also, fixes several missing checks and a facing mistake. --- code/game/objects/items/weapons/storage/storage.dm | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index e705521954d..db813980846 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -38,11 +38,19 @@ show_to(M) return - if((allow_quick_empty || allow_quick_gather) && istype(over_object, /obj/structure/table) \ - && contents.len && over_object.Adjacent(usr)) + if ((istype(over_object, /obj/structure/table) || istype(over_object, /turf/simulated/floor)) \ + && contents.len && loc == usr && !usr.stat && !usr.restrained() && over_object.Adjacent(usr) \ + && !istype(src, /obj/item/weapon/storage/lockbox)) var/turf/T = get_turf(over_object) + if (istype(over_object, /turf/simulated/floor)) + if (get_turf(usr) != T) + return // Can only empty containers onto the floor under you + if("Yes" != alert(usr,"Empty \the [src] onto \the [T]?","Confirm","Yes","No")) + return + if(!(usr && over_object && contents.len && loc == usr && !usr.stat && !usr.restrained() && get_turf(usr) == T)) + return // Something happened while the player was thinking hide_from(usr) - usr.face_atom(src) + usr.face_atom(over_object) usr.visible_message("[usr] empties \the [src] onto \the [over_object].", "You empty \the [src] onto \the [over_object].") for(var/obj/item/I in contents) From 6dfb4a732dede0bf998c250276e2e5861e2fc8fd Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Sat, 9 May 2015 07:12:54 -0400 Subject: [PATCH 10/13] Finally done --- .../projectiles/ammunition/ammo_casings.dm | 3 +- code/modules/projectiles/gun.dm | 121 ++++++++------- code/modules/projectiles/projectile.dm | 138 +++++++++++++----- icons/obj/projectiles.dmi | Bin 33441 -> 27509 bytes 4 files changed, 161 insertions(+), 101 deletions(-) diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm index 50b5aa6ad6c..5ceb6aa386b 100644 --- a/code/modules/projectiles/ammunition/ammo_casings.dm +++ b/code/modules/projectiles/ammunition/ammo_casings.dm @@ -47,7 +47,6 @@ icon_state = "gshell" projectile_type = "/obj/item/projectile/bullet/pellet" pellets = 5 - deviation = 0.8 deviation = 30 @@ -76,7 +75,7 @@ projectile_type = /obj/item/projectile/bullet/pellet/random m_amt = 250 pellets = 5 - deviation = 1.0 + deviation = 30 /obj/item/ammo_casing/shotgun/improvised/overload/New() ..() diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index f086b38988b..4efee86bb44 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -114,11 +114,6 @@ add_fingerprint(user) - var/turf/curloc = get_turf(user) - var/turf/targloc = get_turf(target) - if (!istype(targloc) || !istype(curloc)) - return - if(!special_check(user)) return @@ -130,23 +125,40 @@ if(!process_chambered()) //CHECK return click_empty(user) - if(!in_chamber) - return - if(heavy_weapon) if(user.get_inactive_hand()) recoil = 4 //one-handed kick else recoil = initial(recoil) - in_chamber.firer = user - in_chamber.def_zone = user.zone_sel.selecting - if(targloc == curloc) - user.bullet_act(in_chamber) - qdel(in_chamber) - update_icon() + if (istype(in_chamber, /obj/item/projectile/bullet/blank)) // A hacky way of making blank shotgun shells work again. Honk. + in_chamber.delete() + in_chamber = null return + user.changeNext_move(CLICK_CD_RANGE) + + var/spread = 0 + var/turf/targloc = get_turf(target) + if(chambered) + for (var/i = max(1, chambered.pellets), i > 0, i--) //Previous way of doing it fucked up math for spreading. This way, even the first projectile is part of the spread code. + if(i != max(1, chambered.pellets)) //Have we fired the initial chambered bullet yet? + in_chamber = new chambered.projectile_type() + ready_projectile(target, user) + prepare_shot(in_chamber) + if(chambered.deviation) + if(randomspread) //Random spread + spread = (rand() - 0.5) * chambered.deviation + else //Smart spread + spread = (i / chambered.pellets - 0.5) * chambered.deviation + if(!process_projectile(targloc, user, params, spread)) + return 0 + else + ready_projectile(target, user) + prepare_shot(in_chamber) + if(!process_projectile(targloc, user, params, spread)) + return 0 + if(recoil) spawn() shake_camera(user, recoil + 1, recoil) @@ -165,31 +177,33 @@ user.visible_message("[src] flies out of [user]'s hands!", "[src] kicks out of your grip!") user.drop_item() - if (istype(in_chamber, /obj/item/projectile/bullet/blank)) // A hacky way of making blank shotgun shells work again. Honk. - in_chamber.delete() - in_chamber = null - return - + update_icon() + if(user.hand) + user.update_inv_l_hand() + else + user.update_inv_r_hand() +/obj/item/weapon/gun/proc/ready_projectile(atom/target as mob|obj|turf, mob/living/user) + in_chamber.firer = user + in_chamber.def_zone = user.zone_sel.selecting in_chamber.original = target + return + +/obj/item/weapon/gun/proc/process_projectile(var/turf/targloc, mob/living/user as mob|obj, params, spread) + var/turf/curloc = user.loc + if (!istype(targloc) || !istype(curloc) || !in_chamber) + return 0 + if(targloc == curloc) //Fire the projectile + user.bullet_act(in_chamber) + qdel(in_chamber) + update_icon() + return 1 + in_chamber.loc = get_turf(user) in_chamber.starting = get_turf(user) - in_chamber.shot_from = src - user.changeNext_move(CLICK_CD_RANGE) - in_chamber.silenced = silenced in_chamber.current = curloc in_chamber.yo = targloc.y - curloc.y in_chamber.xo = targloc.x - curloc.x - - - var/spread = 0 - if(istype(user, /mob/living/carbon)) //Instead of modifying projectile's originl pixels, we can increase spread. - var/mob/living/carbon/mob = user - if(mob.shock_stage > 120) - spread += rand(-2,2) - else if(mob.shock_stage > 70) - spread += rand(-1,1) - if(params) var/list/mouse_control = params2list(params) if(mouse_control["icon-x"]) @@ -215,38 +229,19 @@ in_chamber.Angle = angle - if(chambered) - for (var/i = max(1, chambered.pellets), i > 0, i--) //Previous way of doing it fucked up math for spreading. This way, even the first projectile is part of the spread code. - if(randomspread) //Random spread - spread = (rand() - 0.5) * chambered.deviation - else //Smart spread - spread = (i / chambered.pellets - 0.5) * chambered.deviation + if(istype(user, /mob/living/carbon)) //Increase spread based on shock + var/mob/living/carbon/mob = user + if(mob.shock_stage > 120) + spread += rand(-5,5) + else if(mob.shock_stage > 70) + spread += rand(-2,2) - in_chamber = new chambered.projectile_type() - prepare_shot(in_chamber) - in_chamber.original = target - in_chamber.loc = get_turf(user) - in_chamber.starting = get_turf(user) - in_chamber.current = curloc - in_chamber.yo = targloc.y - curloc.y - in_chamber.xo = targloc.x - curloc.x - if(spread) - in_chamber.Angle += chambered.spread - if(in_chamber) - in_chamber.process() - else - if(spread) - in_chamber.Angle += chambered.spread - if(in_chamber) - in_chamber.process() - sleep(1) - in_chamber = null - - update_icon() - if(user.hand) - user.update_inv_l_hand() - else - user.update_inv_r_hand() + if(spread) + in_chamber.Angle += spread + if(in_chamber) + in_chamber.process() + in_chamber = null + return 1 /obj/item/weapon/gun/proc/can_fire() return process_chambered() diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 251b9b568ea..a4ce8cdeac2 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -64,6 +64,7 @@ var/speed = 1 //Amount of deciseconds it takes for projectile to travel. Animation is adjusted accordingly. var/Angle = 0 //For new projectiles var/spread = 0 //Amount of degrees by which the projectiles will be spread DURING MOVEMENT. It exists for chaotic types of projectiles, like bees or something. + var/legacy = 0 //Use the legacy projectile system or new pixel movement? proc/delete() // Garbage collect the projectiles @@ -179,43 +180,108 @@ return 1 - process() - spawn while(src) - if(kill_count < 1) - del(src) - return - kill_count-- - if((!( current ) || loc == current)) - current = locate(min(max(x + xo, 1), world.maxx), min(max(y + yo, 1), world.maxy), z) - if((x == 1 || x == world.maxx || y == 1 || y == world.maxy)) - del(src) - return - step_towards(src, current) - sleep(1) - if(!bumped && !isturf(original)) - if(loc == get_turf(original)) - if(!(original in permutated)) - Bump(original) - sleep(1) - Range() - return - proc/dumbfire(var/dir) // for spacepods, go snowflake go - if(!dir) - del(src) - if(kill_count < 1) - del(src) - kill_count-- - spawn while(src) - var/turf/T = get_step(src, dir) - step_towards(src, T) - sleep(1) - if(!bumped && !isturf(original)) - if(loc == get_turf(original)) - if(!(original in permutated)) - Bump(original) - sleep(1) - return + process(var/setAngle) + if(setAngle) Angle = setAngle + if(!legacy) + spawn() //New projectile system + while(loc) + if(kill_count < 1) + qdel(src) + return + kill_count-- + if((!( current ) || loc == current)) + current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z) + if(!Angle) + Angle=round(Get_Angle(src,current)) + //world << "[Angle] angle" + //overlays.Cut() + //var/icon/I=new(initial(icon),icon_state) //using initial(icon) makes sure that the angle for that is reset as well + //I.Turn(Angle) + //I.DrawBox(rgb(255,0,0,50),1,1,32,32) + //icon = I + if(spread) //Chaotic spread + Angle += (rand() - 0.5) * spread + var/matrix/M = new//matrix(transform) + M.Turn(Angle) + transform = M + + var/Pixel_x=round(sin(Angle)+16*sin(Angle)*2) + var/Pixel_y=round(cos(Angle)+16*cos(Angle)*2) + var/pixel_x_offset = pixel_x + Pixel_x + var/pixel_y_offset = pixel_y + Pixel_y + var/new_x = x + var/new_y = y + //Not sure if using whiles for this is good + while(pixel_x_offset > 16) + //world << "Pre-adjust coords (x++): xy [pixel_x] xy offset [pixel_x_offset]" + pixel_x_offset -= 32 + pixel_x -= 32 + new_x++// x++ + while(pixel_x_offset < -16) + //world << "Pre-adjust coords (x--): xy [pixel_x] xy offset [pixel_x_offset]" + pixel_x_offset += 32 + pixel_x += 32 + new_x-- + + while(pixel_y_offset > 16) + //world << "Pre-adjust coords (y++): py [pixel_y] py offset [pixel_y_offset]" + pixel_y_offset -= 32 + pixel_y -= 32 + new_y++ + while(pixel_y_offset < -16) + //world << "Pre-adjust coords (y--): py [pixel_y] py offset [pixel_y_offset]" + pixel_y_offset += 32 + pixel_y += 32 + new_y-- + + speed = round(speed) //Just in case. + step_towards(src, locate(new_x, new_y, z)) //Original projectiles stepped towards 'current' + if(speed <= 1) //We should really only animate at speed 2 + pixel_x = pixel_x_offset + pixel_y = pixel_y_offset + else + animate(src, pixel_x = pixel_x_offset, pixel_y = pixel_y_offset, time = max(1, (speed <= 3 ? speed - 1 : speed))) + +/* + var/turf/T = get_turf(src) + if(T) + T.color = "#6666FF" + spawn(10) + T.color = initial(T.color) +*/ + + if(!bumped && ((original && original.layer>=2.75) || ismob(original))) + if(loc == get_turf(original)) + if(!(original in permutated)) + Bump(original) + Range() + sleep(max(1, speed)) + else + spawn() //Old projectile system + while(loc) + if(kill_count < 1) + qdel(src) + return + kill_count-- + if((!( current ) || loc == current)) + current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z) + if(!Angle) + Angle=round(Get_Angle(src,current)) + var/matrix/M = new//matrix(transform) + M.Turn(Angle) + transform = M //So there's no need to give icons directions again + step_towards(src, current) + if(!bumped && ((original && original.layer>=2.75) || ismob(original))) + if(loc == get_turf(original)) + if(!(original in permutated)) + Bump(original) + Range() + sleep(1) + + proc/dumbfire(var/dir) + current = get_ranged_target_turf(src, dir, world.maxx) //world.maxx is the range. Not sure how to handle this better. + process() /obj/item/projectile/test //Used to see if you can hit them. invisibility = 101 //Nope! Can't see me! diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi index 57f75b0f54e2975a7017da2a1241f3ef9dbe96f2..73177afd0bd91f531983b97bf6bfb170f3d42c7f 100644 GIT binary patch literal 27509 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

w|PPO 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 From 6ef0c009214be9e2b13001fd5cbaa9a806ff405a Mon Sep 17 00:00:00 2001 From: Krausus Date: Sat, 9 May 2015 07:41:21 -0400 Subject: [PATCH 11/13] Adds missing canmove check --- code/game/objects/items/weapons/storage/storage.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index db813980846..613fe2d844c 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -39,7 +39,7 @@ return if ((istype(over_object, /obj/structure/table) || istype(over_object, /turf/simulated/floor)) \ - && contents.len && loc == usr && !usr.stat && !usr.restrained() && over_object.Adjacent(usr) \ + && contents.len && loc == usr && !usr.stat && !usr.restrained() && usr.canmove && over_object.Adjacent(usr) \ && !istype(src, /obj/item/weapon/storage/lockbox)) var/turf/T = get_turf(over_object) if (istype(over_object, /turf/simulated/floor)) @@ -47,7 +47,7 @@ return // Can only empty containers onto the floor under you if("Yes" != alert(usr,"Empty \the [src] onto \the [T]?","Confirm","Yes","No")) return - if(!(usr && over_object && contents.len && loc == usr && !usr.stat && !usr.restrained() && get_turf(usr) == T)) + if(!(usr && over_object && contents.len && loc == usr && !usr.stat && !usr.restrained() && usr.canmove && get_turf(usr) == T)) return // Something happened while the player was thinking hide_from(usr) usr.face_atom(over_object) From bccabe6d4f87949e0e5f986c8b0a0554a32ffea1 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Sat, 9 May 2015 18:55:37 -0700 Subject: [PATCH 12/13] Add magboots stopping airflow push to LINDA This commit adds an airflow push override to humans, which triggers when the shoes they are wearing are a subtype of magboots and magpulse is active. Therefore, magboots will prevent people from being pushed around by "spacewind" or also known as airflow. --- code/modules/mob/living/carbon/human/human_defense.dm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 3ff64431933..9d58b19f77f 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -488,3 +488,11 @@ emp_act ..() return + +/mob/living/carbon/human/experience_pressure_difference(pressure_difference, direction) + if(shoes) + if(istype(shoes,/obj/item/clothing/shoes/magboots)) //TODO: Make a not-shit shoe var system to negate airflow. + var/obj/item/clothing/shoes/magboots/MB = shoes + if(MB.magpulse) + return 0 + ..() \ No newline at end of file From 533841c0a572932eb0795d7d6492c47ecd490d2c Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Sun, 10 May 2015 00:19:28 -0400 Subject: [PATCH 13/13] Fixed mobs not taking damage from explosions --- code/game/objects/explosion.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index 139788890b9..b88f63baab8 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -93,6 +93,9 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa else dist = 0 if(T) + for(var/atom_movable in T.contents) //bypass type checking since only atom/movable can be contained by turfs anyway + var/atom/movable/AM = atom_movable + if(AM) AM.ex_act(dist) // if(flame_dist && prob(40) && !istype(T, /turf/space) && !T.density) // PoolOrNew(/obj/effect/hotspot, T) //Mostly for ambience! if(dist > 0)