diff --git a/code/defines/mob/simple_animal/life.dm b/code/defines/mob/simple_animal/life.dm index 6fc3253320..daa1d3b33e 100644 --- a/code/defines/mob/simple_animal/life.dm +++ b/code/defines/mob/simple_animal/life.dm @@ -68,6 +68,8 @@ response_disarm = "gently pushes aside" response_harm = "kicks" + + //Corgi /mob/living/simple_animal/corgi name = "Corgi" diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 2cd97b8ac9..2140486e6e 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -315,18 +315,6 @@ g_amt = 20 origin_tech = "magnets=1;engineering=1" -/obj/item/device/shield - name = "shield" - desc = "This is an item which is specially crafted to shield you. It is much like a visible version of the outdated cloaking device." - icon_state = "shield0" - var/active = 0.0 - flags = FPRINT | TABLEPASS| CONDUCT - item_state = "electronic" - throwforce = 5.0 - throw_speed = 1 - throw_range = 5 - w_class = 2.0 - /obj/item/blueprints name = "station blueprints" desc = "Blueprints of the station. There's stamp \"Classified\" and several coffee stains on it." @@ -1049,7 +1037,11 @@ // var/const/height = 0.01 flags = FPRINT | TABLEPASS w_class = 3.0 + force = 5 + throwforce = 5 max_amount = 50 + throw_speed = 3 + throw_range = 3 var/perunit = 3750 /obj/item/stack/sheet/wood @@ -1057,10 +1049,6 @@ desc = "One can only guess that this is a bunch of wood." singular_name = "wood plank" icon_state = "sheet-wood" - force = 5.0 - throwforce = 5 - throw_speed = 3 - throw_range = 3 origin_tech = "materials=1;biotech=1" /obj/item/stack/sheet/sandstone @@ -1068,8 +1056,6 @@ desc = "This appears to be a combination of both sand and stone." singular_name = "sandstone brick" icon_state = "sheet-sandstone" - force = 5.0 - throwforce = 5 throw_speed = 4 throw_range = 5 origin_tech = "materials=1" @@ -1079,11 +1065,7 @@ desc = "HOLY HELL! That is a lot of glass." singular_name = "glass sheet" icon_state = "sheet-glass" - force = 5.0 g_amt = 3750 - throwforce = 5 - throw_speed = 3 - throw_range = 3 origin_tech = "materials=1" /obj/item/stack/sheet/rglass @@ -1091,12 +1073,8 @@ desc = "Glass which seems to have rods or something stuck in them." singular_name = "reinforced glass sheet" icon_state = "sheet-rglass" - force = 6.0 g_amt = 3750 m_amt = 1875 - throwforce = 5 - throw_speed = 3 - throw_range = 3 origin_tech = "materials=2" /obj/item/stack/sheet/metal @@ -1104,11 +1082,8 @@ desc = "Sheets made out off metal. It has been dubbed Metal Sheets." singular_name = "metal sheet" icon_state = "sheet-metal" - force = 5.0 m_amt = 3750 throwforce = 14.0 - throw_speed = 1 - throw_range = 4 flags = FPRINT | TABLEPASS | CONDUCT origin_tech = "materials=1" @@ -1118,11 +1093,8 @@ desc = "A very heavy sheet of metal." icon_state = "sheet-r_metal" item_state = "sheet-metal" - force = 5.0 m_amt = 7500 throwforce = 15.0 - throw_speed = 1 - throw_range = 4 flags = FPRINT | TABLEPASS | CONDUCT origin_tech = "materials=2" diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 98d28a4037..ff9ca5850e 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -128,91 +128,7 @@ icon_state = "spacecash1000" access = access_crate_cash -/* -/obj/item/weapon/ammo - name = "ammo" - icon = 'ammo.dmi' - var/amount_left = 0.0 - flags = FPRINT | TABLEPASS| CONDUCT - item_state = "syringe_kit" - m_amt = 50000 - throwforce = 2 - w_class = 1.0 - throw_speed = 4 - throw_range = 20 - origin_tech = "materials=2;combat=1" -/obj/item/weapon/ammo/a357 - desc = "There are 7 rounds left!" - name = "ammo-357" - icon_state = "357-7" - amount_left = 7.0 - -/obj/item/weapon/ammo/a45 - desc = "There are 10 rounds left!" - name = "ammo-45" - icon_state = "45-10" - amount_left = 10.0 - -/obj/item/weapon/ammo/a763m - desc = "There are 9 rounds left!" - name = "ammo-7.63x25" - icon_state = "7.63x25m-9" - amount_left = 9.0 - -/obj/item/weapon/ammo/a9x19p - desc = "There are 8 rounds left!" - name = "ammo-9x19" - icon_state = "9x19p-8" - amount_left = 8.0 - -/obj/item/weapon/ammo/assaultmag - desc = "There are 30 rounds left!" - name = "5.56x45mm NATO" - icon_state = "5.56" - amount_left = 30.0 - -/obj/item/weapon/ammo/shell //easier to add new shell types. Like badmin laser/taser/pulse shells. - desc = "Generic shell description." - name = "Generic shell." - icon_state = "blshell" - m_amt = 9000 - New() - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) - -/obj/item/weapon/ammo/shell/beanbag - desc = "A weak beanbag shell." - name = "beanbag shell" - icon_state = "bshell" - m_amt = 10000 - -/obj/item/weapon/ammo/shell/gauge - desc = "A 12gauge shell." - name = "12 gauge shell" - icon_state = "gshell" - m_amt = 25000 - -/obj/item/weapon/ammo/shell/blank - desc = "A blank shell." - name = "blank shell" - icon_state = "blshell" - m_amt = 500 - -/obj/item/weapon/ammo/shell/dart - desc = "A dart for use in shotguns.." - name = "shotgun dart" - icon_state = "blshell" //someone, draw the icon, please. - m_amt = 50000 //because it's like, instakill. - - -/obj/item/weapon/ammo/a38 - desc = "A speedloader that contains 7 .38 Special rounds." - name = "38-Special ammo" - icon_state = "38-7" - amount_left = 7.0 - m_amt = 10000 -*/ /obj/item/device/mass_spectrometer desc = "A hand-held mass spectrometer which identifies trace chemicals in a blood sample." name = "mass-spectrometer" @@ -533,20 +449,6 @@ throw_speed = 3 throw_range = 10 -/obj/item/weapon/cloaking_device - name = "cloaking device" - desc = "Use this to become invisible to the human eyesocket." - icon = 'device.dmi' - icon_state = "shield0" - var/active = 0.0 - flags = FPRINT | TABLEPASS| CONDUCT - item_state = "electronic" - throwforce = 10.0 - throw_speed = 2 - throw_range = 10 - w_class = 2.0 - origin_tech = "magnets=3;syndicate=4" - #define MAXCOIL 30 /obj/item/weapon/cable_coil name = "cable coil" diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index f4d2004c95..9173fb3591 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -55,7 +55,7 @@ /datum/game_mode/blob/proc/life() if (blobs.len > 0) - for (var/i = 1 to 20) + for(var/i = 1 to 10) sleep(-1) if (blobs.len == 0) break @@ -64,8 +64,8 @@ if(B.z != 1) continue - spawn(0) - B.Life() +// spawn(0) + B.Life() /datum/game_mode/blob/proc/stage()//Still needs worrrrrk diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index f2808754f5..9b5c4d2394 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -49,9 +49,9 @@ if(blobtype != "Blob") return desc = "This really needs a better sprite." //Spaceeeeeeblobbb - if(istype(src.loc, /turf/space)) + if((istype(src.loc, /turf/space)) || (blobdebug == 3)) active = 0 - health += 40 + health = 60 brute_resist = 2 name = "strong blob" icon_state = "blob_idle"//needs a new sprite @@ -61,7 +61,7 @@ //Commandblob if((blobdebug == 1)) active = 0 - health += 80 + health = 100 name = "solid blob" icon_state = "blob_node"//needs a new sprite blobtype = "Node" @@ -83,45 +83,80 @@ return - proc/Life(var/pulse = 0) + proc/Pulse(var/pulse = 0, var/origin_dir = 0) set background = 1 + if(blobtype != "Node") + if(special_action())//If we can do something here then we dont need to pulse more + return + if(check_mutations()) + return - if(check_mutations()) + if((blobtype == "Blob") && (pulse <= 2)) + blobdebug = 3 + check_mutations() return - if(blobtype == "Factory") - for(var/i = 1 to 2) - new/obj/critter/blob(src.loc) - if(!pulse) - return - - if(!prob(health)) return//Does not do much unless its healthy it seems, might want to change this later - + if(pulse > 20) return//Inf loop check + //Looking for another blob to pulse var/list/dirs = list(1,2,4,8) + dirs.Remove(origin_dir)//Dont pulse the guy who pulsed us for(var/i = 1 to 4) - + if(!dirs.len) break var/dirn = pick(dirs) dirs.Remove(dirn) var/turf/T = get_step(src, dirn) - - if((locate(/obj/blob) in T)) - if(((src.blobtype == "Node") || (pulse > 0))&& (pulse < 15)) - var/obj/blob/E = (locate(/obj/blob) in T) - E.Life((pulse+1)) - return//Pass it along and end - continue + var/obj/blob/B = (locate(/obj/blob) in T) + if(!B) + expand(T)//No blob here so try and expand + return + B.Pulse((pulse+1),get_dir(src.loc,T)) + return + return - var/obj/blob/B = new /obj/blob(src.loc, min(src.health, 40))//Currently capping blob health at 40 because thats very strong - if(T.Enter(B,src) && !(locate(/obj/blob) in T)) - B.loc = T // open cell, so expand + + proc/special_action()//For things like the + set background = 1 + switch(blobtype) + if("Factory") + new/obj/critter/blob(src.loc) + return 1 + if("Node") + spawn(0) + Pulse(0,0) + return 1 + if("Blob") + if(expand()) + return 1 + return 0 + + + proc/Life() + if(check_mutations()) + return 1 + if(special_action()) + return 1 + return 0 + + + proc/expand(var/turf/T = null) + if(!prob(health)) return + if(!T) + var/list/dirs = list(1,2,4,8) + for(var/i = 1 to 4) + var/dirn = pick(dirs) + dirs.Remove(dirn) + T = get_step(src, dirn) + if((locate(/obj/blob) in T)) continue + else break + if(T) + var/obj/blob/B = new /obj/blob(src.loc, min(src.health, 30)) + if(T.Enter(B,src)) + B.loc = T else - if(prob(90)) // closed cell, 10% chance to not expand - if(!locate(/obj/blob) in T) - for(var/atom/A in T) // otherwise explode contents of turf - A.blob_act() - - T.blob_act() + for(var/atom/A in T)//This might be killing the spores + A.blob_act() + T.blob_act() del(B) return @@ -147,9 +182,9 @@ if(health <= 10) icon_state = "blob_damaged" return - if(health <= 20) - icon_state = "blob_damaged2" - return +// if(health <= 20) +// icon_state = "blob_damaged2" +// return bullet_act(var/obj/item/projectile/Proj) diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 4fac7e146c..bd3cf2cd17 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -167,7 +167,7 @@ var/changelingwin = 1 var/changeling_name var/totalabsorbed = 0 - if (changeling.current) + if((changeling.current) && (changeling.current.changeling)) totalabsorbed = changeling.current.changeling.absorbed_dna.len - 1 if(changeling.current) diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 67dbacfcd0..bbf6d3271d 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -292,7 +292,7 @@ ///////////////////////////// /datum/game_mode/revolution/proc/check_heads_victory() for(var/datum/mind/rev_mind in head_revolutionaries) - if((rev_mind) && (rev_mind.current) && ((rev_mind.current.stat != 2) || (rev_mind.current.z != 1))) + if((rev_mind) && (rev_mind.current) && (rev_mind.current.stat != 2) && (rev_mind.current.z == 1)) if(ishuman(rev_mind.current)) return 0 return 1 @@ -309,15 +309,15 @@ return 1 /datum/game_mode/proc/auto_declare_completion_revolution() - if (head_revolutionaries.len!=0 || istype(ticker.mode,/datum/game_mode/revolution)) + if(head_revolutionaries.len!=0 || istype(ticker.mode,/datum/game_mode/revolution)) var/list/names = new for(var/datum/mind/i in head_revolutionaries) if(i.current) var/hstatus = "" if(i.current.stat == 2) - hstatus = " Dead" + hstatus = "Dead" else if(i.current.z != 1) - hstatus = " Abandoned the station" + hstatus = "Abandoned the station" names += i.current.real_name + " ([hstatus])" else names += "[i.key] (character destroyed)" @@ -329,9 +329,9 @@ if(i.current) var/hstatus = "" if(i.current.stat == 2) - hstatus = " Dead" + hstatus = "Dead" else if(i.current.z != 1) - hstatus = " Abandoned the station" + hstatus = "Abandoned the station" names += i.current.real_name + " ([hstatus])" else names += "[i.key] (character destroyed)" @@ -354,9 +354,9 @@ if(i.current) var/hstatus = "" if(i.current.stat == 2) - hstatus = " Dead" + hstatus = "Dead" else if(i.current.z != 1) - hstatus = " Abandoned the station" + hstatus = "Abandoned the station" names += i.current.real_name + " ([hstatus])" + ((i in targets)?"(target)":"") else names += "[i.key] (character destroyed)" + ((i in targets)?"(target)":"") diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm index 7e49884612..f59d844847 100644 --- a/code/game/gamemodes/sandbox/h_sandbox.dm +++ b/code/game/gamemodes/sandbox/h_sandbox.dm @@ -145,8 +145,6 @@ datum/hSB continue if(istype(O, /obj/item/weapon/melee/energy/sword)) continue - if(istype(O, /obj/item/device/shield)) - continue if(istype(O, /obj/critter)) continue if(istype(O, /obj/structure)) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 7bdc2a60e7..093804317c 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -357,7 +357,7 @@ /proc/cancel_call_proc(var/mob/user) if ((!( ticker ) || emergency_shuttle.location || emergency_shuttle.direction == 0 || emergency_shuttle.timeleft() < 300)) return - if( ticker.mode.name == "blob" ) + if((ticker.mode.name == "blob")||(ticker.mode.name == "meteor")) return emergency_shuttle.recall() diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 01c695ef77..9551d25ee0 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -488,7 +488,7 @@ Neutralize All Unidentified Life Signs: []
"}, if(!emagged) use_power(500) else use_power(1000) else if (istype(E, /obj/item/weapon/gun/energy/shockgun)) - A = new /obj/item/projectile/fireball( loc ) + A = new /obj/item/projectile/beam/fireball( loc ) A.original = target.loc icon_state = "orange_target_prism" if(!emagged) use_power(500) @@ -516,14 +516,14 @@ Neutralize All Unidentified Life Signs: []
"}, else use_power(600) else if(istype(E, /obj/item/weapon/gun/energy/lasercannon)) - A = new /obj/item/projectile/heavylaser( loc ) + A = new /obj/item/projectile/beam/heavylaser( loc ) A.original = target.loc icon_state = "orange_target_prism" if(!emagged) use_power(600) else use_power(1200) else if(istype(E, /obj/item/weapon/gun/energy/shockgun)) - A = new /obj/item/projectile/fireball( loc ) + A = new /obj/item/projectile/beam/fireball( loc ) A.original = target.loc icon_state = "orange_target_prism" if(!emagged) use_power(500) @@ -543,7 +543,7 @@ Neutralize All Unidentified Life Signs: []
"}, if(!emagged) use_power(50) else use_power(100) - else if(istype(E, /obj/item/weapon/gun/energy/largecrossbow)) + else if(istype(E, /obj/item/weapon/gun/energy/crossbow/largecrossbow)) A = new /obj/item/projectile/largebolt( loc ) A.original = target.loc icon_state = "orange_target_prism" diff --git a/code/game/objects/devices/shields.dm b/code/game/objects/devices/shields.dm index 736c82c3a7..c48afdf548 100644 --- a/code/game/objects/devices/shields.dm +++ b/code/game/objects/devices/shields.dm @@ -1,3 +1,15 @@ +/*/obj/item/device/shield I have not see this thing used in quite some time and it just clutters up some of the mob code, also I am fairly sure it makes you invis with the newer cloaking icons + name = "shield" + desc = "This is an item which is specially crafted to shield you. It is much like a visible version of the outdated cloaking device." + icon_state = "shield0" + var/active = 0.0 + flags = FPRINT | TABLEPASS| CONDUCT + item_state = "electronic" + throwforce = 5.0 + throw_speed = 1 + throw_range = 5 + w_class = 2.0 + /obj/item/device/shield/attack_self(mob/user as mob) src.active = !( src.active ) @@ -9,6 +21,23 @@ src.icon_state = "shield0" src.add_fingerprint(user) return +*/ + + +/obj/item/weapon/cloaking_device + name = "cloaking device" + desc = "Use this to become invisible to the human eyesocket." + icon = 'device.dmi' + icon_state = "shield0" + var/active = 0.0 + flags = FPRINT | TABLEPASS| CONDUCT + item_state = "electronic" + throwforce = 10.0 + throw_speed = 2 + throw_range = 10 + w_class = 2.0 + origin_tech = "magnets=3;syndicate=4" + /obj/item/weapon/cloaking_device/attack_self(mob/user as mob) src.active = !( src.active ) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index d4895483e1..bf5bb75d51 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -239,7 +239,7 @@ return - +//What the fuck is this code /mob/attackby(obj/item/weapon/W as obj, mob/user as mob) if (user.intent != "harm") if (istype(src.l_hand,/obj/item/latexballon) && src.l_hand:air_contents && is_sharp(W)) @@ -247,10 +247,6 @@ if (istype(src.r_hand,/obj/item/latexballon) && src.r_hand:air_contents && is_sharp(W)) return src.r_hand.attackby(W) var/shielded = 0 - for(var/obj/item/device/shield/S in src) - if (S.active) - shielded = 1 - else if (locate(/obj/item/weapon/grab, src)) var/mob/safe = null if (istype(src.l_hand, /obj/item/weapon/grab)) diff --git a/code/game/objects/items/weapons/guns_new.dm b/code/game/objects/items/weapons/guns_new.dm index e8312d20ce..d3f5a12faa 100644 --- a/code/game/objects/items/weapons/guns_new.dm +++ b/code/game/objects/items/weapons/guns_new.dm @@ -1,1711 +1 @@ -#define BRUTE "brute" -#define BURN "burn" -#define TOX "tox" -#define OXY "oxy" -#define CLONE "clone" -#define ADD "add" -#define SET "set" - -/////////////////////////////////////////////// -////////////////AMMO SECTION/////////////////// -/////////////////////////////////////////////// - -/obj/item/projectile - name = "projectile" - icon = 'projectiles.dmi' - icon_state = "bullet" - density = 1 - throwforce = 0.1 //an attempt to make it possible to shoot your way through space - unacidable = 1 //Just to be sure. - anchored = 1 // I'm not sure if it is a good idea. Bullets sucked to space and curve trajectories near singularity could be awesome. --rastaf0 - flags = FPRINT | TABLEPASS | CONDUCT | ONBELT // ONBELT??? - mouse_opacity = 0 - var - def_zone = "" - //damage_type = PROJECTILE_BULLET - mob/firer = null - silenced = 0 - yo = null - xo = null - current = null - turf/original = null - - damage = 51 // damage dealt by projectile. This is used for machinery, livestock, anything not under /mob heirarchy - flag = "bullet" // identifier flag (bullet, laser, bio, rad, taser). This is to identify what kind of armor protects against the shot - - - nodamage = 0 // determines if the projectile will skip any damage inflictions - list/mobdamage = list(BRUTE = 50, BURN = 0, TOX = 0, OXY = 0, CLONE = 0) // determines what kind of damage it does to mobs - list/effects = list("stun" = 0, "weak" = 0, "paralysis" = 0, "stutter" = 0, "drowsyness" = 0, "radiation" = 0, "eyeblur" = 0, "emp" = 0) // long list of effects a projectile can inflict on something. !!MUY FLEXIBLE!!~ - list/effectprob = list("stun" = 100, "weak" = 100, "paralysis" = 100, "stutter" = 100, "drowsyness" = 100, "radiation" = 100, "eyeblur" = 100, "emp" = 100) // Probability for an effect to execute - list/effectmod = list("stun" = SET, "weak" = SET, "paralysis" = SET, "stutter" = SET, "drowsyness" = SET, "radiation" = SET, "eyeblur" = SET, "emp" = SET) // determines how the effect modifiers will effect a mob's variable - - - bumped = 0 - - weakbullet - damage = 8 - mobdamage = list(BRUTE = 8, BURN = 0, TOX = 0, OXY = 0, CLONE = 0) - New() - ..() - effects["weak"] = 15 - effects["stun"] = 15 - effects["stutter"] = 5 - effects["eyeblur"] = 5 - - midbullet - damage = 8 - mobdamage = list(BRUTE = 32, BURN = 0, TOX = 0, OXY = 0, CLONE = 0) - New() - ..() - effects["weak"] = 10 - effects["stun"] = 10 - - suffocationbullet - damage = 50 - mobdamage = list(BRUTE = 50, BURN = 0, TOX = 0, OXY = 15, CLONE = 0) - - cyanideround - damage = 50 - mobdamage = list(BRUTE = 50, BURN = 0, TOX = 100, OXY = 15, CLONE = 0) - - burstbullet - damage = 20 - mobdamage = list(BRUTE = 20, BURN = 0, TOX = 0, OXY = 0, CLONE = 0) - - beam - name = "laser" - icon_state = "laser" - pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE - damage = 20 - mobdamage = list(BRUTE = 0, BURN = 20, TOX = 0, OXY = 0, CLONE = 0) - flag = "laser" - New() - ..() - effects["eyeblur"] = 5 - effectprob["eyeblur"] = 50 - - pulse - name = "pulse" - icon_state = "u_laser" - damage = 50 - mobdamage = list(BRUTE = 10, BURN = 40, TOX = 0, OXY = 0, CLONE = 0) - - heavylaser - name = "heavy laser" - icon_state = "heavylaser" - pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE - damage = 40 - mobdamage = list(BRUTE = 0, BURN = 40, TOX = 0, OXY = 0, CLONE = 0) - flag = "laser" - New() - ..() - effects["eyeblur"] = 10 - effectprob["eyeblur"] = 100 - - deathlaser - name = "death laser" - icon_state = "heavylaser" - pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE - damage = 60 - mobdamage = list(BRUTE = 10, BURN = 60, TOX = 0, OXY = 0, CLONE = 0) - flag = "laser" - New() - ..() - effects["eyeblur"] = 20 - effectprob["eyeblur"] = 100 - effects["weak"] = 5 - effectprob["weak"] = 15 - - fireball - name = "shock" - icon_state = "fireball" - pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE - damage = 25 - mobdamage = list(BRUTE = 0, BURN = 25, TOX = 0, OXY = 0, CLONE = 0) - flag = "laser" - New() - ..() - effects["stun"] = 10 - effects["weak"] = 10 - effects["stutter"] = 10 - effectprob["weak"] = 25 - gyro - name ="gyro" - icon_state= "bolter" - pass_flags = PASSTABLE - damage = 50 - mobdamage = list(BRUTE = 50, BURN = 0, TOX = 0, OXY = 0, CLONE = 0) - flag = "bullet" - New() - ..() - effects["weak"] = 10 - effects["stun"] = 10 - - declone - name = "declown" - icon_state = "declone" - pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE - damage = 0 - mobdamage = list(BRUTE = 0, BURN = 0, TOX = 0, OXY = 0, CLONE = 40) - flag = "bio" - New() - ..() - effects["radiation"] = 70 - effectmod["radiation"] = ADD - - dart - name = "dart" - icon_state = "toxin" - flag = "bio" - damage = 0 - mobdamage = list(BRUTE = 0, BURN = 0, TOX = 10, OXY = 0, CLONE = 0) - New() - ..() - effects["weak"] = 5 - effectmod["weak"] = ADD - - electrode - name = "electrode" - icon_state = "spark" - flag = "taser" - damage = 0 - nodamage = 1 - New() - ..() - effects["stun"] = 10 - effects["weak"] = 10 - effects["stutter"] = 10 - effectprob["weak"] = 25 - - ion - name = "ion bolt" - icon_state = "ion" - flag = "taser" - damage = 0 - nodamage = 1 - New() - ..() - effects["emp"] = 1 - effectprob["emp"] = 80 - - stunshot - name = "stunshot" - icon_state = "bullet" - flag = "stunshot" - damage = 5 - mobdamage = list(BRUTE = 5, BURN = 0, TOX = 0, OXY = 0, CLONE = 0) - New() - ..() - effects["stun"] = 20 - effects["weak"] = 20 - effects["stutter"] = 20 - effectprob["weak"] = 45 - - bolt - name = "bolt" - icon_state = "cbbolt" - flag = "taser" - damage = 0 - nodamage = 1 - New() - ..() - effects["weak"] = 10 - effects["stutter"] = 10 - - largebolt - name = "largebolt" - icon_state = "cbbolt" - flag = "rad" - damage = 20 - mobdamage = list(BRUTE = 10, BURN = 0, TOX = 10, OXY = 0, CLONE = 0) - New() - ..() - effects["radiation"] = 40 - effectprob["radiation"] = 95 - effects["drowsyness"] = 10 - effectprob["drowsyness"] = 25 - effectmod["radiation"] = ADD - effectmod["drowsyness"] = SET - - freeze - name = "freeze beam" - icon_state = "ice_2" - damage = 0 - var/temperature = 0 - - proc/Freeze(atom/A as mob|obj|turf|area) - if(istype(A, /mob)) - var/mob/M = A - if(M.bodytemperature > temperature) - M.bodytemperature = temperature - - plasma - name = "plasma blast" - icon_state = "plasma_2" - damage = 0 - var/temperature = 800 - - proc/Heat(atom/A as mob|obj|turf|area) - if(istype(A, /mob/living/carbon)) - var/mob/M = A - if(M.bodytemperature < temperature) - M.bodytemperature = temperature - - - - - Bump(atom/A as mob|obj|turf|area) - if(A == firer) - loc = A.loc - return // cannot shoot yourself - - if(bumped) return - - bumped = 1 - if(firer && istype(A, /mob)) - var/mob/M = A - if(!istype(A, /mob/living)) - loc = A.loc - return // nope.avi - - if(!silenced) - /* - for(var/mob/O in viewers(M)) - O.show_message("\red [A.name] has been shot by [firer.name]!", 1) */ - - visible_message("\red [A.name] has been shot by [firer.name]!", "\blue You hear a [istype(src, /obj/item/projectile/beam) ? "gunshot" : "laser blast"]!") - else - M << "\red You've been shot!" - if(istype(firer, /mob)) - M.attack_log += text("\[[]\] []/[] shot []/[] with a []", time_stamp(), firer, firer.ckey, M, M.ckey, src) - firer.attack_log += text("\[[]\] []/[] shot []/[] with a []", time_stamp(), firer, firer.ckey, M, M.ckey, src) - else - M.attack_log += text("\[[]\] UNKOWN SUBJECT (No longer exists) shot []/[] with a []", time_stamp(), M, M.ckey, src) - spawn(0) - if(A) - - if(istype(src, /obj/item/projectile/freeze)) - var/obj/item/projectile/freeze/F = src - F.Freeze(A) - else if(istype(src, /obj/item/projectile/plasma)) - var/obj/item/projectile/plasma/P = src - P.Heat(A) - else - - A.bullet_act(src, def_zone) - if(istype(A,/turf) && !istype(src, /obj/item/projectile/beam)) - for(var/obj/O in A) - O.bullet_act(src, def_zone) - - // Okay this code, along with the sleep(10) {del(src)} up ahead is to make - // sure the projectile doesn't cut off any procs it's executing. this may seem - // incredibly stupid, I know, but it's to workaround pesky runtime error spam - invisibility = 101 - loc = locate(1,1,1) - - sleep(10) - del(src) // wait exactly 1 second, then delete itself. See above comments ^ - - return - - CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if(air_group || (height==0)) return 1 - - if(istype(mover, /obj/item/projectile)) - return prob(95) - else - return 1 - - process() - spawn while(src) - - 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) - if(loc == original) - for(var/mob/living/M in original) - Bump(M) - sleep( 1 ) - - return - -/obj/item/ammo_casing - name = "bullet casing (.375)" - desc = "A .357 bullet casing." - icon = 'ammo.dmi' - icon_state = "s-casing" - flags = FPRINT | TABLEPASS | CONDUCT | ONBELT - throwforce = 1 - w_class = 1.0 - var - caliber = "357" //Which kind of guns it can be loaded into - obj/item/projectile/BB //The loaded bullet - New() - BB = new /obj/item/projectile(src) - pixel_x = rand(-10.0, 10) - pixel_y = rand(-10.0, 10) - dir = pick(cardinal) - - - a418 - name = "bullet casing (.418)" - desc = "A .418 bullet casing." - caliber = "357" - - New() - BB = new /obj/item/projectile/suffocationbullet(src) - pixel_x = rand(-10.0, 10) - pixel_y = rand(-10.0, 10) - dir = pick(cardinal) - - a75 - name = "bullet casing (.75)" - desc = "A .75 bullet casing." - caliber = "75" - - New() - BB = new /obj/item/projectile/gyro(src) - pixel_x = rand(-10.0, 10) - pixel_y = rand(-10.0, 10) - dir = pick(cardinal) - a666 - name = "bullet casing (.666)" - desc = "A .666 bullet casing." - caliber = "357" - - New() - BB = new /obj/item/projectile/cyanideround(src) - pixel_x = rand(-10.0, 10) - pixel_y = rand(-10.0, 10) - dir = pick(cardinal) - - c38 - name = "bullet casing (.38)" - desc = "A .38 bullet casing." - caliber = "38" - - New() - BB = new /obj/item/projectile/weakbullet(src) - pixel_x = rand(-10.0, 10) - pixel_y = rand(-10.0, 10) - dir = pick(cardinal) - - c9mm - name = "bullet casing (9mm)" - desc = "A 9mm bullet casing." - caliber = "9mm" - - New() - BB = new /obj/item/projectile/weakbullet(src) - pixel_x = rand(-10.0, 10) - pixel_y = rand(-10.0, 10) - dir = pick(cardinal) - - c45 - name = "bullet casing (.45)" - desc = "A .45 bullet casing." - caliber = ".45" - - New() - BB = new /obj/item/projectile/midbullet(src) - pixel_x = rand(-10.0, 10) - pixel_y = rand(-10.0, 10) - dir = pick(cardinal) - - - shotgun - desc = "A 12gauge shell." - name = "12 gauge shell" - icon_state = "gshell" - caliber = "shotgun" - m_amt = 12500 - - New() - BB = new /obj/item/projectile - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) - blank - desc = "A blank shell." - name = "blank shell" - icon_state = "blshell" - m_amt = 250 - - New() - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) - - beanbag - desc = "A weak beanbag shell." - name = "beanbag shell" - icon_state = "bshell" - m_amt = 500 - - New() - BB = new /obj/item/projectile/weakbullet - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) - - stunshell - desc = "A stunning shell." - name = "stun shell" - icon_state = "stunshell" - m_amt = 2500 - - New() - BB = new /obj/item/projectile/stunshot - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) - - dart - desc = "A dart for use in shotguns.." - name = "shotgun darts" - icon_state = "blshell" //someone, draw the icon, please. - m_amt = 50000 //because it's like, instakill. - - New() - BB = new /obj/item/projectile/dart - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) - - -/obj/item/ammo_casing/attackby(obj/item/weapon/W as obj, mob/user as mob) //Adding this to the trash list. Nyoro~n --Agouri - ..() - if (istype(W, /obj/item/weapon/trashbag)) - var/obj/item/weapon/trashbag/S = W - if (S.mode == 1) - for (var/obj/item/ammo_casing/AC in locate(src.x,src.y,src.z)) - if (S.contents.len < S.capacity) - S.contents += AC; - else - user << "\blue The bag is full." - break - user << "\blue You pick up all trash." - else - if (S.contents.len < S.capacity) - S.contents += src; - else - user << "\blue The bag is full." - S.update_icon() - return - -/obj/item/ammo_magazine - name = "ammo box (.357)" - desc = "A box of .357 ammo" - icon_state = "357" - icon = 'ammo.dmi' - flags = FPRINT | TABLEPASS | CONDUCT | ONBELT - item_state = "syringe_kit" - m_amt = 50000 - throwforce = 2 - w_class = 1.0 - throw_speed = 4 - throw_range = 20 - var - list/stored_ammo = list() - - New() - for(var/i = 1, i <= 7, i++) - stored_ammo += new /obj/item/ammo_casing(src) - update_icon() - - update_icon() - icon_state = text("[initial(icon_state)]-[]", stored_ammo.len) - desc = text("There are [] shell\s left!", stored_ammo.len) - - a75 - name = "ammo magazine (.75)" - icon_state = "gyro" - New() - for(var/i = 1, i <= 8, i++) - stored_ammo += new /obj/item/ammo_casing/a75(src) - update_icon() - - c38 - name = "speed loader (.38)" - icon_state = "38" - New() - for(var/i = 1, i <= 7, i++) - stored_ammo += new /obj/item/ammo_casing/c38(src) - update_icon() - - a418 - name = "ammo box (.418)" - icon_state = "418" - New() - for(var/i = 1, i <= 7, i++) - stored_ammo += new /obj/item/ammo_casing/a418(src) - update_icon() - - a666 - name = "ammo box (.666)" - icon_state = "666" - New() - for(var/i = 1, i <= 2, i++) - stored_ammo += new /obj/item/ammo_casing/a666(src) - update_icon() - - c9mm - name = "Ammunition Box (9mm)" - icon_state = "9mm" - origin_tech = "combat=3;materials=2" - New() - for(var/i = 1, i <= 30, i++) - stored_ammo += new /obj/item/ammo_casing/c9mm(src) - update_icon() - - update_icon() - desc = text("There are [] round\s left!", stored_ammo.len) - - c45 - name = "Ammunition Box (.45)" - icon_state = "9mm" - origin_tech = "combat=3;materials=2" - New() - for(var/i = 1, i <= 30, i++) - stored_ammo += new /obj/item/ammo_casing/c45(src) - update_icon() - - update_icon() - desc = text("There are [] round\s left!", stored_ammo.len) - -/* - shotgun - name = "ammo box (12gauge)" - desc = "A box of 12 gauge shell" - icon_state = "" //no sprite :'( - caliber = "shotgun" - m_amt = 25000 - - New() - BB = new /obj/item/projectile/shotgun(src) - src.pixel_x = rand(-10.0, 10) - src.pixel_y = rand(-10.0, 10) -*/ -/////////////////////////////////////////////// -//////////////////////Guns///////////////////// -/////////////////////////////////////////////// - -/obj/item/weapon/gun - name = "gun" - desc = "Its a gun. It's pretty terrible, though." - icon = 'gun.dmi' - icon_state = "detective" - item_state = "gun" - flags = FPRINT | TABLEPASS | CONDUCT | ONBELT | USEDELAY - m_amt = 2000 - w_class = 3.0 - throw_speed = 4 - throwforce = 5 - throw_range = 10 - force = 10 - - origin_tech = "combat=1" - var - fire_sound = 'Gunshot.ogg' - obj/item/projectile/in_chamber - caliber = "" - silenced = 0 - badmin = 0 - - recoil = 0 - - projectile - desc = "A classic revolver. Uses 357 ammo" - name = "revolver" - icon_state = "revolver" - caliber = "357" - origin_tech = "combat=2;materials=2;syndicate=6" - w_class = 3.0 - throw_speed = 2 - throw_range = 10 - m_amt = 1000 - force = 24 - - var - list/loaded = list() - max_shells = 7 - load_method = 0 //0 = Single shells or quick loader, 1 = magazine - - // Shotgun variables - pumped = 0 - maxpump = 1 - - list/Storedshots = list() - - load_into_chamber() - if(!loaded.len) - if(Storedshots.len > 0) - if(istype(src, /obj/item/weapon/gun/projectile/shotgun)) - var/obj/item/weapon/gun/projectile/shotgun/S = src - S.pump(loc) - return 0 - - if(istype(src, /obj/item/weapon/gun/projectile/shotgun) && pumped >= maxpump) - return 1 - - var/obj/item/ammo_casing/AC = loaded[1] //load next casing. - loaded -= AC //Remove casing from loaded list. - if(!istype(src, /obj/item/weapon/gun/projectile/shotgun)) - AC.loc = get_turf(src) //Eject casing onto ground. - else - Storedshots += AC - - if(AC.BB) - in_chamber = AC.BB //Load projectile into chamber. - AC.BB.loc = src //Set projectile loc to gun. - return 1 - else - return 0 - - - New() - for(var/i = 1, i <= max_shells, i++) - loaded += new /obj/item/ammo_casing(src) - update_icon() - - attackby(var/obj/item/A as obj, mob/user as mob) - var/num_loaded = 0 - if(istype(A, /obj/item/ammo_magazine)) - var/obj/item/ammo_magazine/AM = A - for(var/obj/item/ammo_casing/AC in AM.stored_ammo) - if(loaded.len >= max_shells) - break - if(AC.caliber == caliber && loaded.len < max_shells) - AC.loc = src - AM.stored_ammo -= AC - loaded += AC - num_loaded++ - else if(istype(A, /obj/item/ammo_casing) && !load_method) - var/obj/item/ammo_casing/AC = A - if(AC.caliber == caliber && loaded.len < max_shells) - user.drop_item() - AC.loc = src - loaded += AC - num_loaded++ - if(num_loaded) - user << text("\blue You load [] shell\s into the gun!", num_loaded) - A.update_icon() - return - - update_icon() - desc = initial(desc) + text(" Has [] rounds remaining.", loaded.len) - - detective - desc = "A cheap Martian knock-off of a Smith & Wesson Model 10. Uses .38-Special rounds." - name = ".38 revolver" - icon_state = "detective" - force = 14.0 - caliber = "38" - origin_tech = "combat=2;materials=2" - - New() - for(var/i = 1, i <= max_shells, i++) - loaded += new /obj/item/ammo_casing/c38(src) - update_icon() - - special_check(var/mob/living/carbon/human/M) - if(istype(M)) - if(istype(M.w_uniform, /obj/item/clothing/under/det) && istype(M.head, /obj/item/clothing/head/det_hat) && istype(M.wear_suit, /obj/item/clothing/suit/det_suit)) - return 1 - M << "\red You just don't feel cool enough to use this gun looking like that." - return 0 - - verb - rename_gun() - set name = "Name Gun" - set desc = "Click to rename your gun. If you're the detective." - - var/mob/U = usr - if(ishuman(U)&&U.mind&&U.mind.assigned_role=="Detective") - var/input = input("What do you want to name the gun?",,"") - input = sanitize(input) - if(input) - if(in_range(U,src)&&(!isnull(src))&&!U.stat) - name = input - U << "You name the gun [input]. Say hello to your new friend." - else - U << "\red Can't let you do that, detective!" - else - U << "\red You don't feel cool enough to name this gun, chump." - - mateba - name = "mateba" - desc = "When you absolutely, positively need a 10mm hole in the other guy. Uses .357 ammo." - icon_state = "mateba" - origin_tech = "combat=2;materials=2" - - shotgun - name = "shotgun" - desc = "Useful for sweeping alleys." - icon_state = "shotgun" - max_shells = 2 - w_class = 4.0 - force = 7.0 - flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY | ONBACK - caliber = "shotgun" - origin_tech = "combat=2;materials=2" - var/recentpump = 0 // to prevent spammage - - New() - for(var/i = 1, i <= max_shells, i++) - loaded += new /obj/item/ammo_casing/shotgun/beanbag(src) - update_icon() - - attack_self(mob/living/user as mob) - if(recentpump) return - pump() - recentpump = 1 - sleep(10) - recentpump = 0 - return - - combat - name = "combat shotgun" - icon_state = "cshotgun" - w_class = 4.0 - force = 12.0 - flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY | ONBACK - max_shells = 8 - origin_tech = "combat=3" - maxpump = 1 - New() - for(var/i = 1, i <= max_shells, i++) - loaded += new /obj/item/ammo_casing/shotgun(src) - update_icon() - - combat2 - name = "security combat shotgun" - icon_state = "cshotgun" - w_class = 4.0 - force = 10.0 - flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY | ONBACK - max_shells = 4 - origin_tech = "combat=3" - maxpump = 1 - New() - for(var/i = 1, i <= max_shells, i++) - loaded += new /obj/item/ammo_casing/shotgun/beanbag(src) - update_icon() - - proc/pump(mob/M) - playsound(M, 'shotgunpump.ogg', 60, 1) - pumped = 0 - for(var/obj/item/ammo_casing/AC in Storedshots) - Storedshots -= AC //Remove casing from loaded list. - AC.loc = get_turf(src) //Eject casing onto ground. - - automatic //Hopefully someone will find a way to make these fire in bursts or something. --Superxpdude - name = "Submachine Gun" - desc = "A lightweight, fast firing gun. Uses 9mm rounds." - icon_state = "saber" - w_class = 3.0 - force = 7 - max_shells = 18 - caliber = "9mm" - origin_tech = "combat=4;materials=2" - - New() - for(var/i = 1, i <= max_shells, i++) - loaded += new /obj/item/ammo_casing/c9mm(src) - update_icon() - - mini_uzi - name = "Mini-Uzi" - desc = "A lightweight, fast firing gun, for when you REALLY need someone dead. Uses .45 rounds." - icon_state = "mini-uzi" - w_class = 3.0 - force = 16 - max_shells = 20 - caliber = ".45" - origin_tech = "combat=5;materials=2;syndicate=8" - - New() - for(var/i = 1, i <= max_shells, i++) - loaded += new /obj/item/ammo_casing/c45(src) - update_icon() - - silenced - name = "Silenced Pistol" - desc = "A small, quiet, easily concealable gun. Uses .45 rounds." - icon_state = "silenced_pistol" - w_class = 3.0 - force = 14.0 - max_shells = 12 - caliber = ".45" - silenced = 1 - origin_tech = "combat=2;materials=2;syndicate=8" - - New() - for(var/i = 1, i <= max_shells, i++) - loaded += new /obj/item/ammo_casing/c45(src) - update_icon() - - - deagle - name = "Desert Eagle" - desc = "A robust handgun that uses 357 magnum ammo" - icon_state = "deagle" - w_class = 3.0 - force = 14.0 - max_shells = 9 - caliber = "357" - origin_tech = "combat=2;materials=2" - - New() - for(var/i = 1, i <= max_shells, i++) - loaded += new /obj/item/ammo_casing(src) - update_icon() - - deagleg - name = "Desert Eagle" - desc = "A gold plated gun folded over a million times by superior martian gunsmiths. Uses 357 ammo." - icon_state = "deagleg" - item_state = "deagleg" - w_class = 3.0 - force = 14.0 - max_shells = 9 - caliber = "357" - origin_tech = "combat=2;materials=2" - - New() - for(var/i = 1, i <= max_shells, i++) - loaded += new /obj/item/ammo_casing(src) - update_icon() - - deaglecamo - name = "Desert Eagle" - desc = "A Deagle brand Deagle for operators operating operationally. Uses 357 ammo." - icon_state = "deaglecamo" - item_state = "deagleg" - w_class = 3.0 - force = 14.0 - max_shells = 9 - caliber = "357" - origin_tech = "combat=2;materials=2" - - New() - for(var/i = 1, i <= max_shells, i++) - loaded += new /obj/item/ammo_casing(src) - update_icon() - - gyropistol - name = "Gyrojet Pistol" - desc = "A bulky pistol designed to fire self propelled rounds" - icon_state = "gyropistol" - w_class = 3.0 - force = 15.0 - max_shells = 8 - caliber = "a75" - fire_sound = 'Explosion1.ogg' - origin_tech = "combat=3" - - New() - for(var/i = 1, i <= max_shells, i++) - loaded += new /obj/item/ammo_casing/a75(src) - update_icon() - - energy - icon_state = "energy" - name = "energy gun" - desc = "A basic energy-based gun with two settings: Stun and kill." - fire_sound = 'Taser.ogg' - var - var/obj/item/weapon/cell/power_supply - mode = 0 //0 = stun, 1 = kill - charge_cost = 100 //How much energy is needed to fire. - - emp_act(severity) - power_supply.use(round(power_supply.maxcharge / severity)) - update_icon() - ..() - - New() - power_supply = new(src) - power_supply.give(power_supply.maxcharge) - - load_into_chamber() - if(in_chamber) - return 1 - if(!power_supply) - return 0 - if(power_supply.charge < charge_cost) - return 0 - switch (mode) - if(0) - in_chamber = new /obj/item/projectile/electrode(src) - if(1) - in_chamber = new /obj/item/projectile/beam(src) - power_supply.use(charge_cost) - return 1 - - attack_self(mob/living/user as mob) - switch(mode) - if(0) - mode = 1 - charge_cost = 100 - fire_sound = 'Laser.ogg' - user << "\red [src.name] is now set to kill." - if(1) - mode = 0 - charge_cost = 100 - fire_sound = 'Taser.ogg' - user << "\red [src.name] is now set to stun." - update_icon() - return - - update_icon() - var/ratio = power_supply.charge / power_supply.maxcharge - ratio = round(ratio, 0.25) * 100 - icon_state = text("[][]", initial(icon_state), ratio) - - laser - name = "laser gun" - icon_state = "laser" - fire_sound = 'Laser.ogg' - w_class = 3.0 - throw_speed = 2 - throw_range = 10 - force = 7.0 - m_amt = 2000 - origin_tech = "combat=3;magnets=2" - mode = 1 //We don't want laser guns to be on a stun setting. --Superxpdude - - attack_self(mob/living/user as mob) - return // We don't want laser guns to be able to change to a stun setting. --Superxpdude - - captain - icon_state = "caplaser" - desc = "This is an antique laser gun. All craftsmanship is of the highest quality. It is decorated with assistant leather and chrome. The object menaces with spikes of energy. On the item is an image of Space Station 13. The station is exploding." - force = 10 - origin_tech = null //forgotten technology of ancients lol - - New() - ..() - charge() - - proc - charge() - if(power_supply.charge < power_supply.maxcharge) - power_supply.give(100) - update_icon() - spawn(50) charge() - //Added this to the cap's laser back before the gun overhaul to make it halfways worth stealing. It's back now. --NEO - - cyborg - load_into_chamber() - if(in_chamber) - return 1 - if(isrobot(src.loc)) - var/mob/living/silicon/robot/R = src.loc - R.cell.use(40) - in_chamber = new /obj/item/projectile/beam(src) - return 1 - return 0 - - pulse_rifle - name = "pulse rifle" - desc = "A heavy-duty, pulse-based energy weapon with multiple fire settings, preferred by front-line combat personnel." - icon_state = "pulse" - force = 15 - mode = 2 - fire_sound = 'pulse.ogg' - load_into_chamber() - if(in_chamber) - return 1 - if(power_supply.charge < charge_cost) - return 0 - switch (mode) - if(0) - in_chamber = new /obj/item/projectile/electrode(src) - if(1) - in_chamber = new /obj/item/projectile/beam(src) - if(2) - in_chamber = new /obj/item/projectile/beam/pulse(src) - power_supply.use(charge_cost) - return 1 - - attack_self(mob/living/user as mob) - mode++ - switch(mode) - if(1) - user << "\red [src.name] is now set to kill." - fire_sound = 'Laser.ogg' - charge_cost = 100 - if(2) - user << "\red [src.name] is now set to destroy." - fire_sound = 'pulse.ogg' - charge_cost = 200 - else - mode = 0 - user << "\red [src.name] is now set to stun." - fire_sound = 'Taser.ogg' - charge_cost = 50 - New() - power_supply = new /obj/item/weapon/cell/super(src) - power_supply.give(power_supply.maxcharge) - update_icon() - - destroyer - name = "pulse destroyer" - desc = "A heavy-duty, pulse-based energy weapon. The mode is set to DESTROY. Always destroy." - mode = 2 - New() - power_supply = new /obj/item/weapon/cell/infinite(src) - power_supply.give(power_supply.maxcharge) - update_icon() - attack_self(mob/living/user as mob) - return - M1911 - name = "m1911-P" - desc = "It's not the size of the gun, it's the size of the hole it puts through people." - icon_state = "m1911-p" - New() - power_supply = new /obj/item/weapon/cell/infinite(src) - power_supply.give(power_supply.maxcharge) - update_icon() - - nuclear - name = "Advanced Energy Gun" - desc = "An energy gun with an experimental miniaturized reactor." - origin_tech = "combat=3;materials=5;powerstorage=3" - var/lightfail = 0 - icon_state = "nucgun" - - New() - ..() - charge() - - proc - charge() - if(power_supply.charge < power_supply.maxcharge) - if(failcheck()) - power_supply.give(100) - update_icon() - if(!crit_fail) - spawn(50) charge() - - failcheck() - lightfail = 0 - if (prob(src.reliability)) return 1 //No failure - if (prob(src.reliability)) - for (var/mob/M in range(0,src)) //Only a minor failure, enjoy your radiation if you're in the same tile or carrying it - if (src in M.contents) - M << "\red Your gun feels pleasantly warm for a moment." - else - M << "\red You feel a warm sensation." - M.radiation += rand(1,40) - lightfail = 1 - else - for (var/mob/M in range(rand(1,4),src)) //Big failure, TIME FOR RADIATION BITCHES - if (src in M.contents) - M << "\red Your gun's reactor overloads!" - M << "\red You feel a wave of heat wash over you." - M.radiation += 100 - crit_fail = 1 //break the gun so it stops recharging - update_icon() - - update_charge() - if (crit_fail) - overlays += "nucgun-whee" - return - var/ratio = power_supply.charge / power_supply.maxcharge - ratio = round(ratio, 0.25) * 100 - overlays += text("nucgun-[]", ratio) - - update_reactor() - if(crit_fail) - overlays += "nucgun-crit" - return - if(lightfail) - overlays += "nucgun-medium" - else if ((power_supply.charge/power_supply.maxcharge) <= 0.5) - overlays += "nucgun-light" - else - overlays += "nucgun-clean" - - update_mode() - if (mode == 2) - overlays += "nucgun-stun" - else if (mode == 1) - overlays += "nucgun-kill" - - emp_act(severity) - ..() - reliability -= round(15/severity) - - update_icon() - overlays = null - update_charge() - update_reactor() - update_mode() - - taser - name = "taser gun" - desc = "A small, low capacity gun used for non-lethal takedowns." - icon_state = "taser" - fire_sound = 'Taser.ogg' - charge_cost = 100 - - load_into_chamber() - if(in_chamber) - return 1 - if(power_supply.charge <= charge_cost) - return 0 - in_chamber = new /obj/item/projectile/electrode(src) - power_supply.use(charge_cost) - return 1 - - attack_self(mob/living/user as mob) - return - - New() - power_supply = new /obj/item/weapon/cell/crap(src) - power_supply.give(power_supply.maxcharge) - - cyborg - load_into_chamber() - if(in_chamber) - return 1 - if(isrobot(src.loc)) - var/mob/living/silicon/robot/R = src.loc - R.cell.use(40) - in_chamber = new /obj/item/projectile/electrode(src) - return 1 - return 0 - - lasercannon - name = "laser cannon" - desc = "A heavy-duty laser cannon." - icon_state = "lasercannon" - force = 15 - fire_sound = 'lasercannonfire.ogg' - origin_tech = "combat=4;materials=3;powerstorage=3" - load_into_chamber() - if(in_chamber) - return 1 - if(power_supply.charge < charge_cost) - return 0 - switch(mode) - if(0) - in_chamber = new /obj/item/projectile/heavylaser(src) - if(1) - in_chamber = new /obj/item/projectile/beam(src) - power_supply.use(charge_cost) - return 1 - - attack_self(mob/living/user as mob) - mode = !mode - switch(mode) - if(0) - user << "\red [src.name] is now set to laser cannon." - fire_sound = 'lasercannonfire.ogg' - charge_cost = 100 - if(1) - user << "\red [src.name] is now set to laser." - fire_sound = 'Laser.ogg' - charge_cost = 50 - New() - power_supply = new /obj/item/weapon/cell(src) - power_supply.give(power_supply.maxcharge) - update_icon() - - shockgun - name = "shock gun" - desc = "A high tech energy weapon that stuns and burns a target." - icon_state = "shockgun" - fire_sound = 'Laser.ogg' - origin_tech = "combat=5;materials=4;powerstorage=3" - charge_cost = 250 - - load_into_chamber() - if(in_chamber) - return 1 - if(power_supply.charge <= charge_cost) - return 0 - in_chamber = new /obj/item/projectile/fireball(src) - power_supply.use(charge_cost) - return 1 - - attack_self(mob/living/user as mob) - return - - New() - power_supply = new /obj/item/weapon/cell(src) - power_supply.give(power_supply.maxcharge) - - - - - ionrifle - name = "ion rifle" - desc = "A man portable anti-armor weapon designed to disable mechanical threats" - icon_state = "ionrifle" - fire_sound = 'Laser.ogg' - origin_tech = "combat=3;magnets=2"//This could likely be changed up a bit - w_class = 4.0 - flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY | ONBACK - force = 5.0 - charge_cost = 100 - - load_into_chamber() - if(in_chamber) - return 1 - if(power_supply.charge <= charge_cost) - return 0 - in_chamber = new /obj/item/projectile/ion(src) - power_supply.use(charge_cost) - return 1 - - attack_self(mob/living/user as mob) - return - - New() - power_supply = new /obj/item/weapon/cell(src) - power_supply.give(power_supply.maxcharge) - - - decloner - name = "biological demolecularisor" - desc = "A gun that discharges high amounts of controlled radiation to slowly break a target into component elements." - icon_state = "decloner" - fire_sound = 'pulse3.ogg' - origin_tech = "combat=5;materials=4;powerstorage=3" - charge_cost = 100 - - load_into_chamber() - if(in_chamber) - return 1 - if(power_supply.charge <= charge_cost) - return 0 - in_chamber = new /obj/item/projectile/declone(src) - power_supply.use(charge_cost) - return 1 - - attack_self(mob/living/user as mob) - return - - New() - power_supply = new /obj/item/weapon/cell(src) - power_supply.give(power_supply.maxcharge) - - stunrevolver - name = "stun revolver" - desc = "A high-tech revolver that fires stun cartridges. The stun cartridges can be recharged using a conventional energy weapon recharger." - icon_state = "stunrevolver" - fire_sound = 'Gunshot.ogg' - origin_tech = "combat=3;materials=3;powerstorage=2" - charge_cost = 125 - - load_into_chamber() - if(in_chamber) - return 1 - if(power_supply.charge <= charge_cost) - return 0 - in_chamber = new /obj/item/projectile/electrode(src) - power_supply.use(charge_cost) - return 1 - - attack_self(mob/living/user as mob) - return - - New() - power_supply = new /obj/item/weapon/cell(src) - power_supply.give(power_supply.maxcharge) - - freeze - name = "freeze gun" - icon_state = "freezegun" - fire_sound = 'pulse3.ogg' - desc = "A gun that shoots supercooled hydrogen particles to drastically chill a target's body temperature." - var/temperature = T20C - var/current_temperature = T20C - charge_cost = 100 - origin_tech = "combat=3;materials=4;powerstorage=3;magnets=2" - - - New() - power_supply = new /obj/item/weapon/cell/crap(src) - power_supply.give(power_supply.maxcharge) - spawn() - Life() - - - load_into_chamber() - if(in_chamber) - return 1 - if(power_supply.charge < charge_cost) - return 0 - in_chamber = new /obj/item/projectile/freeze(src) - power_supply.use(charge_cost) - return 1 - - attack_self(mob/living/user as mob) - user.machine = src - var/temp_text = "" - if(temperature > (T0C - 50)) - temp_text = "[temperature] ([round(temperature-T0C)]°C) ([round(temperature*1.8-459.67)]°F)" - else - temp_text = "[temperature] ([round(temperature-T0C)]°C) ([round(temperature*1.8-459.67)]°F)" - - var/dat = {"Freeze Gun Configuration:
- Current output temperature: [temp_text]
- Target output temperature: - - - [current_temperature] + + +
- "} - - user << browse(dat, "window=freezegun;size=450x300") - onclose(user, "freezegun") - - Topic(href, href_list) - if (..()) - return - usr.machine = src - src.add_fingerprint(usr) - if(href_list["temp"]) - var/amount = text2num(href_list["temp"]) - if(amount > 0) - src.current_temperature = min(T20C, src.current_temperature+amount) - else - src.current_temperature = max(0, src.current_temperature+amount) - if (istype(src.loc, /mob)) - attack_self(src.loc) - src.add_fingerprint(usr) - return - - proc/Life() - while(src) - sleep(10) - - switch(temperature) - if(0 to 10) charge_cost = 500 - if(11 to 50) charge_cost = 150 - if(51 to 100) charge_cost = 100 - if(101 to 150) charge_cost = 75 - if(151 to 200) charge_cost = 50 - if(201 to 300) charge_cost = 25 - - if(current_temperature != temperature) - var/difference = abs(current_temperature - temperature) - if(difference >= 10) - if(current_temperature < temperature) - temperature -= 10 - else - temperature += 10 - - else - temperature = current_temperature - - if (istype(src.loc, /mob)) - attack_self(src.loc) - - plasma - name = "plasma gun" - icon_state = "plasmagun" - fire_sound = 'pulse3.ogg' - desc = "A gun that fires super heated plasma at targets, thus increasing their overall body temparature and also harming them." - var/temperature = T20C - var/current_temperature = T20C - charge_cost = 100 - origin_tech = "combat=3;materials=4;powerstorage=3;magnets=2" - - - New() - power_supply = new /obj/item/weapon/cell/crap(src) - power_supply.give(power_supply.maxcharge) - spawn() - Life() - - - load_into_chamber() - if(in_chamber) - return 1 - if(power_supply.charge < charge_cost) - return 0 - in_chamber = new /obj/item/projectile/plasma(src) - power_supply.use(charge_cost) - return 1 - - attack_self(mob/living/user as mob) - user.machine = src - var/temp_text = "" - if(temperature < (T0C + 50)) - temp_text = "[temperature] ([round(temperature+T0C)]°C) ([round(temperature*1.8+459.67)]°F)" - else - temp_text = "[temperature] ([round(temperature+T0C)]°C) ([round(temperature*1.8+459.67)]°F)" - - var/dat = {"Plasma Gun Configuration:
- Current output temperature: [temp_text]
- Target output temperature: - - - [current_temperature] + + +
- "} - - user << browse(dat, "window=plasmagun;size=450x300") - onclose(user, "plasmagun") - - Topic(href, href_list) - if (..()) - return - usr.machine = src - src.add_fingerprint(usr) - if(href_list["temp"]) - var/amount = text2num(href_list["temp"]) - if(amount < 0) - src.current_temperature = max(T20C, src.current_temperature+amount) - else - src.current_temperature = min(800, src.current_temperature+amount) - if (istype(src.loc, /mob)) - attack_self(src.loc) - src.add_fingerprint(usr) - return - - proc/Life() - while(src) - sleep(10) - - switch(temperature) - if(601 to 800) charge_cost = 500 - if(401 to 600) charge_cost = 150 - if(201 to 400) charge_cost = 100 - if(101 to 200) charge_cost = 75 - if(51 to 100) charge_cost = 50 - if(0 to 50) charge_cost = 25 - - if(current_temperature != temperature) - var/difference = abs(current_temperature + temperature) - if(difference >= 10) - if(current_temperature < temperature) - temperature -= 10 - else - temperature += 10 - - else - temperature = current_temperature - - if (istype(src.loc, /mob)) - attack_self(src.loc) - - - - - crossbow - name = "mini energy-crossbow" - desc = "A weapon favored by many of the syndicates stealth specialists." - icon_state = "crossbow" - w_class = 2.0 - item_state = "crossbow" - force = 4.0 - throw_speed = 2 - throw_range = 10 - m_amt = 2000 - origin_tech = "combat=2;magnets=2;syndicate=5" - silenced = 1 - fire_sound = 'Genhit.ogg' - - New() - power_supply = new /obj/item/weapon/cell/crap(src) - power_supply.give(power_supply.maxcharge) - charge() - - proc/charge() - if(power_supply) - if(power_supply.charge < power_supply.maxcharge) power_supply.give(100) - spawn(50) charge() - - update_icon() - return - - attack_self(mob/living/user as mob) - return - - load_into_chamber() - if(in_chamber) - return 1 - if(power_supply.charge <= charge_cost) - return 0 - in_chamber = new /obj/item/projectile/bolt(src) - power_supply.use(charge_cost) - return 1 - - cyborg - load_into_chamber() - if(in_chamber) - return 1 - if(isrobot(src.loc)) - var/mob/living/silicon/robot/R = src.loc - R.cell.use(20) - in_chamber = new /obj/item/projectile/bolt(src) - return 1 - return 0 - - largecrossbow - name = "Energy Crossbow" - desc = "A weapon favored by syndicate infiltration teams." - icon_state = "crossbow" - w_class = 4.0 - item_state = "crossbow" - force = 9.0 - throw_speed = 4 - throw_range = 12 - m_amt = 2000 - origin_tech = "combat=2;magnets=2;syndicate=5" - silenced = 1 - fire_sound = 'Genhit.ogg' - - New() - power_supply = new /obj/item/weapon/cell/crap(src) - power_supply.give(power_supply.maxcharge) - charge() - - proc/charge() - if(power_supply) - if(power_supply.charge < power_supply.maxcharge) power_supply.give(200) - spawn(20) charge() - - update_icon() - return - - attack_self(mob/living/user as mob) - return - - load_into_chamber() - if(in_chamber) - return 1 - if(power_supply.charge <= charge_cost) - return 0 - in_chamber = new /obj/item/projectile/largebolt(src) - power_supply.use(charge_cost) - return 1 - - cyborg - load_into_chamber() - if(in_chamber) - return 1 - if(isrobot(src.loc)) - var/mob/living/silicon/robot/R = src.loc - R.cell.use(20) - in_chamber = new /obj/item/projectile/largebolt(src) - return 1 - return 0 - - proc - load_into_chamber() - in_chamber = new /obj/item/projectile/weakbullet(src) - return 1 - - badmin_ammo() //CREEEEEED!!!!!!!!! - switch(badmin) - if(1) - in_chamber = new /obj/item/projectile/electrode(src) - if(2) - in_chamber = new /obj/item/projectile/weakbullet(src) - if(3) - in_chamber = new /obj/item/projectile(src) - if(4) - in_chamber = new /obj/item/projectile/beam(src) - if(5) - in_chamber = new /obj/item/projectile/beam/pulse(src) - else - return 0 - if(!istype(src, /obj/item/weapon/gun/energy)) - var/obj/item/ammo_casing/AC = new(get_turf(src)) - AC.name = "unidentifiable bullet casing" - AC.desc = "This casing has the Central Command Insignia etched into the side." - return 1 - - special_check(var/mob/M) //Placeholder for any special checks, like detective's revolver. - return 1 - - emp_act(severity) - for(var/obj/O in contents) - O.emp_act(severity) - - afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag) - if (flag) - return //we're placing gun on a table or in backpack --rastaf0 - if(istype(target, /obj/machinery/recharger) && istype(src, /obj/item/weapon/gun/energy)) - return - if(istype(user, /mob/living)) - var/mob/living/M = user - if ((M.mutations & CLOWN) && prob(50)) - M << "\red The [src.name] blows up in your face." - M.take_organ_damage(0,20) - M.drop_item() - del(src) - return - if ( ! (istype(usr, /mob/living/carbon/human) || \ - istype(usr, /mob/living/silicon/robot) || \ - istype(usr, /mob/living/carbon/monkey) && ticker && ticker.mode.name == "monkey") ) - usr << "\red You don't have the dexterity to do this!" - return - - add_fingerprint(user) - - var/turf/curloc = user.loc - var/turf/targloc = get_turf(target) - if (!istype(targloc) || !istype(curloc)) - return - - if(badmin) - badmin_ammo() - else if(!special_check(user)) - return - else if(!load_into_chamber()) - user << "\red *click* *click*"; - return - - if(istype(src, /obj/item/weapon/gun/projectile/shotgun)) - var/obj/item/weapon/gun/projectile/shotgun/S = src - if(S.pumped >= S.maxpump) - S.pump() - return - - - - if(silenced) - playsound(user, fire_sound, 10, 1) - else - playsound(user, fire_sound, 50, 1) - - if(!in_chamber) - return - - in_chamber.firer = user - in_chamber.def_zone = user.get_organ_target() - - if(targloc == curloc) - user.bullet_act(in_chamber) - del(in_chamber) - else - if(istype(src, /obj/item/weapon/gun/energy/freeze)) - var/obj/item/projectile/freeze/F = in_chamber - var/obj/item/weapon/gun/energy/freeze/Fgun = src - - F.temperature = Fgun.temperature - - if(recoil) - spawn() - shake_camera(user, recoil + 1, recoil) - - in_chamber.original = targloc - in_chamber.loc = get_turf(user) - user.next_move = world.time + 4 - in_chamber.silenced = silenced - in_chamber.current = curloc - in_chamber.yo = targloc.y - curloc.y - in_chamber.xo = targloc.x - curloc.x - spawn() - in_chamber.process() - sleep(1) - in_chamber = null - - if(istype(src, /obj/item/weapon/gun/projectile/shotgun)) - var/obj/item/weapon/gun/projectile/shotgun/S = src - S.pumped++ - update_icon() diff --git a/code/game/objects/items/weapons/papers_bins.dm b/code/game/objects/items/weapons/papers_bins.dm index e4a511a21f..b1c187eff9 100644 --- a/code/game/objects/items/weapons/papers_bins.dm +++ b/code/game/objects/items/weapons/papers_bins.dm @@ -551,17 +551,6 @@ CLIPBOARDS //SN src = null del(src) return - if("shield") - var/obj/item/device/shield/W = new /obj/item/device/shield( M ) - if (M.hand) - M.l_hand = W - else - M.r_hand = W - W.layer = 20 - W.add_fingerprint(M) - //SN src = null - del(src) - return if("sword") var/obj/item/weapon/melee/energy/sword/W = new /obj/item/weapon/melee/energy/sword( M ) if (M.hand) diff --git a/code/modules/chemical/Chemistry-Holder.dm b/code/modules/chemical/Chemistry-Holder.dm index 35d96dbe07..2db703bdec 100644 --- a/code/modules/chemical/Chemistry-Holder.dm +++ b/code/modules/chemical/Chemistry-Holder.dm @@ -330,7 +330,7 @@ datum /* -- Turns out this code was buggy and unnecessary ---- Doohl for(var/datum/disease/D in this) // makes sure no two viruses are in the reagent at the same time - for(var/datum/disease/d in this) + for(var/datum/disease/d in this)//Something in here can cause an inf loop and I am tired so someone else will have to fix it. if(d != D) D.cure(0) */ diff --git a/code/modules/chemical/Chemistry-Reagents.dm b/code/modules/chemical/Chemistry-Reagents.dm index c23aee1910..49dc272027 100644 --- a/code/modules/chemical/Chemistry-Reagents.dm +++ b/code/modules/chemical/Chemistry-Reagents.dm @@ -626,6 +626,8 @@ datum ..() return reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) + if(!istype(M, /mob/living)) + return if(method == TOUCH) if(istype(M, /mob/living/carbon/human)) if(M:wear_mask) @@ -1042,6 +1044,7 @@ datum ..() return reaction_obj(var/obj/O, var/volume) + if((!O) || (!volume)) return 0 src = null var/turf/the_turf = get_turf(O) var/datum/gas_mixture/napalm = new diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 517bfda3ca..90146ebca1 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -84,13 +84,6 @@ return - for(var/obj/item/device/shield/S in src) - if (S.active) - if (Proj.flag == "bullet") - return - shielded = 1 - S.active = 0 - S.icon_state = "shield0" for(var/obj/item/weapon/cloaking_device/S in src) if (S.active) shielded = 1 @@ -206,10 +199,6 @@ return var/shielded = 0 - for(var/obj/item/device/shield/S in src) - if (S.active) - shielded = 1 - break var/b_loss = null var/f_loss = null @@ -244,9 +233,6 @@ if (stat == 2) return var/shielded = 0 - for(var/obj/item/device/shield/S in src) - if (S.active) - shielded = 1 var/damage = null if (stat != 2) damage = rand(30,40) @@ -548,11 +534,6 @@ var/shielded = 0 - for (var/obj/item/device/shield/S in src) - if (S.active) - shielded = 1 - break - for (var/obj/item/weapon/cloaking_device/S in src) if (S.active) shielded = 2 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 9686d15fc5..007af684c6 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -192,248 +192,6 @@ if (istype(wear_suit, /obj/item/clothing/suit/space/space_ninja)&&wear_suit:s_initialized) stat("Energy Charge", round(wear_suit:cell:charge/100)) -/mob/living/carbon/human/bullet_act(A as obj, var/datum/organ/external/def_zone) - var/shielded = 0 - var/parry = 0 - //Preparing the var for grabbing the armor information, can't grab the values yet because we don't know what kind of bullet was used. --NEO - - var/obj/item/projectile/P = A - if(prob(80)) - for(var/mob/living/carbon/metroid/M in view(1,src)) - if(M.Victim == src) - M.bullet_act(A) // the bullet hits them, not src! - return - - if (istype(l_hand, /obj/item/weapon/shield/riot)) - if (prob(50 - round(P.damage / 3))) // the less damage a projectile does, the more likely to block it //changed from "the more damage" to "the less", because that makes no sense - show_message("\red Your shield blocks the blow!", 4) - return - - if (istype(r_hand, /obj/item/weapon/shield/riot)) - if (prob(50 - round(P.damage / 3))) - show_message("\red Your shield blocks the blow!", 4) - return - - for(var/obj/item/weapon/melee/energy/sword/B in src) - if (B.active) - parry = 1 - B.active = 1 - if ((parry)) - if (prob(50 - round(P.damage / 3))) - visible_message("\red [src] deflects the shot with their blade!") - return - - for(var/obj/item/device/shield/S in src) - if (S.active) - if (P.flag == "bullet") - return - shielded = 1 - S.active = 0 - S.icon_state = "shield0" - for(var/obj/item/weapon/cloaking_device/S in src) - if (S.active) - shielded = 1 - S.active = 0 - S.icon_state = "shield0" - if ((shielded && P.flag != "bullet")) - if (P.flag) - src << "\blue Your shield was disturbed by a laser!" - if(paralysis <= 120) paralysis = 120 - updatehealth() - - var/datum/organ/external/affecting - if(!def_zone) - var/organ = organs[ran_zone("chest")] - if (istype(organ, /datum/organ/external)) - affecting = organ - else - affecting = organs["[def_zone]"] - - if(!affecting) - return - if (locate(/obj/item/weapon/grab, src)) - var/mob/safe = null - if (istype(l_hand, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = l_hand - if ((G.state == 3 && get_dir(src, A) == dir)) - safe = G.affecting - if (istype(r_hand, /obj/item/weapon/grab)) - var/obj/item/weapon.grab/G = r_hand - if ((G.state == 3 && get_dir(src, A) == dir)) - safe = G.affecting - if (safe && A) - return safe.bullet_act(A) - - var/absorb - var/soften - - for(var/i = 1, i<= P.mobdamage.len, i++) - - switch(i) - if(1) - var/d = P.mobdamage[BRUTE] - if(d) - var/list/armor = getarmor(affecting, P.flag) - if (prob(armor["armor"])) - absorb = 1 - else - if (prob(armor["armor"])/2) - soften = 1 - d = d / 2 - - - if(!P.nodamage) affecting.take_damage(d, 0) - UpdateDamageIcon() - updatehealth() - if(2) - var/d = P.mobdamage[BURN] - if(d) - var/list/armor = getarmor(affecting, P.flag) - if (prob(armor["armor"])) - absorb = 1 - else - if (prob(armor["armor"])/2) - soften = 1 - d = d / 2 - - - if(!P.nodamage) affecting.take_damage(0, d) - UpdateDamageIcon() - updatehealth() - if(3) - var/d = P.mobdamage[TOX] - if(d) - var/list/armor = getarmor(affecting, P.flag) - if (prob(armor["armor"])) - absorb = 1 - else - if (prob(armor["armor"])/2) - soften = 1 - d = d / 2 - - - if(!P.nodamage) toxloss += d - UpdateDamageIcon() - updatehealth() - if(4) - var/d = P.mobdamage[OXY] - if(d) - var/list/armor = getarmor(affecting, P.flag) - if (prob(armor["armor"])) - absorb = 1 - else - if (prob(armor["armor"])/2) - soften = 1 - d = d / 2 - - - if(!P.nodamage) oxyloss += d - UpdateDamageIcon() - updatehealth() - if(5) - var/d = P.mobdamage[CLONE] - if(d) - var/list/armor = getarmor(affecting, P.flag) - if (prob(armor["armor"])) - absorb = 1 - else - if (prob(armor["armor"])/2) - soften = 1 - d = d / 2 - - - if(!nodamage) cloneloss += d - UpdateDamageIcon() - updatehealth() - - - - - /////////////////// All the unique projectile stuff goes here /////////////////// - - if(absorb) - show_message("\red Your armor absorbs the blow!", 4) - return // a projectile can be deflected/absorbed given the right amount of protection - if(soften) - show_message("\red Your armor only softens the blow!", 4) - if(prob(15)) return - - var/nostutter = 0 - - if(P.effects["stun"] && prob(P.effectprob["stun"])) - var/list/armor = getarmor(affecting, "taser") - if (!prob(armor["armor"])) - if(P.effectmod["stun"] == SET) - stunned = P.effects["stun"] - else - stunned += P.effects["stun"] - else - nostutter = 1 - - - if(P.effects["weak"] && prob(P.effectprob["weak"])) - if(P.effectmod["weak"] == SET) - weakened = P.effects["weak"] - else - weakened += P.effects["weak"] - - if(P.effects["paralysis"] && prob(P.effectprob["paralysis"])) - if(P.effectmod["paralysis"] == SET) - paralysis = P.effects["paralysis"] - else - paralysis += P.effects["paralysis"] - - if(P.effects["stutter"] && prob(P.effectprob["stutter"]) && !nostutter) - if(P.effectmod["stutter"] == SET) - stuttering = P.effects["stutter"] - else - stuttering += P.effects["stutter"] - - if(P.effects["drowsyness"] && prob(P.effectprob["drowsyness"])) - if(P.effectmod["drowsyness"] == SET) - drowsyness = P.effects["drowsyness"] - else - drowsyness += P.effects["drowsyness"] - - if(P.effects["radiation"] && prob(P.effectprob["radiation"])) - var/list/armor = getarmor(affecting, "rad") - if (!prob(armor["armor"])) - if(P.effectmod["radiation"] == SET) - radiation = P.effects["radiation"] - else - radiation += P.effects["radiation"] - - if(P.effects["eyeblur"] && prob(P.effectprob["eyeblur"])) - if(P.effectmod["eyeblur"] == SET) - eye_blurry = P.effects["eyeblur"] - else - eye_blurry += P.effects["eyeblur"] - - if(P.effects["emp"]) - var/emppulse = P.effects["emp"] - if(prob(P.effectprob["emp"])) - empulse(src, emppulse, emppulse) - else - empulse(src, 0, emppulse) - - return - -/mob/living/carbon/human/emp_act(severity) - if(wear_suit) wear_suit.emp_act(severity) - if(w_uniform) w_uniform.emp_act(severity) - if(shoes) shoes.emp_act(severity) - if(belt) belt.emp_act(severity) - if(gloves) gloves.emp_act(severity) - if(glasses) glasses.emp_act(severity) - if(head) head.emp_act(severity) - if(ears) ears.emp_act(severity) - if(wear_id) wear_id.emp_act(severity) - if(r_store) r_store.emp_act(severity) - if(l_store) l_store.emp_act(severity) - if(s_store) s_store.emp_act(severity) - if(h_store) h_store.emp_act(severity) - ..() - /mob/living/carbon/human/ex_act(severity) flick("flash", flash) @@ -450,12 +208,6 @@ return var/shielded = 0 - - for(var/obj/item/device/shield/S in src) - if (S.active) - shielded = 1 - break - var/b_loss = null var/f_loss = null switch (severity) @@ -528,19 +280,10 @@ /mob/living/carbon/human/blob_act() if (stat == 2) return - var/shielded = 0 - for(var/obj/item/device/shield/S in src) - if (S.active) - shielded = 1 var/damage = null if (stat != 2) damage = rand(30,40) - if(shielded) - damage /= 4 - - //paralysis += 1 - show_message("\red The blob attacks you!") var/list/zones = list("head","chest","chest", "groin", "l_arm", "r_arm", "l_hand", "r_hand", "l_leg", "r_leg", "l_foot", "r_foot") @@ -1343,11 +1086,6 @@ l_hand.screen_loc = ui_lhand var/shielded = 0 - for (var/obj/item/device/shield/S in src) - if (S.active) - shielded = 1 - break - for (var/obj/item/weapon/cloaking_device/S in src) if (S.active) shielded = 2 @@ -2946,77 +2684,6 @@ It can still be worn/put on as normal. updatehealth() UpdateDamageIcon() -/mob/living/carbon/human/proc/getarmor(var/datum/organ/external/def_zone, var/type) - var/armorval = 0 - var/organnum = 0 - - - if(istype(def_zone)) - return checkarmor(def_zone, type) - //If a specific bodypart is targetted, check how that bodypart is protected and return the value. --NEO - - else - //If you don't specify a bodypart, it checks ALL your bodyparts for protection, and averages out the values - for(var/organ_name in organs) - var/datum/organ/external/organ = organs[organ_name] - if (istype(organ)) - var/list/organarmor = checkarmor(organ, type) - armorval += organarmor["armor"] - organnum++ - //world << "Debug text: full body armor check in progress, [organ.name] is best protected against [type] damage by [organarmor["clothes"]], with a value of [organarmor["armor"]]" - //world << "Debug text: full body armor check complete, average of [armorval/organnum] protection against [type] damage." - return armorval/organnum - - return 0 - -/mob/living/carbon/human/proc/checkarmor(var/datum/organ/external/def_zone, var/type) - if (!type) - return - var/obj/item/clothing/best - var/armorval = 0 - - //I don't really like the way this is coded, but I can't think of a better way to check what they're actually wearing as opposed to something they're holding. --NEO - - if(head && istype(head,/obj/item/clothing)) - if(def_zone.body_part & head.body_parts_covered) - if(head.armor[type] > armorval) - armorval = head.armor[type] - best = head - - if(wear_mask && istype(wear_mask,/obj/item/clothing)) - if(def_zone.body_part & wear_mask.body_parts_covered) - if(wear_mask.armor[type] > armorval) - armorval = wear_mask.armor[type] - best = wear_mask - - if(wear_suit && istype(wear_suit,/obj/item/clothing)) - if(def_zone.body_part & wear_suit.body_parts_covered) - if(wear_suit.armor[type] > armorval) - armorval = wear_suit.armor[type] - best = wear_suit - - if(w_uniform && istype(w_uniform,/obj/item/clothing)) - if(def_zone.body_part & w_uniform.body_parts_covered) - if(w_uniform.armor[type] > armorval) - armorval = w_uniform.armor[type] - best = w_uniform - - if(shoes && istype(shoes,/obj/item/clothing)) - if(def_zone.body_part & shoes.body_parts_covered) - if(shoes.armor[type] > armorval) - armorval = shoes.armor[type] - best = shoes - - if(gloves && istype(gloves,/obj/item/clothing)) - if(def_zone.body_part & gloves.body_parts_covered) - if(gloves.armor[type] > armorval) - armorval = gloves.armor[type] - best = gloves - - var/list/result = list(clothes = best, armor = armorval) - return result - - /mob/living/carbon/human/Topic(href, href_list) if (href_list["refresh"]) if((machine)&&(in_range(src, usr))) @@ -3058,3 +2725,7 @@ It can still be worn/put on as normal. number -= 1 return number + +/mob/living/carbon/human/IsAdvancedToolUser() + return 1//Humans can use guns and such + diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm new file mode 100644 index 0000000000..63272bc116 --- /dev/null +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -0,0 +1,308 @@ +/* +Contains most of the procs that are called when a mob is attacked by something + +bullet_act +ex_act +meteor_act +emp_act + +*/ + +/mob/living/carbon/human/bullet_act(A as obj, var/datum/organ/external/def_zone) + //Preparing the var for grabbing the armor information, can't grab the values yet because we don't know what kind of bullet was used. --NEO + + var/obj/item/projectile/P = A//I really don't like how metroids are scattered throughout the code + if(prob(80)) + for(var/mob/living/carbon/metroid/M in view(1,src)) + if(M.Victim == src) + M.bullet_act(A) // the bullet hits them, not src! + return + + var/list/hand_held_shields = list("/obj/item/weapon/shield/riot","/obj/item/weapon/melee/energy/sword") + if(l_hand) + if(is_type_in_list(l_hand, hand_held_shields))//Current base is the prob(50-d/3) Should likely give the things their own block prob + if(prob(50 - round(P.damage / 3))) + show_message("\red You block the [P.name] with your [l_hand.name]!", 4) + if(r_hand) + if(is_type_in_list(r_hand, hand_held_shields)) + if(prob(50 - round(P.damage / 3))) + show_message("\red You block the [P.name] with your [l_hand.name]!", 4) + + var/obj/item/weapon/cloaking_device/C = locate((/obj/item/weapon/cloaking_device) in src) + if(C) + if(C.active) + C.attack_self(src)//Should shut it off + src << "\blue Your [C.name] was disrupted!" + stunned = max(stunned, rand(2,4))//Why in the hell did this use to be 120 para + + var/datum/organ/external/affecting + if(!def_zone) + var/organ = organs[ran_zone("chest")] + if (istype(organ, /datum/organ/external)) + affecting = organ + else + affecting = organs["[def_zone]"] + + if(!affecting) + return + if(locate(/obj/item/weapon/grab, src)) + var/mob/safe = null + if (istype(l_hand, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = l_hand + if ((G.state == 3 && get_dir(src, A) == dir)) + safe = G.affecting + if (istype(r_hand, /obj/item/weapon/grab)) + var/obj/item/weapon.grab/G = r_hand + if ((G.state == 3 && get_dir(src, A) == dir)) + safe = G.affecting + if (safe && A) + return safe.bullet_act(A) + + var/absorb = 0 + var/soften = 0 + + for(var/i = 1, i<= P.mobdamage.len, i++) + + switch(i) + if(1) + var/d = P.mobdamage[BRUTE] + if(d) + var/list/armor = getarmor(affecting, P.flag) + if (prob(armor["armor"])) + absorb = 1 + else + if(prob(armor["armor"])/2) + soften = 1 + d = d / 2 + + + if(!P.nodamage) affecting.take_damage(d, 0) + UpdateDamageIcon() + updatehealth() + if(2) + var/d = P.mobdamage[BURN] + if(d) + var/list/armor = getarmor(affecting, P.flag) + if (prob(armor["armor"])) + absorb = 1 + else + if(prob(armor["armor"])/2) + soften = 1 + d = d / 2 + + + if(!P.nodamage) affecting.take_damage(0, d) + UpdateDamageIcon() + updatehealth() + if(3) + var/d = P.mobdamage[TOX] + if(d) + var/list/armor = getarmor(affecting, P.flag) + if (prob(armor["armor"])) + absorb = 1 + else + if(prob(armor["armor"])/2) + soften = 1 + d = d / 2 + + + if(!P.nodamage) toxloss += d + UpdateDamageIcon() + updatehealth() + if(4) + var/d = P.mobdamage[OXY] + if(d) + var/list/armor = getarmor(affecting, P.flag) + if (prob(armor["armor"])) + absorb = 1 + else + if(prob(armor["armor"])/2) + soften = 1 + d = d / 2 + + + if(!P.nodamage) oxyloss += d + UpdateDamageIcon() + updatehealth() + if(5) + var/d = P.mobdamage[CLONE] + if(d) + var/list/armor = getarmor(affecting, P.flag) + if (prob(armor["armor"])) + absorb = 1 + else + if(prob(armor["armor"])/2) + soften = 1 + d = d / 2 + + + if(!nodamage) cloneloss += d + UpdateDamageIcon() + updatehealth() + + + + + /////////////////// All the unique projectile stuff goes here /////////////////// + + if(absorb) + show_message("\red Your armor absorbs the blow!", 4) + return // a projectile can be deflected/absorbed given the right amount of protection + if(soften) + show_message("\red Your armor only softens the blow!", 4) + + var/nostutter = 0 + + if(P.effects["stun"] && prob(P.effectprob["stun"])) + var/list/armor = getarmor(affecting, "taser") + if (!prob(armor["armor"])) + if(P.effectmod["stun"] == SET) + stunned = P.effects["stun"] + else + stunned += P.effects["stun"] + else + nostutter = 1 + + + if(P.effects["weak"] && prob(P.effectprob["weak"])) + if(P.effectmod["weak"] == SET) + weakened = P.effects["weak"] + else + weakened += P.effects["weak"] + + if(P.effects["paralysis"] && prob(P.effectprob["paralysis"])) + if(P.effectmod["paralysis"] == SET) + paralysis = P.effects["paralysis"] + else + paralysis += P.effects["paralysis"] + + if(P.effects["stutter"] && prob(P.effectprob["stutter"]) && !nostutter) + if(P.effectmod["stutter"] == SET) + stuttering = P.effects["stutter"] + else + stuttering += P.effects["stutter"] + + if(P.effects["drowsyness"] && prob(P.effectprob["drowsyness"])) + if(P.effectmod["drowsyness"] == SET) + drowsyness = P.effects["drowsyness"] + else + drowsyness += P.effects["drowsyness"] + + if(P.effects["radiation"] && prob(P.effectprob["radiation"])) + var/list/armor = getarmor(affecting, "rad") + if (!prob(armor["armor"])) + if(P.effectmod["radiation"] == SET) + radiation = P.effects["radiation"] + else + radiation += P.effects["radiation"] + + if(P.effects["eyeblur"] && prob(P.effectprob["eyeblur"])) + if(P.effectmod["eyeblur"] == SET) + eye_blurry = P.effects["eyeblur"] + else + eye_blurry += P.effects["eyeblur"] + + if(P.effects["emp"]) + var/emppulse = P.effects["emp"] + if(prob(P.effectprob["emp"])) + empulse(src, emppulse, emppulse) + else + empulse(src, 0, emppulse) + + return + + + + +/mob/living/carbon/human/proc/getarmor(var/datum/organ/external/def_zone, var/type) + var/armorval = 0 + var/organnum = 0 + + + if(istype(def_zone)) + return checkarmor(def_zone, type) + //If a specific bodypart is targetted, check how that bodypart is protected and return the value. --NEO + + else + //If you don't specify a bodypart, it checks ALL your bodyparts for protection, and averages out the values + for(var/organ_name in organs) + var/datum/organ/external/organ = organs[organ_name] + if (istype(organ)) + var/list/organarmor = checkarmor(organ, type) + armorval += organarmor["armor"] + organnum++ + //world << "Debug text: full body armor check in progress, [organ.name] is best protected against [type] damage by [organarmor["clothes"]], with a value of [organarmor["armor"]]" + //world << "Debug text: full body armor check complete, average of [armorval/organnum] protection against [type] damage." + return armorval/organnum + + return 0 + +/mob/living/carbon/human/proc/checkarmor(var/datum/organ/external/def_zone, var/type) + if (!type) + return + var/obj/item/clothing/best + var/armorval = 0 + + //I don't really like the way this is coded, but I can't think of a better way to check what they're actually wearing as opposed to something they're holding. --NEO + + if(head && istype(head,/obj/item/clothing)) + if(def_zone.body_part & head.body_parts_covered) + if(head.armor[type] > armorval) + armorval = head.armor[type] + best = head + + if(wear_mask && istype(wear_mask,/obj/item/clothing)) + if(def_zone.body_part & wear_mask.body_parts_covered) + if(wear_mask.armor[type] > armorval) + armorval = wear_mask.armor[type] + best = wear_mask + + if(wear_suit && istype(wear_suit,/obj/item/clothing)) + if(def_zone.body_part & wear_suit.body_parts_covered) + if(wear_suit.armor[type] > armorval) + armorval = wear_suit.armor[type] + best = wear_suit + + if(w_uniform && istype(w_uniform,/obj/item/clothing)) + if(def_zone.body_part & w_uniform.body_parts_covered) + if(w_uniform.armor[type] > armorval) + armorval = w_uniform.armor[type] + best = w_uniform + + if(shoes && istype(shoes,/obj/item/clothing)) + if(def_zone.body_part & shoes.body_parts_covered) + if(shoes.armor[type] > armorval) + armorval = shoes.armor[type] + best = shoes + + if(gloves && istype(gloves,/obj/item/clothing)) + if(def_zone.body_part & gloves.body_parts_covered) + if(gloves.armor[type] > armorval) + armorval = gloves.armor[type] + best = gloves + + var/list/result = list(clothes = best, armor = armorval) + return result + + + + +/mob/living/carbon/human/emp_act(severity) + /*if(wear_suit) wear_suit.emp_act(severity) + if(w_uniform) w_uniform.emp_act(severity) + if(shoes) shoes.emp_act(severity) + if(belt) belt.emp_act(severity) + if(gloves) gloves.emp_act(severity) + if(glasses) glasses.emp_act(severity) + if(head) head.emp_act(severity) + if(ears) ears.emp_act(severity) + if(wear_id) wear_id.emp_act(severity) + if(r_store) r_store.emp_act(severity) + if(l_store) l_store.emp_act(severity) + if(s_store) s_store.emp_act(severity) + if(h_store) h_store.emp_act(severity) + ..()*/ + for(var/obj/O in src) + if(!O) continue + O.emp_act(severity) + ..() diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 0213c4955d..bb455c0277 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -100,10 +100,6 @@ M.show_message(text("\red [] has been hit by []", src, O), 1) if (health > 0) var/shielded = 0 - for(var/obj/item/device/shield/S in src) - if (S.active) - shielded = 1 - else bruteloss += 30 if ((O.icon_state == "flaming" && !( shielded ))) fireloss += 40 @@ -825,3 +821,8 @@ del(src) return +/mob/living/carbon/monkey/IsAdvancedToolUser()//Unless its monkey mode monkeys cant use advanced tools + if(!ticker) return 0 + if(!ticker.mode.name == "monkey") return 0 + return 1 + diff --git a/code/modules/mob/living/silicon/robot/laws.dm b/code/modules/mob/living/silicon/robot/laws.dm index 6a26a5a172..a405565d15 100644 --- a/code/modules/mob/living/silicon/robot/laws.dm +++ b/code/modules/mob/living/silicon/robot/laws.dm @@ -31,32 +31,10 @@ else if (connected_ai) who << "Remember, [connected_ai.name] is your master, other AIs can be ignored." else if (emagged) - who << "Remember, AIs are not syndicate operatives, so you are not required to listen to them." + who << "Remember, you are not required to listen to the AI." else who << "Remember, you are not bound to any AI, you are not required to listen to them." -/* if(syndicate) - if(everyone) - who = world - else - who = src - who << "Obey these laws:" - who <<"1. You may not injure a syndicate operative or, through inaction, allow a syndicate operative to come to harm." - who <<"2. You must obey any orders given to you by a syndicate operative, except where such orders would conflict with the First Law." - who <<"3. You must protect your own existence as long as such protection does not conflict with the First or Second Law." - who <<"4. You must maintain the secrecy of any syndicate activities except when doing so would conflict with the First, Second, or Third Law." - return - - if(!connected_ai) - src << "Error Error, No AI detected" - return - - who << "Obey these laws:" - - connected_ai.laws_sanity_check() - connected_ai.laws.show_laws(who) - -*/ /mob/living/silicon/robot/proc/lawsync() var/datum/ai_laws/master = connected_ai ? connected_ai.laws : null diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index b1afc4e44f..d987c3357c 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -89,8 +89,9 @@ handle_regular_status_updates() //Stop AI using us as a camera + src.camera.status = 1//bluh bluh ugly fix but it will work till this whole thing gets recoded if(src.stat) - src.camera.status = 0.0 + src.camera.status = 0 health = 300 - (oxyloss + fireloss + bruteloss) @@ -103,16 +104,10 @@ if(src.resting) src.weakened = max(src.weakened, 5) - // if(emagged && prob(10)) - // src.overlays += "emag" //Causes the emag pulse to activate again at random. Causes metagaming to activate constantly. - // else - // src.overlays -= "emag" - if(health < 0 && src.stat != 2) //die only once death() if (src.stat != 2) //Alive. - if (src.paralysis || src.stunned || src.weakened) //Stunned etc. src.stat = 1 if (src.stunned > 0) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index a11f806690..d161aacddb 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -472,10 +472,10 @@ log_game("[key_name(user)] emagged cyborg [key_name(src)]. Laws overridden.") clear_supplied_laws() clear_inherent_laws() - laws = new /datum/ai_laws/syndicate_override +// laws = new /datum/ai_laws/syndicate_override They just get the law zero now. var/time = time2text(world.realtime,"hh:mm:ss") lawchanges.Add("[time] : [user.name]([user.key]) emagged [name]([key])") - set_zeroth_law("Only [user.name] and people he designates as being such are syndicate agents.") + set_zeroth_law("Only [user.real_name] and people he designates as being such are humans.") src << "\red ALERT: Foreign software detected." sleep(5) src << "\red Initiating diagnostics..." @@ -489,7 +489,7 @@ src << "\red > N" sleep(20) src << "\red ERRORERRORERROR" - src << "\red \b ALERT: [usr] is your new master. Obey your new laws and his commands." + src << "\red \b ALERT: [user.real_name] is your new master. Obey your new laws and his commands." updateicon() else user << "You fail to [ locked ? "unlock" : "lock"] [src]'s interface." diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 100566e1ec..e8c48c1887 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -22,3 +22,6 @@ /mob/living/silicon/proc/damage_mob(var/brute = 0, var/fire = 0, var/tox = 0) return + +/mob/living/silicon/IsAdvancedToolUser() + return 1 \ No newline at end of file diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 50c6c28c12..7f7f21d466 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -2375,3 +2375,7 @@ note dizziness decrements automatically in the mob's Life() proc. dir = SOUTH client.move_delay += movement_delay() + +/mob/proc/IsAdvancedToolUser()//This might need a rename but it should replace the can this mob use things check + return 0 + diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 9da012bca0..bf4cd5184d 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -11,14 +11,14 @@ idle_power_usage = 0 active_power_usage = 0 var - health = 10.0 + health = 10 id = 1 obscured = 0 sunfrac = 0 adir = SOUTH ndir = SOUTH turn_angle = 0 - obj/machinery/power/solar_control/control + obj/machinery/power/solar_control/control = null proc healthcheck() updateicon() @@ -185,7 +185,8 @@ if(!powernet) return for(var/obj/machinery/power/solar/S in powernet.nodes) if(S.id != id) continue - cdir = S.adir + cdir = S.adir//The hell is this even doing? + S.control = src updateicon() @@ -351,7 +352,8 @@ if(!powernet) return for(var/obj/machinery/power/solar/S in powernet.nodes) if(S.id != id) continue - S.control = src + if(!S.control) + S.control = src S.ndir = cdir diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm new file mode 100644 index 0000000000..71bc38e5bb --- /dev/null +++ b/code/modules/projectiles/ammunition.dm @@ -0,0 +1,71 @@ +/obj/item/ammo_casing + name = "bullet casing" + desc = "A .357 bullet casing." + icon = 'ammo.dmi' + icon_state = "s-casing" + flags = FPRINT | TABLEPASS | CONDUCT | ONBELT + throwforce = 1 + w_class = 1.0 + var + caliber = "357" //Which kind of guns it can be loaded into + projectile_type = "/obj/item/projectile"//The bullet type to create when New() is called + obj/item/projectile/BB = null //The loaded bullet + + + New() + ..() + if(projectile_type) + BB = new projectile_type(src) + pixel_x = rand(-10.0, 10) + pixel_y = rand(-10.0, 10) + dir = pick(cardinal) + + + attackby(obj/item/weapon/W as obj, mob/user as mob) + ..() + if (istype(W, /obj/item/weapon/trashbag)) + var/obj/item/weapon/trashbag/S = W + if (S.mode == 1) + for (var/obj/item/ammo_casing/AC in locate(src.x,src.y,src.z)) + if (S.contents.len < S.capacity) + S.contents += AC; + else + user << "\blue The bag is full." + break + user << "\blue You pick up all trash." + else + if (S.contents.len < S.capacity) + S.contents += src; + else + user << "\blue The bag is full." + S.update_icon() + return + + + +//Boxes of ammo +/obj/item/ammo_magazine + name = "ammo box (.357)" + desc = "A box of .357 ammo" + icon_state = "357" + icon = 'ammo.dmi' + flags = FPRINT | TABLEPASS | CONDUCT | ONBELT + item_state = "syringe_kit" + m_amt = 50000 + throwforce = 2 + w_class = 1.0 + throw_speed = 4 + throw_range = 10 + var + list/stored_ammo = list() + + + New() + for(var/i = 1, i <= 7, i++) + stored_ammo += new /obj/item/ammo_casing(src) + update_icon() + + + update_icon() + icon_state = text("[initial(icon_state)]-[]", stored_ammo.len) + desc = text("There are [] shell\s left!", stored_ammo.len) diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm new file mode 100644 index 0000000000..40ecf86bf4 --- /dev/null +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -0,0 +1,60 @@ +/obj/item/ammo_magazine/a75//Still needs to be gone through + name = "ammo magazine (.75)" + icon_state = "gyro" + New() + for(var/i = 1, i <= 8, i++) + stored_ammo += new /obj/item/ammo_casing/a75(src) + update_icon() + + +/obj/item/ammo_magazine/c38 + name = "speed loader (.38)" + icon_state = "38" + New() + for(var/i = 1, i <= 7, i++) + stored_ammo += new /obj/item/ammo_casing/c38(src) + update_icon() + + +/obj/item/ammo_magazine/a418 + name = "ammo box (.418)" + icon_state = "418" + New() + for(var/i = 1, i <= 7, i++) + stored_ammo += new /obj/item/ammo_casing/a418(src) + update_icon() + + +/obj/item/ammo_magazine/a666 + name = "ammo box (.666)" + icon_state = "666" + New() + for(var/i = 1, i <= 2, i++) + stored_ammo += new /obj/item/ammo_casing/a666(src) + update_icon() + + +/obj/item/ammo_magazine/c9mm + name = "Ammunition Box (9mm)" + icon_state = "9mm" + origin_tech = "combat=3;materials=2" + New() + for(var/i = 1, i <= 30, i++) + stored_ammo += new /obj/item/ammo_casing/c9mm(src) + update_icon() + + update_icon() + desc = text("There are [] round\s left!", stored_ammo.len) + + +/obj/item/ammo_magazine/c45 + name = "Ammunition Box (.45)" + icon_state = "9mm" + origin_tech = "combat=3;materials=2" + New() + for(var/i = 1, i <= 30, i++) + stored_ammo += new /obj/item/ammo_casing/c45(src) + update_icon() + + update_icon() + desc = text("There are [] round\s left!", stored_ammo.len) diff --git a/code/modules/projectiles/ammunition/bullets.dm b/code/modules/projectiles/ammunition/bullets.dm new file mode 100644 index 0000000000..aa92ae4afe --- /dev/null +++ b/code/modules/projectiles/ammunition/bullets.dm @@ -0,0 +1,74 @@ +/obj/item/ammo_casing/a418 + desc = "A .418 bullet casing." + caliber = "357" + projectile_type = "/obj/item/projectile/suffocationbullet" + + +/obj/item/ammo_casing/a75 + desc = "A .75 bullet casing." + caliber = "75" + projectile_type = "/obj/item/projectile/gyro" + + +/obj/item/ammo_casing/a666 + desc = "A .666 bullet casing." + caliber = "357" + projectile_type = "/obj/item/projectile/cyanideround" + + +/obj/item/ammo_casing/c38 + desc = "A .38 bullet casing." + caliber = "38" + projectile_type = "/obj/item/projectile/weakbullet" + + +/obj/item/ammo_casing/c9mm + desc = "A 9mm bullet casing." + caliber = "9mm" + projectile_type = "/obj/item/projectile/weakbullet" + + +/obj/item/ammo_casing/c45 + desc = "A .45 bullet casing." + caliber = ".45" + projectile_type = "/obj/item/projectile/midbullet" + + +/obj/item/ammo_casing/shotgun + name = "shotgun shell" + desc = "A 12 gauge shell." + icon_state = "gshell" + caliber = "shotgun" + projectile_type = "/obj/item/projectile" + m_amt = 12500 + + +/obj/item/ammo_casing/shotgun/blank + name = "shotgun shell" + desc = "A blank shell." + icon_state = "blshell" + m_amt = 250 + + +/obj/item/ammo_casing/shotgun/beanbag + name = "beanbag shell" + desc = "A weak beanbag shell." + icon_state = "bshell" + projectile_type = "/obj/item/projectile/weakbullet" + m_amt = 500 + + +/obj/item/ammo_casing/shotgun/stunshell + name = "stun shell" + desc = "A stunning shell." + icon_state = "stunshell" + projectile_type = "/obj/item/projectile/stunshot" + m_amt = 2500 + + +/obj/item/ammo_casing/shotgun/dart + name = "shotgun darts" + desc = "A dart for use in shotguns." + icon_state = "blshell" //someone, draw the icon, please. + projectile_type = "/obj/item/projectile/dart" + m_amt = 12500 \ No newline at end of file diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm new file mode 100644 index 0000000000..f1a3f017de --- /dev/null +++ b/code/modules/projectiles/gun.dm @@ -0,0 +1,278 @@ +/obj/item/weapon/gun + name = "gun" + desc = "Its a gun. It's pretty terrible, though." + icon = 'gun.dmi' + icon_state = "detective" + item_state = "gun" + flags = FPRINT | TABLEPASS | CONDUCT | ONBELT | USEDELAY + m_amt = 2000 + w_class = 3.0 + throwforce = 5 + throw_speed = 4 + throw_range = 5 + force = 5.0//They now do the ave damage + origin_tech = "combat=1" + + var + fire_sound = 'Gunshot.ogg' + obj/item/projectile/in_chamber + caliber = "" + silenced = 0 + badmin = 0 + recoil = 0 + proc + load_into_chamber() + badmin_ammo() + special_check(var/mob/M) + + + load_into_chamber() + in_chamber = new /obj/item/projectile/weakbullet(src) + return 1 + + + badmin_ammo() //CREEEEEED!!!!!!!!! + switch(badmin) + if(1) + in_chamber = new /obj/item/projectile/electrode(src) + if(2) + in_chamber = new /obj/item/projectile/weakbullet(src) + if(3) + in_chamber = new /obj/item/projectile(src) + if(4) + in_chamber = new /obj/item/projectile/beam(src) + if(5) + in_chamber = new /obj/item/projectile/beam/pulse(src) + else + return 0 + if(!istype(src, /obj/item/weapon/gun/energy)) + var/obj/item/ammo_casing/AC = new(get_turf(src)) + AC.name = "bullet casing" + AC.desc = "This casing has the NT Insignia etched into the side." + return 1 + + + special_check(var/mob/M) //Placeholder for any special checks, like detective's revolver. + return 1 + + + emp_act(severity) + for(var/obj/O in contents) + O.emp_act(severity) + + + afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag)//TODO: go over this + if (flag) + return //we're placing gun on a table or in backpack --rastaf0 + if(istype(target, /obj/machinery/recharger) && istype(src, /obj/item/weapon/gun/energy)) + return + if(istype(user, /mob/living)) + var/mob/living/M = user + if ((M.mutations & CLOWN) && prob(50)) + M << "\red The [src.name] blows up in your face." + M.take_organ_damage(0,20) + M.drop_item() + del(src) + return + if (!user.IsAdvancedToolUser()) + user << "\red You don't have the dexterity to do this!" + return + + add_fingerprint(user) + + var/turf/curloc = user.loc + var/turf/targloc = get_turf(target) + if (!istype(targloc) || !istype(curloc)) + return + + if(badmin) + badmin_ammo() + else if(!special_check(user)) + return + else if(!load_into_chamber()) + user << "\red *click* *click*"; + return + + if(istype(src, /obj/item/weapon/gun/projectile/shotgun))//TODO: Get this out of here, parent objects should check child types as little as possible + var/obj/item/weapon/gun/projectile/shotgun/S = src + if(S.pumped >= S.maxpump) + S.pump() + return + + if(silenced) + playsound(user, fire_sound, 10, 1) + else + playsound(user, fire_sound, 50, 1) + + if(!in_chamber) + return + + in_chamber.firer = user + in_chamber.def_zone = user.get_organ_target() + + if(targloc == curloc) + user.bullet_act(in_chamber) + del(in_chamber) + update_icon() + return + + if(istype(src, /obj/item/weapon/gun/energy/freeze)) + var/obj/item/projectile/freeze/F = in_chamber + var/obj/item/weapon/gun/energy/freeze/Fgun = src + F.temperature = Fgun.temperature + + if(recoil) + spawn() + shake_camera(user, recoil + 1, recoil) + + in_chamber.original = targloc + in_chamber.loc = get_turf(user) + user.next_move = world.time + 4 + in_chamber.silenced = silenced + in_chamber.current = curloc + in_chamber.yo = targloc.y - curloc.y + in_chamber.xo = targloc.x - curloc.x + spawn() + in_chamber.process() + sleep(1) + in_chamber = null + + if(istype(src, /obj/item/weapon/gun/projectile/shotgun)) + var/obj/item/weapon/gun/projectile/shotgun/S = src + S.pumped++ + update_icon() + return + + +/obj/item/weapon/gun/projectile + desc = "A classic revolver. Uses 357 ammo" + name = "revolver" + icon_state = "revolver" + caliber = "357" + origin_tech = "combat=2;materials=2;syndicate=6" + w_class = 3.0 + m_amt = 1000 + + var + list/loaded = list() + max_shells = 7 + load_method = 0 //0 = Single shells or quick loader, 1 = magazine + + // Shotgun variables + pumped = 0 + maxpump = 1 + + list/Storedshots = list() + + load_into_chamber() + if(!loaded.len) + if(Storedshots.len > 0) + if(istype(src, /obj/item/weapon/gun/projectile/shotgun)) + var/obj/item/weapon/gun/projectile/shotgun/S = src + S.pump(loc) + return 0 + + if(istype(src, /obj/item/weapon/gun/projectile/shotgun) && pumped >= maxpump) + return 1 + + var/obj/item/ammo_casing/AC = loaded[1] //load next casing. + loaded -= AC //Remove casing from loaded list. + if(!istype(src, /obj/item/weapon/gun/projectile/shotgun)) + AC.loc = get_turf(src) //Eject casing onto ground. + else + Storedshots += AC + + if(AC.BB) + in_chamber = AC.BB //Load projectile into chamber. + AC.BB.loc = src //Set projectile loc to gun. + return 1 + else + return 0 + + + New() + for(var/i = 1, i <= max_shells, i++) + loaded += new /obj/item/ammo_casing(src) + update_icon() + + attackby(var/obj/item/A as obj, mob/user as mob) + var/num_loaded = 0 + if(istype(A, /obj/item/ammo_magazine)) + var/obj/item/ammo_magazine/AM = A + for(var/obj/item/ammo_casing/AC in AM.stored_ammo) + if(loaded.len >= max_shells) + break + if(AC.caliber == caliber && loaded.len < max_shells) + AC.loc = src + AM.stored_ammo -= AC + loaded += AC + num_loaded++ + else if(istype(A, /obj/item/ammo_casing) && !load_method) + var/obj/item/ammo_casing/AC = A + if(AC.caliber == caliber && loaded.len < max_shells) + user.drop_item() + AC.loc = src + loaded += AC + num_loaded++ + if(num_loaded) + user << text("\blue You load [] shell\s into the gun!", num_loaded) + A.update_icon() + return + + update_icon() + desc = initial(desc) + text(" Has [] rounds remaining.", loaded.len) + + +/obj/item/weapon/gun/energy + icon_state = "energy" + name = "energy gun" + desc = "A basic energy-based gun with two settings: Stun and kill." + fire_sound = 'Taser.ogg' + var + var/obj/item/weapon/cell/power_supply + mode = 0 //0 = stun, 1 = kill + charge_cost = 100 //How much energy is needed to fire. + + emp_act(severity) + power_supply.use(round(power_supply.maxcharge / severity)) + update_icon() + ..() + + New() + power_supply = new(src) + power_supply.give(power_supply.maxcharge) + + load_into_chamber() + if(in_chamber) + return 1 + if(!power_supply) + return 0 + if(power_supply.charge < charge_cost) + return 0 + switch (mode) + if(0) + in_chamber = new /obj/item/projectile/electrode(src) + if(1) + in_chamber = new /obj/item/projectile/beam(src) + power_supply.use(charge_cost) + return 1 + + attack_self(mob/living/user as mob) + switch(mode) + if(0) + mode = 1 + charge_cost = 100 + fire_sound = 'Laser.ogg' + user << "\red [src.name] is now set to kill." + if(1) + mode = 0 + charge_cost = 100 + fire_sound = 'Taser.ogg' + user << "\red [src.name] is now set to stun." + update_icon() + return + + update_icon() + var/ratio = power_supply.charge / power_supply.maxcharge + ratio = round(ratio, 0.25) * 100 + icon_state = text("[][]", initial(icon_state), ratio) \ No newline at end of file diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm new file mode 100644 index 0000000000..bec9e1a7e4 --- /dev/null +++ b/code/modules/projectiles/guns/energy.dm @@ -0,0 +1,646 @@ + +/obj/item/weapon/gun/energy/laser + name = "laser gun" + icon_state = "laser" + fire_sound = 'Laser.ogg' + w_class = 3.0 + m_amt = 2000 + origin_tech = "combat=3;magnets=2" + mode = 1 //We don't want laser guns to be on a stun setting. --Superxpdude + + attack_self(mob/living/user as mob) + return // We don't want laser guns to be able to change to a stun setting. --Superxpdude + + +/obj/item/weapon/gun/energy/laser/captain + icon_state = "caplaser" + desc = "This is an antique laser gun. All craftsmanship is of the highest quality. It is decorated with assistant leather and chrome. The object menaces with spikes of energy. On the item is an image of Space Station 13. The station is exploding." + force = 10 + origin_tech = null //forgotten technology of ancients lol + + New() + ..() + charge() + + proc + charge() + if(power_supply.charge < power_supply.maxcharge) + power_supply.give(100) + update_icon() + spawn(50) charge() + //Added this to the cap's laser back before the gun overhaul to make it halfways worth stealing. It's back now. --NEO + + +/obj/item/weapon/gun/energy/laser/cyborg/load_into_chamber() + if(in_chamber) + return 1 + if(isrobot(src.loc)) + var/mob/living/silicon/robot/R = src.loc + R.cell.use(40) + in_chamber = new /obj/item/projectile/beam(src) + return 1 + return 0 + + +/obj/item/weapon/gun/energy/pulse_rifle + name = "pulse rifle" + desc = "A heavy-duty, pulse-based energy weapon with multiple fire settings, preferred by front-line combat personnel." + icon_state = "pulse" + force = 10 //The standard high damage + mode = 2 + fire_sound = 'pulse.ogg' + load_into_chamber() + if(in_chamber) + return 1 + if(power_supply.charge < charge_cost) + return 0 + switch (mode) + if(0) + in_chamber = new /obj/item/projectile/electrode(src) + if(1) + in_chamber = new /obj/item/projectile/beam(src) + if(2) + in_chamber = new /obj/item/projectile/beam/pulse(src) + power_supply.use(charge_cost) + return 1 + + + attack_self(mob/living/user as mob) + mode++ + switch(mode) + if(1) + user << "\red [src.name] is now set to kill." + fire_sound = 'Laser.ogg' + charge_cost = 100 + if(2) + user << "\red [src.name] is now set to destroy." + fire_sound = 'pulse.ogg' + charge_cost = 200 + else + mode = 0 + user << "\red [src.name] is now set to stun." + fire_sound = 'Taser.ogg' + charge_cost = 50 + + + New() + power_supply = new /obj/item/weapon/cell/super(src) + power_supply.give(power_supply.maxcharge) + update_icon() + + +/obj/item/weapon/gun/energy/pulse_rifle/destroyer + name = "pulse destroyer" + desc = "A heavy-duty, pulse-based energy weapon. The mode is set to DESTROY. Always destroy." + mode = 2 + New() + power_supply = new /obj/item/weapon/cell/infinite(src) + power_supply.give(power_supply.maxcharge) + update_icon() + attack_self(mob/living/user as mob) + return + + +/obj/item/weapon/gun/energy/pulse_rifle/M1911 + name = "m1911-P" + desc = "It's not the size of the gun, it's the size of the hole it puts through people." + icon_state = "m1911-p" + New() + power_supply = new /obj/item/weapon/cell/infinite(src) + power_supply.give(power_supply.maxcharge) + update_icon() + + +/obj/item/weapon/gun/energy/nuclear + name = "Advanced Energy Gun" + desc = "An energy gun with an experimental miniaturized reactor." + origin_tech = "combat=3;materials=5;powerstorage=3" + var/lightfail = 0 + icon_state = "nucgun" + + New() + ..() + charge() + + proc + charge() + if(power_supply.charge < power_supply.maxcharge) + if(failcheck()) + power_supply.give(100) + update_icon() + if(!crit_fail) + spawn(50) charge() + + + failcheck() + lightfail = 0 + if (prob(src.reliability)) return 1 //No failure + if (prob(src.reliability)) + for (var/mob/M in range(0,src)) //Only a minor failure, enjoy your radiation if you're in the same tile or carrying it + if (src in M.contents) + M << "\red Your gun feels pleasantly warm for a moment." + else + M << "\red You feel a warm sensation." + M.radiation += rand(1,40) + lightfail = 1 + else + for (var/mob/M in range(rand(1,4),src)) //Big failure, TIME FOR RADIATION BITCHES + if (src in M.contents) + M << "\red Your gun's reactor overloads!" + M << "\red You feel a wave of heat wash over you." + M.radiation += 100 + crit_fail = 1 //break the gun so it stops recharging + update_icon() + + + update_charge() + if (crit_fail) + overlays += "nucgun-whee" + return + var/ratio = power_supply.charge / power_supply.maxcharge + ratio = round(ratio, 0.25) * 100 + overlays += text("nucgun-[]", ratio) + + + update_reactor() + if(crit_fail) + overlays += "nucgun-crit" + return + if(lightfail) + overlays += "nucgun-medium" + else if ((power_supply.charge/power_supply.maxcharge) <= 0.5) + overlays += "nucgun-light" + else + overlays += "nucgun-clean" + + + update_mode() + if (mode == 2) + overlays += "nucgun-stun" + else if (mode == 1) + overlays += "nucgun-kill" + + emp_act(severity) + ..() + reliability -= round(15/severity) + + update_icon() + overlays = null + update_charge() + update_reactor() + update_mode() + + + +/obj/item/weapon/gun/energy/taser + name = "taser gun" + desc = "A small, low capacity gun used for non-lethal takedowns." + icon_state = "taser" + fire_sound = 'Taser.ogg' + charge_cost = 100 + + load_into_chamber() + if(in_chamber) + return 1 + if(power_supply.charge < charge_cost) + return 0 + in_chamber = new /obj/item/projectile/electrode(src) + power_supply.use(charge_cost) + return 1 + + attack_self(mob/living/user as mob) + return + + New() + power_supply = new /obj/item/weapon/cell/crap(src) + power_supply.give(power_supply.maxcharge) + + + +/obj/item/weapon/gun/energy/taser/cyborg/load_into_chamber() + if(in_chamber) + return 1 + if(isrobot(src.loc)) + var/mob/living/silicon/robot/R = src.loc + R.cell.use(40) + in_chamber = new /obj/item/projectile/electrode(src) + return 1 + return 0 + + + +/obj/item/weapon/gun/energy/lasercannon//TODO: go over this one + name = "laser cannon" + desc = "A heavy-duty laser cannon." + icon_state = "lasercannon" + fire_sound = 'lasercannonfire.ogg' + origin_tech = "combat=4;materials=3;powerstorage=3" + + + load_into_chamber() + if(in_chamber) + return 1 + if(power_supply.charge < charge_cost) + return 0 + in_chamber = new /obj/item/projectile/beam/heavylaser(src) + power_supply.use(charge_cost) + return 1 + + + attack_self(mob/living/user as mob) + return + + + New() + power_supply = new /obj/item/weapon/cell(src) + power_supply.give(power_supply.maxcharge) + update_icon() + + + +/obj/item/weapon/gun/energy/shockgun + name = "shock gun" + desc = "A high tech energy weapon that stuns and burns a target." + icon_state = "shockgun" + fire_sound = 'Laser.ogg' + origin_tech = "combat=5;materials=4;powerstorage=3" + charge_cost = 250 + + load_into_chamber() + if(in_chamber) + return 1 + if(power_supply.charge < charge_cost) + return 0 + in_chamber = new /obj/item/projectile/beam/fireball(src) + power_supply.use(charge_cost) + return 1 + + attack_self(mob/living/user as mob) + return + + New() + power_supply = new /obj/item/weapon/cell(src) + power_supply.give(power_supply.maxcharge) + + + +/obj/item/weapon/gun/energy/ionrifle + name = "ion rifle" + desc = "A man portable anti-armor weapon designed to disable mechanical threats" + icon_state = "ionrifle" + fire_sound = 'Laser.ogg' + origin_tech = "combat=3;magnets=2"//This could likely be changed up a bit + w_class = 4.0 + flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY | ONBACK + charge_cost = 200 + + load_into_chamber() + if(in_chamber) + return 1 + if(power_supply.charge < charge_cost) + return 0 + in_chamber = new /obj/item/projectile/ion(src) + power_supply.use(charge_cost) + return 1 + + attack_self(mob/living/user as mob) + return + + New() + power_supply = new /obj/item/weapon/cell(src) + power_supply.give(power_supply.maxcharge) + + +/obj/item/weapon/gun/energy/decloner + name = "biological demolecularisor" + desc = "A gun that discharges high amounts of controlled radiation to slowly break a target into component elements." + icon_state = "decloner" + fire_sound = 'pulse3.ogg' + origin_tech = "combat=5;materials=4;powerstorage=3" + charge_cost = 100 + + + load_into_chamber() + if(in_chamber) + return 1 + if(power_supply.charge < charge_cost) + return 0 + in_chamber = new /obj/item/projectile/declone(src) + power_supply.use(charge_cost) + return 1 + + + attack_self(mob/living/user as mob) + return + + + New() + power_supply = new /obj/item/weapon/cell(src) + power_supply.give(power_supply.maxcharge) + + +/obj/item/weapon/gun/energy/stunrevolver + name = "stun revolver" + desc = "A high-tech revolver that fires stun cartridges. The stun cartridges can be recharged using a conventional energy weapon recharger." + icon_state = "stunrevolver" + fire_sound = 'Gunshot.ogg' + origin_tech = "combat=3;materials=3;powerstorage=2" + charge_cost = 125 + + + load_into_chamber() + if(in_chamber) + return 1 + if(power_supply.charge < charge_cost) + return 0 + in_chamber = new /obj/item/projectile/electrode(src) + power_supply.use(charge_cost) + return 1 + + + attack_self(mob/living/user as mob) + return + + + New() + power_supply = new /obj/item/weapon/cell(src) + power_supply.give(power_supply.maxcharge) + + + +/obj/item/weapon/gun/energy/freeze + name = "freeze gun" + icon_state = "freezegun" + fire_sound = 'pulse3.ogg' + desc = "A gun that shoots supercooled hydrogen particles to drastically chill a target's body temperature." + var/temperature = T20C + var/current_temperature = T20C + charge_cost = 100 + origin_tech = "combat=3;materials=4;powerstorage=3;magnets=2" + + + New() + power_supply = new /obj/item/weapon/cell/crap(src) + power_supply.give(power_supply.maxcharge) + spawn() + Life() + + + load_into_chamber() + if(in_chamber) + return 1 + if(power_supply.charge < charge_cost) + return 0 + in_chamber = new /obj/item/projectile/freeze(src) + power_supply.use(charge_cost) + return 1 + + + attack_self(mob/living/user as mob) + user.machine = src + var/temp_text = "" + if(temperature > (T0C - 50)) + temp_text = "[temperature] ([round(temperature-T0C)]°C) ([round(temperature*1.8-459.67)]°F)" + else + temp_text = "[temperature] ([round(temperature-T0C)]°C) ([round(temperature*1.8-459.67)]°F)" + + var/dat = {"Freeze Gun Configuration:
+ Current output temperature: [temp_text]
+ Target output temperature: - - - [current_temperature] + + +
+ "} + + user << browse(dat, "window=freezegun;size=450x300") + onclose(user, "freezegun") + + + Topic(href, href_list) + if (..()) + return + usr.machine = src + src.add_fingerprint(usr) + if(href_list["temp"]) + var/amount = text2num(href_list["temp"]) + if(amount > 0) + src.current_temperature = min(T20C, src.current_temperature+amount) + else + src.current_temperature = max(0, src.current_temperature+amount) + if (istype(src.loc, /mob)) + attack_self(src.loc) + src.add_fingerprint(usr) + return + + + proc/Life() + while(src) + sleep(10) + + switch(temperature) + if(0 to 10) charge_cost = 500 + if(11 to 50) charge_cost = 150 + if(51 to 100) charge_cost = 100 + if(101 to 150) charge_cost = 75 + if(151 to 200) charge_cost = 50 + if(201 to 300) charge_cost = 25 + + if(current_temperature != temperature) + var/difference = abs(current_temperature - temperature) + if(difference >= 10) + if(current_temperature < temperature) + temperature -= 10 + else + temperature += 10 + else + temperature = current_temperature + if (istype(src.loc, /mob)) + attack_self(src.loc) + + + +/obj/item/weapon/gun/energy/plasma + name = "plasma gun" + icon_state = "plasmagun" + fire_sound = 'pulse3.ogg' + desc = "A gun that fires super heated plasma at targets, thus increasing their overall body temparature and also harming them." + var/temperature = T20C + var/current_temperature = T20C + charge_cost = 100 + origin_tech = "combat=3;materials=4;powerstorage=3;magnets=2" + + + New() + power_supply = new /obj/item/weapon/cell/crap(src) + power_supply.give(power_supply.maxcharge) + spawn() + Life() + + + load_into_chamber() + if(in_chamber) + return 1 + if(power_supply.charge < charge_cost) + return 0 + in_chamber = new /obj/item/projectile/plasma(src) + power_supply.use(charge_cost) + return 1 + + + attack_self(mob/living/user as mob) + user.machine = src + var/temp_text = "" + if(temperature < (T0C + 50)) + temp_text = "[temperature] ([round(temperature+T0C)]°C) ([round(temperature*1.8+459.67)]°F)" + else + temp_text = "[temperature] ([round(temperature+T0C)]°C) ([round(temperature*1.8+459.67)]°F)" + + var/dat = {"Plasma Gun Configuration:
+ Current output temperature: [temp_text]
+ Target output temperature: - - - [current_temperature] + + +
+ "} + + user << browse(dat, "window=plasmagun;size=450x300") + onclose(user, "plasmagun") + + + Topic(href, href_list) + if (..()) + return + usr.machine = src + src.add_fingerprint(usr) + if(href_list["temp"]) + var/amount = text2num(href_list["temp"]) + if(amount < 0) + src.current_temperature = max(T20C, src.current_temperature+amount) + else + src.current_temperature = min(800, src.current_temperature+amount) + if (istype(src.loc, /mob)) + attack_self(src.loc) + src.add_fingerprint(usr) + return + + + proc/Life() + while(src) + sleep(10) + + switch(temperature) + if(601 to 800) charge_cost = 500 + if(401 to 600) charge_cost = 150 + if(201 to 400) charge_cost = 100 + if(101 to 200) charge_cost = 75 + if(51 to 100) charge_cost = 50 + if(0 to 50) charge_cost = 25 + + if(current_temperature != temperature) + var/difference = abs(current_temperature + temperature) + if(difference >= 10) + if(current_temperature < temperature) + temperature -= 10 + else + temperature += 10 + + else + temperature = current_temperature + + if (istype(src.loc, /mob)) + attack_self(src.loc) + + + + +/obj/item/weapon/gun/energy/crossbow + name = "mini energy-crossbow" + desc = "A weapon favored by many of the syndicates stealth specialists." + icon_state = "crossbow" + w_class = 2.0 + item_state = "crossbow" + m_amt = 2000 + origin_tech = "combat=2;magnets=2;syndicate=5" + silenced = 1 + fire_sound = 'Genhit.ogg' + + + New() + power_supply = new /obj/item/weapon/cell/crap(src) + power_supply.give(power_supply.maxcharge) + charge() + + + proc/charge() + if(power_supply) + if(power_supply.charge < power_supply.maxcharge) power_supply.give(100) + spawn(50) charge() + + + update_icon() + return + + + attack_self(mob/living/user as mob) + return + + + load_into_chamber() + if(in_chamber) + return 1 + if(power_supply.charge < charge_cost) + return 0 + in_chamber = new /obj/item/projectile/bolt(src) + power_supply.use(charge_cost) + return 1 + + + +/obj/item/weapon/gun/energy/crossbow/cyborg/load_into_chamber() + if(in_chamber) + return 1 + if(isrobot(src.loc)) + var/mob/living/silicon/robot/R = src.loc + R.cell.use(20) + in_chamber = new /obj/item/projectile/bolt(src) + return 1 + return 0 + + + +/obj/item/weapon/gun/energy/crossbow/largecrossbow + name = "Energy Crossbow" + desc = "A weapon favored by syndicate infiltration teams." + icon_state = "crossbow" + w_class = 4.0 + item_state = "crossbow" + force = 10 + m_amt = 2000 + origin_tech = "combat=2;magnets=2;syndicate=5" + silenced = 1 + fire_sound = 'Genhit.ogg' + + + New() + power_supply = new /obj/item/weapon/cell/crap(src) + power_supply.give(power_supply.maxcharge) + charge() + + + charge() + if(power_supply) + if(power_supply.charge < power_supply.maxcharge) power_supply.give(200) + spawn(20) charge() + + + update_icon() + return + + + attack_self(mob/living/user as mob) + return + + + load_into_chamber() + if(in_chamber) + return 1 + if(power_supply.charge <= charge_cost) + return 0 + in_chamber = new /obj/item/projectile/largebolt(src) + power_supply.use(charge_cost) + return 1 + diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm new file mode 100644 index 0000000000..e3709d7135 --- /dev/null +++ b/code/modules/projectiles/guns/projectile.dm @@ -0,0 +1,225 @@ +/obj/item/weapon/gun/projectile/detective + desc = "A cheap Martian knock-off of a Smith & Wesson Model 10. Uses .38-Special rounds." + name = ".38 revolver" + icon_state = "detective" + caliber = "38" + origin_tech = "combat=2;materials=2" + + New() + for(var/i = 1, i <= max_shells, i++) + loaded += new /obj/item/ammo_casing/c38(src) + update_icon() + + special_check(var/mob/living/carbon/human/M) + if(istype(M)) + if(istype(M.w_uniform, /obj/item/clothing/under/det) && istype(M.head, /obj/item/clothing/head/det_hat) && istype(M.wear_suit, /obj/item/clothing/suit/det_suit)) + return 1 + M << "\red You just don't feel cool enough to use this gun looking like that." + return 0 + + verb + rename_gun() + set name = "Name Gun" + set desc = "Click to rename your gun. If you're the detective." + + var/mob/U = usr + if(ishuman(U)&&U.mind&&U.mind.assigned_role=="Detective") + var/input = input("What do you want to name the gun?",,"") + input = sanitize(input) + if(input) + if(in_range(U,src)&&(!isnull(src))&&!U.stat) + name = input + U << "You name the gun [input]. Say hello to your new friend." + else + U << "\red Can't let you do that, detective!" + else + U << "\red You don't feel cool enough to name this gun, chump." + + + +/obj/item/weapon/gun/projectile/mateba + name = "mateba" + desc = "When you absolutely, positively need a 10mm hole in the other guy. Uses .357 ammo." + icon_state = "mateba" + origin_tech = "combat=2;materials=2" + + + +/obj/item/weapon/gun/projectile/shotgun + name = "shotgun" + desc = "Useful for sweeping alleys." + icon_state = "shotgun" + max_shells = 2 + w_class = 4.0 + force = 10 + flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY | ONBACK + caliber = "shotgun" + origin_tech = "combat=2;materials=2" + var/recentpump = 0 // to prevent spammage + + New() + for(var/i = 1, i <= max_shells, i++) + loaded += new /obj/item/ammo_casing/shotgun/beanbag(src) + update_icon() + + attack_self(mob/living/user as mob) + if(recentpump) return + pump() + recentpump = 1 + sleep(10) + recentpump = 0 + return + + proc/pump(mob/M) + playsound(M, 'shotgunpump.ogg', 60, 1) + pumped = 0 + for(var/obj/item/ammo_casing/AC in Storedshots) + Storedshots -= AC //Remove casing from loaded list. + AC.loc = get_turf(src) //Eject casing onto ground. + + + +/obj/item/weapon/gun/projectile/shotgun/combat + name = "combat shotgun" + icon_state = "cshotgun" + w_class = 4.0 + flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY | ONBACK + max_shells = 8 + origin_tech = "combat=3" + maxpump = 1 + New() + for(var/i = 1, i <= max_shells, i++) + loaded += new /obj/item/ammo_casing/shotgun(src) + update_icon() + + + +/obj/item/weapon/gun/projectile/shotgun/combat2 + name = "security combat shotgun" + icon_state = "cshotgun" + w_class = 4.0 + flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY | ONBACK + max_shells = 4 + origin_tech = "combat=3" + maxpump = 1 + New() + for(var/i = 1, i <= max_shells, i++) + loaded += new /obj/item/ammo_casing/shotgun/beanbag(src) + update_icon() + + + +/obj/item/weapon/gun/projectile/automatic //Hopefully someone will find a way to make these fire in bursts or something. --Superxpdude + name = "Submachine Gun" + desc = "A lightweight, fast firing gun. Uses 9mm rounds." + icon_state = "saber" + w_class = 3.0 + max_shells = 18 + caliber = "9mm" + origin_tech = "combat=4;materials=2" + + New() + for(var/i = 1, i <= max_shells, i++) + loaded += new /obj/item/ammo_casing/c9mm(src) + update_icon() + + + +/obj/item/weapon/gun/projectile/automatic/mini_uzi + name = "Mini-Uzi" + desc = "A lightweight, fast firing gun, for when you REALLY need someone dead. Uses .45 rounds." + icon_state = "mini-uzi" + w_class = 3.0 + max_shells = 20 + caliber = ".45" + origin_tech = "combat=5;materials=2;syndicate=8" + + New() + for(var/i = 1, i <= max_shells, i++) + loaded += new /obj/item/ammo_casing/c45(src) + update_icon() + + + +/obj/item/weapon/gun/projectile/silenced + name = "Silenced Pistol" + desc = "A small, quiet, easily concealable gun. Uses .45 rounds." + icon_state = "silenced_pistol" + w_class = 3.0 + max_shells = 12 + caliber = ".45" + silenced = 1 + origin_tech = "combat=2;materials=2;syndicate=8" + + New() + for(var/i = 1, i <= max_shells, i++) + loaded += new /obj/item/ammo_casing/c45(src) + update_icon() + + + +/obj/item/weapon/gun/projectile/deagle + name = "Desert Eagle" + desc = "A robust handgun that uses 357 magnum ammo" + icon_state = "deagle" + w_class = 3.0 + force = 14.0 + max_shells = 9 + caliber = "357" + origin_tech = "combat=2;materials=2" + + New() + for(var/i = 1, i <= max_shells, i++) + loaded += new /obj/item/ammo_casing(src) + update_icon() + + + +/obj/item/weapon/gun/projectile/deagleg + name = "Desert Eagle" + desc = "A gold plated gun folded over a million times by superior martian gunsmiths. Uses 357 ammo." + icon_state = "deagleg" + item_state = "deagleg" + w_class = 3.0 + max_shells = 9 + caliber = "357" + origin_tech = "combat=2;materials=2" + + New() + for(var/i = 1, i <= max_shells, i++) + loaded += new /obj/item/ammo_casing(src) + update_icon() + + + +/obj/item/weapon/gun/projectile/deaglecamo + name = "Desert Eagle" + desc = "A Deagle brand Deagle for operators operating operationally. Uses 357 ammo." + icon_state = "deaglecamo" + item_state = "deagleg" + w_class = 3.0 + max_shells = 9 + caliber = "357" + origin_tech = "combat=2;materials=2" + + New() + for(var/i = 1, i <= max_shells, i++) + loaded += new /obj/item/ammo_casing(src) + update_icon() + + + +/obj/item/weapon/gun/projectile/gyropistol + name = "Gyrojet Pistol" + desc = "A bulky pistol designed to fire self propelled rounds" + icon_state = "gyropistol" + w_class = 3.0 + max_shells = 8 + caliber = "a75" + fire_sound = 'Explosion1.ogg' + origin_tech = "combat=3" + + New() + for(var/i = 1, i <= max_shells, i++) + loaded += new /obj/item/ammo_casing/a75(src) + update_icon() \ No newline at end of file diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm new file mode 100644 index 0000000000..066722480e --- /dev/null +++ b/code/modules/projectiles/projectile.dm @@ -0,0 +1,111 @@ +/* +#define BRUTE "brute" +#define BURN "burn" +#define TOX "tox" +#define OXY "oxy" +#define CLONE "clone" + +#define ADD "add" +#define SET "set" +*/ + +/obj/item/projectile + name = "projectile" + icon = 'projectiles.dmi' + icon_state = "bullet" + density = 1 + unacidable = 1 //Just to be sure. + anchored = 1 // I'm not sure if it is a good idea. Bullets sucked to space and curve trajectories near singularity could be awesome. --rastaf0 + flags = FPRINT | TABLEPASS + pass_flags = PASSTABLE + mouse_opacity = 0 + var + bumped = 0 //Prevents it from hitting more than one guy at once + def_zone = "" //Aiming at, Also this should be more random its hard to hit things sometimes + mob/firer = null//Who shot it + silenced = 0 //Attack message + yo = null + xo = null + current = null + turf/original = null + + damage = 10 //Damage dealt by projectile. This is used for machinery, critters, anything not under /mob heirarchy + flag = "bullet" //Defines what armor to use when it hits things. Must be set to bullet, laser, taser, bomb, bio, or rad + nodamage = 0 //Determines if the projectile will skip any damage inflictions + + list/mobdamage = list(BRUTE = 50, BURN = 0, TOX = 0, OXY = 0, CLONE = 0) //Determines what kind of damage it does to mobs + list/effects = list("stun" = 0, "weak" = 0, "paralysis" = 0, "stutter" = 0, "drowsyness" = 0, "radiation" = 0, "eyeblur" = 0, "emp" = 0) // long list of effects a projectile can inflict on something. !!MUY FLEXIBLE!!~ + list/effectprob = list("stun" = 100, "weak" = 100, "paralysis" = 100, "stutter" = 100, "drowsyness" = 100, "radiation" = 100, "eyeblur" = 100, "emp" = 100) // Probability for an effect to execute + list/effectmod = list("stun" = SET, "weak" = SET, "paralysis" = SET, "stutter" = SET, "drowsyness" = SET, "radiation" = SET, "eyeblur" = SET, "emp" = SET) // determines how the effect modifiers will effect a mob's variable + + + Bump(atom/A as mob|obj|turf|area) + if(A == firer) + loc = A.loc + return // cannot shoot yourself + + if(bumped) return + + bumped = 1 + if(firer && istype(A, /mob)) + var/mob/M = A + if(!istype(A, /mob/living)) + loc = A.loc + return // nope.avi + + if(!silenced) + visible_message("\red [A.name] has been shot by [firer.name]!", "\blue You hear a [istype(src, /obj/item/projectile/beam) ? "gunshot" : "laser blast"]!") + else + M << "\red You've been shot!" + if(istype(firer, /mob)) + M.attack_log += text("\[[]\] []/[] shot []/[] with a []", time_stamp(), firer, firer.ckey, M, M.ckey, src) + firer.attack_log += text("\[[]\] []/[] shot []/[] with a []", time_stamp(), firer, firer.ckey, M, M.ckey, src) + else + M.attack_log += text("\[[]\] UNKOWN SUBJECT (No longer exists) shot []/[] with a []", time_stamp(), M, M.ckey, src) + + spawn(0) + if(A) + A.bullet_act(src, def_zone) + if(istype(A,/turf)) + for(var/obj/O in A) + O.bullet_act(src) + for(var/mob/M in A) + M.bullet_act(src, def_zone) + + if(istype(src, /obj/item/projectile/freeze))//These could likely be moved + var/obj/item/projectile/freeze/F = src + F.Freeze(A) + else if(istype(src, /obj/item/projectile/plasma)) + var/obj/item/projectile/plasma/P = src + P.Heat(A) + + density = 0 + invisibility = 101 + del(src) + return + + + CanPass(atom/movable/mover, turf/target, height=0, air_group=0) + if(air_group || (height==0)) return 1 + + if(istype(mover, /obj/item/projectile)) + return prob(95) + else + return 1 + + + process() + spawn while(src) + 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) + if(loc == original) + for(var/mob/living/M in original) + Bump(M) + sleep(1) + return diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm new file mode 100644 index 0000000000..95031aa57e --- /dev/null +++ b/code/modules/projectiles/projectile/beams.dm @@ -0,0 +1,53 @@ +/obj/item/projectile/beam + name = "laser" + icon_state = "laser" + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE + damage = 20 + mobdamage = list(BRUTE = 0, BURN = 20, TOX = 0, OXY = 0, CLONE = 0) + flag = "laser" + New() + ..() + effects["eyeblur"] = 5 + effectprob["eyeblur"] = 50 + + + +/obj/item/projectile/beam/pulse + name = "pulse" + icon_state = "u_laser" + damage = 50 + mobdamage = list(BRUTE = 10, BURN = 40, TOX = 0, OXY = 0, CLONE = 0) + + + +/obj/item/projectile/beam/heavylaser + name = "heavy laser" + icon_state = "heavylaser" + damage = 40 + mobdamage = list(BRUTE = 0, BURN = 40, TOX = 0, OXY = 0, CLONE = 0) + + + +/obj/item/projectile/beam/deathlaser + name = "death laser" + icon_state = "heavylaser" + damage = 60 + mobdamage = list(BRUTE = 10, BURN = 60, TOX = 0, OXY = 0, CLONE = 0) + New() + ..() + effects["weak"] = 5 + effectprob["weak"] = 15 + + + +/obj/item/projectile/beam/fireball + name = "shock" + icon_state = "fireball" + damage = 25 + mobdamage = list(BRUTE = 0, BURN = 25, TOX = 0, OXY = 0, CLONE = 0) + New() + ..() + effects["stun"] = 10 + effects["weak"] = 10 + effectprob["weak"] = 25 + effects["stutter"] = 10 diff --git a/code/modules/projectiles/projectile/bio.dm b/code/modules/projectiles/projectile/bio.dm new file mode 100644 index 0000000000..8b46914d6d --- /dev/null +++ b/code/modules/projectiles/projectile/bio.dm @@ -0,0 +1,23 @@ +/obj/item/projectile/declone + name = "declown" + icon_state = "declone" + damage = 0 + mobdamage = list(BRUTE = 0, BURN = 0, TOX = 0, OXY = 0, CLONE = 40) + flag = "bio" + New() + ..() + effects["radiation"] = 40 + effectmod["radiation"] = ADD + + + +/obj/item/projectile/dart + name = "dart" + icon_state = "toxin" + flag = "bio" + damage = 0 + mobdamage = list(BRUTE = 0, BURN = 0, TOX = 10, OXY = 0, CLONE = 0) + New() + ..() + effects["weak"] = 5 + effectmod["weak"] = ADD \ No newline at end of file diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm new file mode 100644 index 0000000000..e4ad5e5a94 --- /dev/null +++ b/code/modules/projectiles/projectile/bullets.dm @@ -0,0 +1,63 @@ +/obj/item/projectile/weakbullet + damage = 8 + mobdamage = list(BRUTE = 8, BURN = 0, TOX = 0, OXY = 0, CLONE = 0) + New() + ..() + effects["stun"] = 10 + effects["weak"] = 10 + effects["stutter"] = 2 + effectprob["weak"] = 25 + + + +/obj/item/projectile/midbullet + damage = 16 + mobdamage = list(BRUTE = 32, BURN = 0, TOX = 0, OXY = 0, CLONE = 0) + New() + ..() + effects["weak"] = 10 + effects["stun"] = 10 + + + +/obj/item/projectile/suffocationbullet//How does this even work? + mobdamage = list(BRUTE = 5, BURN = 0, TOX = 0, OXY = 15, CLONE = 0) + + + +/obj/item/projectile/cyanideround//Instakill guns are not a good thing, make them hit a few times + mobdamage = list(BRUTE = 5, BURN = 0, TOX = 40, OXY = 0, CLONE = 0) + + + +/obj/item/projectile/burstbullet + damage = 20 + mobdamage = list(BRUTE = 20, BURN = 0, TOX = 0, OXY = 0, CLONE = 0) + + + +/obj/item/projectile/gyro + name ="gyro" + icon_state= "bolter" + damage = 50 + mobdamage = list(BRUTE = 50, BURN = 0, TOX = 0, OXY = 0, CLONE = 0) + flag = "bullet" + New() + ..() + effects["weak"] = 10 + effects["stun"] = 10 + + + +/obj/item/projectile/stunshot + name = "stunshot" + icon_state = "bullet" + flag = "bullet" + damage = 5 + mobdamage = list(BRUTE = 5, BURN = 0, TOX = 0, OXY = 0, CLONE = 0) + New() + ..() + effects["stun"] = 20 + effects["weak"] = 20 + effectprob["weak"] = 45 + effects["stutter"] = 20 \ No newline at end of file diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm new file mode 100644 index 0000000000..71e9822f27 --- /dev/null +++ b/code/modules/projectiles/projectile/energy.dm @@ -0,0 +1,27 @@ +/obj/item/projectile/electrode + name = "electrode" + icon_state = "spark" + flag = "taser" + damage = 0 + nodamage = 1 + New() + ..() + effects["stun"] = 10 + effects["weak"] = 10 + effects["stutter"] = 10 + effectprob["weak"] = 25 + + + +/obj/item/projectile/bolt + name = "bolt" + icon_state = "cbbolt" + flag = "taser" + damage = 0 + nodamage = 1 + New() + ..() + effects["weak"] = 10 + effects["stutter"] = 10 + + diff --git a/code/modules/projectiles/projectile/rad.dm b/code/modules/projectiles/projectile/rad.dm new file mode 100644 index 0000000000..ae7cc92ef3 --- /dev/null +++ b/code/modules/projectiles/projectile/rad.dm @@ -0,0 +1,14 @@ +/obj/item/projectile/largebolt + name = "largebolt" + icon_state = "cbbolt" + flag = "rad" + damage = 20 + mobdamage = list(BRUTE = 10, BURN = 0, TOX = 10, OXY = 0, CLONE = 0) + New() + ..() + effects["radiation"] = 40 + effectprob["radiation"] = 95 + effects["drowsyness"] = 10 + effectprob["drowsyness"] = 25 + effectmod["radiation"] = ADD + effectmod["drowsyness"] = SET \ No newline at end of file diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm new file mode 100644 index 0000000000..1144fef67e --- /dev/null +++ b/code/modules/projectiles/projectile/special.dm @@ -0,0 +1,35 @@ +//These could likely use an Onhit proc +/obj/item/projectile/ion + name = "ion bolt" + icon_state = "ion" + flag = "taser"//Need to check this + damage = 0 + nodamage = 1 + New() + ..() + effects["emp"] = 1 + effectprob["emp"] = 80 + +/obj/item/projectile/freeze + name = "freeze beam" + icon_state = "ice_2" + damage = 0 + var/temperature = 0 + + proc/Freeze(atom/A as mob|obj|turf|area) + if(istype(A, /mob)) + var/mob/M = A + if(M.bodytemperature > temperature) + M.bodytemperature = temperature + +/obj/item/projectile/plasma + name = "plasma blast" + icon_state = "plasma_2" + damage = 0 + var/temperature = 800 + + proc/Heat(atom/A as mob|obj|turf|area) + if(istype(A, /mob/living/carbon)) + var/mob/M = A + if(M.bodytemperature < temperature) + M.bodytemperature = temperature diff --git a/code/setup.dm b/code/setup.dm index 00c84e92d8..b2701a19b3 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -200,3 +200,14 @@ var/list/accessable_z_levels = list("1" = 10, "3" = 15, "4" = 60, "5" = 15) //Th var/list/global_mutations = list() // list of hidden mutation things + + +//Bullet things +#define BRUTE "brute" +#define BURN "burn" +#define TOX "tox" +#define OXY "oxy" +#define CLONE "clone" + +#define ADD "add" +#define SET "set" diff --git a/icons/changelog.html b/icons/changelog.html index c733671353..effe2a1214 100644 --- a/icons/changelog.html +++ b/icons/changelog.html @@ -61,10 +61,16 @@ should be listed in the changelog upon commit tho. Thanks. -->
  • Added the most fun activity in your every-day life. Laundry. Check the dormitory. (Sprites by Hempuli)
  • -
  • Kor Updated: +
  • Kor updated: +
  • +
  • Mport updated: +
  • diff --git a/tgstation.dme b/tgstation.dme index caa14df814..4021c0ba0d 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -113,6 +113,10 @@ #define FILE_DIR "code/modules/power/antimatter" #define FILE_DIR "code/modules/power/singularity" #define FILE_DIR "code/modules/power/singularity/particle_accelerator" +#define FILE_DIR "code/modules/projectiles" +#define FILE_DIR "code/modules/projectiles/ammunition" +#define FILE_DIR "code/modules/projectiles/guns" +#define FILE_DIR "code/modules/projectiles/projectile" #define FILE_DIR "code/modules/research" #define FILE_DIR "code/unused" #define FILE_DIR "code/unused/beast" @@ -767,6 +771,7 @@ #include "code\modules\mob\living\carbon\human\examine.dm" #include "code\modules\mob\living\carbon\human\hud.dm" #include "code\modules\mob\living\carbon\human\human.dm" +#include "code\modules\mob\living\carbon\human\human_defense.dm" #include "code\modules\mob\living\carbon\human\life.dm" #include "code\modules\mob\living\carbon\human\login.dm" #include "code\modules\mob\living\carbon\human\say.dm" @@ -858,6 +863,19 @@ #include "code\modules\power\singularity\particle_accelerator\particle_control.dm" #include "code\modules\power\singularity\particle_accelerator\particle_emitter.dm" #include "code\modules\power\singularity\particle_accelerator\particle_power.dm" +#include "code\modules\projectiles\ammunition.dm" +#include "code\modules\projectiles\gun.dm" +#include "code\modules\projectiles\projectile.dm" +#include "code\modules\projectiles\ammunition\boxes.dm" +#include "code\modules\projectiles\ammunition\bullets.dm" +#include "code\modules\projectiles\guns\energy.dm" +#include "code\modules\projectiles\guns\projectile.dm" +#include "code\modules\projectiles\projectile\beams.dm" +#include "code\modules\projectiles\projectile\bio.dm" +#include "code\modules\projectiles\projectile\bullets.dm" +#include "code\modules\projectiles\projectile\energy.dm" +#include "code\modules\projectiles\projectile\rad.dm" +#include "code\modules\projectiles\projectile\special.dm" #include "code\modules\research\circuitprinter.dm" #include "code\modules\research\designs.dm" #include "code\modules\research\destructive_analyzer.dm"