diff --git a/code/datums/outfits/jobs/_defines.dm b/code/datums/outfits/jobs/_defines.dm index 8e39427315..e4bdd05fbb 100644 --- a/code/datums/outfits/jobs/_defines.dm +++ b/code/datums/outfits/jobs/_defines.dm @@ -1 +1,2 @@ #define OUTFIT_JOB_NAME(job_name) ("Job - " + job_name) +#define OUTFIT_MILITARY(job_name) ("Military Uniform - " + job_name) \ No newline at end of file diff --git a/code/datums/outfits/jobs/medical.dm b/code/datums/outfits/jobs/medical.dm index cbfd730261..2b3c2c2407 100644 --- a/code/datums/outfits/jobs/medical.dm +++ b/code/datums/outfits/jobs/medical.dm @@ -15,7 +15,7 @@ suit = /obj/item/clothing/suit/storage/toggle/labcoat/cmo shoes = /obj/item/clothing/shoes/brown l_hand = /obj/item/weapon/storage/firstaid/adv - r_pocket = /obj/item/device/flashlight/pen + r_pocket = /obj/item/device/healthanalyzer id_type = /obj/item/weapon/card/id/medical/head pda_type = /obj/item/device/pda/heads/cmo @@ -24,7 +24,7 @@ uniform = /obj/item/clothing/under/rank/medical suit = /obj/item/clothing/suit/storage/toggle/labcoat l_hand = /obj/item/weapon/storage/firstaid/adv - r_pocket = /obj/item/device/flashlight/pen + r_pocket = /obj/item/device/healthanalyzer id_type = /obj/item/weapon/card/id/medical/doctor /decl/hierarchy/outfit/job/medical/doctor/emergency_physician diff --git a/code/datums/outfits/military/fleet.dm b/code/datums/outfits/military/fleet.dm index 9960372505..cf5028978d 100644 --- a/code/datums/outfits/military/fleet.dm +++ b/code/datums/outfits/military/fleet.dm @@ -1,20 +1,20 @@ /decl/hierarchy/outfit/military/fleet/pt - name = "Fleet Uniform - PT" + name = OUTFIT_MILITARY("Fleet PT") uniform = /obj/item/clothing/under/pt/fleet shoes = /obj/item/clothing/shoes/black /decl/hierarchy/outfit/military/fleet/utility - name = "Fleet Uniform - Utility" + name = OUTFIT_MILITARY("Fleet Utility") uniform = /obj/item/clothing/under/utility/fleet shoes = /obj/item/clothing/shoes/boots/jackboots /decl/hierarchy/outfit/military/fleet/service - name = "Fleet Uniform - Service" + name = OUTFIT_MILITARY("Fleet Service") uniform = /obj/item/clothing/under/service/fleet shoes = /obj/item/clothing/shoes/dress/white /decl/hierarchy/outfit/military/fleet/dress - name = "Fleet Uniform - Dress" + name = OUTFIT_MILITARY("Fleet Dress") uniform = /obj/item/clothing/under/service/fleet shoes = /obj/item/clothing/shoes/dress/white suit = /obj/item/clothing/suit/storage/toggle/dress/fleet diff --git a/code/datums/outfits/military/marines.dm b/code/datums/outfits/military/marines.dm index 3fd5990653..d818dabcaa 100644 --- a/code/datums/outfits/military/marines.dm +++ b/code/datums/outfits/military/marines.dm @@ -1,21 +1,21 @@ /decl/hierarchy/outfit/military/marine/pt - name = "Marine Uniform - PT" + name = OUTFIT_MILITARY("Marine PT") uniform = /obj/item/clothing/under/pt/marine shoes = /obj/item/clothing/shoes/black /decl/hierarchy/outfit/military/marine/utility - name = "Marine Uniform - Utility" + name = OUTFIT_MILITARY("Marine Utility") uniform = /obj/item/clothing/under/utility/marine shoes = /obj/item/clothing/shoes/boots/jungle /decl/hierarchy/outfit/military/marine/service - name = "Marine Uniform - Service" + name = OUTFIT_MILITARY("Marine Service") uniform = /obj/item/clothing/under/service/marine shoes = /obj/item/clothing/shoes/dress suit = /obj/item/clothing/suit/storage/service/marine /decl/hierarchy/outfit/military/marine/dress - name = "Marine Uniform - Dress" + name = OUTFIT_MILITARY("Marine Dress") uniform = /obj/item/clothing/under/mildress/marine shoes = /obj/item/clothing/shoes/dress/white suit = /obj/item/clothing/suit/dress/marine diff --git a/code/datums/outfits/military/sifguard.dm b/code/datums/outfits/military/sifguard.dm index f417b55fe2..d031a5149d 100644 --- a/code/datums/outfits/military/sifguard.dm +++ b/code/datums/outfits/military/sifguard.dm @@ -1,21 +1,21 @@ /decl/hierarchy/outfit/military/sifguard/pt - name = "SifGuard Uniform - PT" + name = OUTFIT_MILITARY("SifGuard PT") uniform = /obj/item/clothing/under/pt/expeditionary shoes = /obj/item/clothing/shoes/black /decl/hierarchy/outfit/military/sifguard/utility - name = "SifGuard Uniform - Utility" + name = OUTFIT_MILITARY("SifGuard Utility") uniform = /obj/item/clothing/under/utility/expeditionary shoes = /obj/item/clothing/shoes/boots/jackboots /decl/hierarchy/outfit/military/sifguard/service - name = "SifGuard Uniform - Service" + name = OUTFIT_MILITARY("SifGuard Service") uniform = /obj/item/clothing/under/utility/expeditionary shoes = /obj/item/clothing/shoes/boots/jackboots suit = /obj/item/clothing/suit/storage/service/expeditionary /decl/hierarchy/outfit/military/sifguard/dress - name = "SifGuard Uniform - Dress" + name = OUTFIT_MILITARY("SifGuard Dress") uniform = /obj/item/clothing/under/mildress/expeditionary shoes = /obj/item/clothing/shoes/dress suit = /obj/item/clothing/suit/dress/expedition diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 1750a1b7c6..dc6c5e170d 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -427,6 +427,24 @@ origin_tech = list(TECH_POWER = 1) matter = list(DEFAULT_WALL_MATERIAL = 50,"glass" = 50) + var/charge = 0 + var/max_charge = 1000 + +/obj/item/weapon/stock_parts/capacitor/New() + . = ..() + max_charge *= rating + +/obj/item/weapon/stock_parts/capacitor/proc/charge(var/amount) + charge += amount + if(charge > max_charge) + charge = max_charge + +/obj/item/weapon/stock_parts/capacitor/proc/use(var/amount) + if(charge) + charge -= amount + if(charge < 0) + charge = 0 + /obj/item/weapon/stock_parts/scanning_module name = "scanning module" desc = "A compact, high resolution scanning module used in the construction of certain devices." diff --git a/code/game/gamemodes/changeling/powers/transform.dm b/code/game/gamemodes/changeling/powers/transform.dm index 37a9945210..9225792575 100644 --- a/code/game/gamemodes/changeling/powers/transform.dm +++ b/code/game/gamemodes/changeling/powers/transform.dm @@ -1,6 +1,6 @@ /datum/power/changeling/transform name = "Transform" - desc = "We take on the apperance and voice of one we have absorbed." + desc = "We take on the appearance and voice of one we have absorbed." ability_icon_state = "ling_transform" genomecost = 0 verbpath = /mob/proc/changeling_transform diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index f0135c5356..1062232664 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -9,7 +9,7 @@ /obj/effect/meteor/flaming=3, /obj/effect/meteor/irradiated=3, /obj/effect/meteor/emp=3) //for threatening meteor event /var/list/meteors_catastrophic = list(/obj/effect/meteor/medium=5, /obj/effect/meteor/big=75, \ - /obj/effect/meteor/flaming=10, /obj/effect/meteor/irradiated=10, /obj/effect/meteor/emp=10, /obj/effect/meteor/tunguska = 1) //for catastrophic meteor event + /obj/effect/meteor/flaming=10, /obj/effect/meteor/irradiated=10, /obj/effect/meteor/emp=10) //, /obj/effect/meteor/tunguska = 1) //for catastrophic meteor event /var/list/meteors_dust = list(/obj/effect/meteor/dust) //for space dust event diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index 445350608f..55055f480c 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -24,11 +24,12 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) outfit_type = /decl/hierarchy/outfit/job/captain alt_titles = list("Site Manager", "Overseer") +/* /datum/job/captain/equip(var/mob/living/carbon/human/H) . = ..() if(.) H.implant_loyalty(src) - +*/ /datum/job/captain/get_access() return get_all_station_access() diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index fa7cd29be3..37d528a199 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -47,7 +47,7 @@ idtype = /obj/item/weapon/card/id/civilian/botanist access = list(access_hydroponics, access_bar, access_kitchen) minimal_access = list(access_hydroponics) - + outfit_type = /decl/hierarchy/outfit/job/service/gardener alt_titles = list("Hydroponicist", "Gardener") @@ -161,7 +161,9 @@ outfit_type = /decl/hierarchy/outfit/job/internal_affairs_agent +/* /datum/job/lawyer/equip(var/mob/living/carbon/human/H) . = ..() if(.) - H.implant_loyalty(H) \ No newline at end of file + H.implant_loyalty(H) +*/ \ No newline at end of file diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 408e3184d4..d546ef4676 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -387,9 +387,9 @@ var/dat = "" if(gameStatus == ORION_STATUS_GAMEOVER) dat = "

Game Over

" - dat += "Like many before you, your crew never made it to Orion, lost to space...
Forever." + dat += "Like many before you, your crew never made it to Orion, lost to space...
forever." if(settlers.len == 0) - dat += "
Your entire crew died, your ship joins the fleet of ghost-ships littering the galaxy." + dat += "
Your entire crew died, and your ship joins the fleet of ghost-ships littering the galaxy." else if(food <= 0) dat += "
You ran out of food and starved." @@ -650,17 +650,17 @@ if(prob(success)) FU = rand(5,15) FO = rand(5,15) - last_spaceport_action = "You successfully raided the spaceport! you gained [FU] Fuel and [FO] Food! (+[FU]FU,+[FO]FO)" + last_spaceport_action = "You successfully raided the spaceport! You gained [FU] Fuel and [FO] Food! (+[FU]FU,+[FO]FO)" else FU = rand(-5,-15) FO = rand(-5,-15) - last_spaceport_action = "You failed to raid the spaceport! you lost [FU*-1] Fuel and [FO*-1] Food in your scramble to escape! ([FU]FU,[FO]FO)" + last_spaceport_action = "You failed to raid the spaceport! You lost [FU*-1] Fuel and [FO*-1] Food in your scramble to escape! ([FU]FU,[FO]FO)" //your chance of lose a crewmember is 1/2 your chance of success //this makes higher % failures hurt more, don't get cocky space cowboy! if(prob(success*5)) var/lost_crew = remove_crewmember() - last_spaceport_action = "You failed to raid the spaceport! you lost [FU*-1] Fuel and [FO*-1] Food, AND [lost_crew] in your scramble to escape! ([FU]FI,[FO]FO,-Crew)" + last_spaceport_action = "You failed to raid the spaceport! You lost [FU*-1] Fuel and [FO*-1] Food, AND [lost_crew] in your scramble to escape! ([FU]FI,[FO]FO,-Crew)" if(emagged) src.visible_message("The machine states, 'YOU ARE UNDER ARREST, RAIDER!' and shoots handcuffs onto [usr]!", "You hear something say 'YOU ARE UNDER ARREST, RAIDER!' and a clinking sound") var/obj/item/weapon/handcuffs/C = new(src.loc) @@ -730,9 +730,9 @@ eventdat += "
They have stolen [sfood] Food and [sfuel] Fuel." else if(prob(10)) var/deadname = remove_crewmember() - eventdat += "
[deadname] tried to fight back but was killed." + eventdat += "
[deadname] tried to fight back, but was killed." else - eventdat += "
Fortunately you fended them off without any trouble." + eventdat += "
Fortunately, you fended them off without any trouble." eventdat += "

Continue

" eventdat += "

Close

" canContinueEvent = 1 @@ -890,7 +890,7 @@ add_crewmember() freecrew++ - eventdat += "
The traders of the spaceport take pitty on you, and give you some food and fuel (+[FU]FU,+[FO]FO)" + eventdat += "
The traders of the spaceport take pity on you, and give you some supplies. (+[FU]FU,+[FO]FO)" if(freecrew) eventdat += "
You also gain a new crewmember!" @@ -904,13 +904,13 @@ if(food >= 10 && fuel >= 10) eventdat += "

Hire a new Crewmember (-10FU,-10FO)

" else - eventdat += "

Cant afford a new Crewmember

" + eventdat += "

You cannot afford a new Crewmember

" //Sell crew if(settlers.len > 1) eventdat += "

Sell crew for Fuel and Food (+7FU,+7FO)

" else - eventdat += "

Cant afford to sell a Crewmember

" + eventdat += "

You cannot afford to sell a Crewmember

" //BUY/SELL STUFF eventdat += "

Spare Parts:

" @@ -919,30 +919,30 @@ if(fuel > 5) eventdat += "

Buy Engine Parts (-5FU)

" else - eventdat += "

Cant afford to buy Engine Parts" + eventdat += "

You cannot afford to buy Engine Parts" //Hull plates if(fuel > 5) eventdat += "

Buy Hull Plates (-5FU)

" else - eventdat += "

Cant afford to buy Hull Plates" + eventdat += "

You cannot afford to buy Hull Plates" //Electronics if(fuel > 5) eventdat += "

Buy Spare Electronics (-5FU)

" else - eventdat += "

Cant afford to buy Spare Electronics" + eventdat += "

You cannot afford to buy Spare Electronics" //Trade if(fuel > 5) eventdat += "

Trade Fuel for Food (-5FU,+5FO)

" else - eventdat += "

Cant afford to Trade Fuel for Food 5) eventdat += "

Trade Food for Fuel (+5FU,-5FO)

" else - eventdat += "

Cant afford to Trade Food for Fuel* [chassis.selected==src?"":""][src.name][chassis.selected==src?"":""]\[[src.projectiles]\]" /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited/rearm() - return//Extra bit of security \ No newline at end of file + return//Extra bit of security + +////////////// +//Fire-based// +////////////// + +/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/incendiary + name = "\improper DR-AC 3" + desc = "Dual-barrel rotary machinegun that fires small, incendiary rounds. Ages ten and up." + description_fluff = "A weapon designed by Hephaestus Industries, the DR-AC 3's design was plagued by prototype faults including but not limited to: Spontaneous combustion, spontaneous detonation, and excessive collateral conflagration." + icon_state = "mecha_drac3" + equip_cooldown = 20 + projectile = /obj/item/projectile/bullet/incendiary + fire_sound = 'sound/weapons/machinegun.ogg' + projectiles = 30 + projectiles_per_shot = 2 + deviation = 0.4 + projectile_energy_cost = 40 + fire_cooldown = 3 + origin_tech = list(TECH_MATERIAL = 4, TECH_COMBAT = 5, TECH_PHORON = 2, TECH_ILLEGAL = 1) + +/obj/item/mecha_parts/mecha_equipment/weapon/energy/flamer + equip_cooldown = 30 + name = "\improper CR-3 Mark 8" + desc = "An imposing device, this weapon hurls balls of fire." + description_fluff = "A weapon designed by Hephaestus for anti-infantry combat, the CR-3 is capable of outputting a large volume of synthesized fuel. Initially designed by a small company, later purchased by Aether, on Earth as a device made for clearing underbrush and co-operating with firefighting operations. Obviously, Hephaestus has found an 'improved' use for the Aether designs." + icon_state = "mecha_cremate" + + energy_drain = 30 + + projectile = /obj/item/projectile/bullet/incendiary/flamethrower/large + fire_sound = 'sound/weapons/towelwipe.ogg' + + origin_tech = list(TECH_MATERIAL = 4, TECH_COMBAT = 6, TECH_PHORON = 4, TECH_ILLEGAL = 4) + +/obj/item/mecha_parts/mecha_equipment/weapon/energy/flamer/rigged + name = "\improper AA-CR-1 Mark 4" + description_fluff = "A firefighting tool maintained by Aether Atmospherics, whose initial design originated from a small Earth company. This one seems to have been jury rigged." + + energy_drain = 50 + required_type = list(/obj/mecha/combat, /obj/mecha/working) + + projectile = /obj/item/projectile/bullet/incendiary/flamethrower + + origin_tech = list(TECH_MATERIAL = 3, TECH_COMBAT = 3, TECH_PHORON = 3, TECH_ILLEGAL = 2) diff --git a/code/game/objects/effects/decals/Cleanable/fuel.dm b/code/game/objects/effects/decals/Cleanable/fuel.dm index 2bf3a2a574..85e68c31af 100644 --- a/code/game/objects/effects/decals/Cleanable/fuel.dm +++ b/code/game/objects/effects/decals/Cleanable/fuel.dm @@ -6,66 +6,66 @@ anchored = 1 var/amount = 1 - New(turf/newLoc,amt=1,nologs=0) - if(!nologs) - message_admins("Liquid fuel has spilled in [newLoc.loc.name] ([newLoc.x],[newLoc.y],[newLoc.z]) (JMP)") - log_game("Liquid fuel has spilled in [newLoc.loc.name] ([newLoc.x],[newLoc.y],[newLoc.z])") - src.amount = amt +/obj/effect/decal/cleanable/liquid_fuel/New(turf/newLoc,amt=1,nologs=0) + if(!nologs) + message_admins("Liquid fuel has spilled in [newLoc.loc.name] ([newLoc.x],[newLoc.y],[newLoc.z]) (JMP)") + log_game("Liquid fuel has spilled in [newLoc.loc.name] ([newLoc.x],[newLoc.y],[newLoc.z])") + src.amount = amt - var/has_spread = 0 - //Be absorbed by any other liquid fuel in the tile. - for(var/obj/effect/decal/cleanable/liquid_fuel/other in newLoc) - if(other != src) - other.amount += src.amount - other.Spread() - has_spread = 1 - break - - . = ..() - if(!has_spread) - Spread() - else - qdel(src) - - proc/Spread(exclude=list()) - //Allows liquid fuels to sometimes flow into other tiles. - if(amount < 15) return //lets suppose welder fuel is fairly thick and sticky. For something like water, 5 or less would be more appropriate. - var/turf/simulated/S = loc - if(!istype(S)) return - for(var/d in cardinal) - var/turf/simulated/target = get_step(src,d) - var/turf/simulated/origin = get_turf(src) - if(origin.CanPass(null, target, 0, 0) && target.CanPass(null, origin, 0, 0)) - var/obj/effect/decal/cleanable/liquid_fuel/other_fuel = locate() in target - if(other_fuel) - other_fuel.amount += amount*0.25 - if(!(other_fuel in exclude)) - exclude += src - other_fuel.Spread(exclude) - else - new/obj/effect/decal/cleanable/liquid_fuel(target, amount*0.25,1) - amount *= 0.75 - - - flamethrower_fuel - icon_state = "mustard" - anchored = 0 - New(newLoc, amt = 1, d = 0) - set_dir(d) //Setting this direction means you won't get torched by your own flamethrower. - . = ..() + var/has_spread = 0 + //Be absorbed by any other liquid fuel in the tile. + for(var/obj/effect/decal/cleanable/liquid_fuel/other in newLoc) + if(other != src) + other.amount += src.amount + other.Spread() + has_spread = 1 + break + . = ..() + if(!has_spread) Spread() - //The spread for flamethrower fuel is much more precise, to create a wide fire pattern. - if(amount < 0.1) return - var/turf/simulated/S = loc - if(!istype(S)) return + else + qdel(src) - for(var/d in list(turn(dir,90),turn(dir,-90), dir)) - var/turf/simulated/O = get_step(S,d) - if(locate(/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel) in O) - continue - if(O.CanPass(null, S, 0, 0) && S.CanPass(null, O, 0, 0)) - new/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(O,amount*0.25,d) - O.hotspot_expose((T20C*2) + 380,500) //Light flamethrower fuel on fire immediately. +/obj/effect/decal/cleanable/liquid_fuel/proc/Spread(exclude=list()) + //Allows liquid fuels to sometimes flow into other tiles. + if(amount < 15) return //lets suppose welder fuel is fairly thick and sticky. For something like water, 5 or less would be more appropriate. + var/turf/simulated/S = loc + if(!istype(S)) return + for(var/d in cardinal) + var/turf/simulated/target = get_step(src,d) + var/turf/simulated/origin = get_turf(src) + if(origin.CanPass(null, target, 0, 0) && target.CanPass(null, origin, 0, 0)) + var/obj/effect/decal/cleanable/liquid_fuel/other_fuel = locate() in target + if(other_fuel) + other_fuel.amount += amount*0.25 + if(!(other_fuel in exclude)) + exclude += src + other_fuel.Spread(exclude) + else + new/obj/effect/decal/cleanable/liquid_fuel(target, amount*0.25,1) + amount *= 0.75 - amount *= 0.25 +/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel + icon_state = "mustard" + anchored = 0 + +/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel/New(newLoc, amt = 1, d = 0) + set_dir(d) //Setting this direction means you won't get torched by your own flamethrower. + . = ..() + +/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel/Spread() + //The spread for flamethrower fuel is much more precise, to create a wide fire pattern. + if(amount < 0.1) return + var/turf/simulated/S = loc + if(!istype(S)) return + + for(var/d in list(turn(dir,90),turn(dir,-90), dir)) + var/turf/simulated/O = get_step(S,d) + if(locate(/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel) in O) + continue + if(O.CanPass(null, S, 0, 0) && S.CanPass(null, O, 0, 0)) + new/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(O,amount*0.25,d) + O.hotspot_expose((T20C*2) + 380,500) //Light flamethrower fuel on fire immediately. + + amount *= 0.25 diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index e21c509c15..d79f584e2f 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -17,6 +17,7 @@ matter = list(DEFAULT_WALL_MATERIAL = 50000) var/datum/effect/effect/system/spark_spread/spark_system var/stored_matter = 0 + var/max_stored_matter = 30 var/working = 0 var/mode = 1 var/list/modes = list("Floor & Walls","Airlock","Deconstruct") @@ -32,7 +33,7 @@ /obj/item/weapon/rcd/examine() ..() if(src.type == /obj/item/weapon/rcd && loc == usr) - usr << "It currently holds [stored_matter]/30 matter-units." + usr << "It currently holds [stored_matter]/[max_stored_matter] matter-units." /obj/item/weapon/rcd/New() ..() @@ -48,14 +49,15 @@ /obj/item/weapon/rcd/attackby(obj/item/weapon/W, mob/user) if(istype(W, /obj/item/weapon/rcd_ammo)) - if((stored_matter + 10) > 30) - user << "The RCD can't hold any more matter-units." + var/obj/item/weapon/rcd_ammo/cartridge = W + if((stored_matter + cartridge.remaining) > max_stored_matter) + to_chat(user, "The RCD can't hold that many additional matter-units.") return + stored_matter += cartridge.remaining user.drop_from_inventory(W) qdel(W) - stored_matter += 10 playsound(src.loc, 'sound/machines/click.ogg', 50, 1) - user << "The RCD now holds [stored_matter]/30 matter-units." + to_chat(user, "The RCD now holds [stored_matter]/[max_stored_matter] matter-units.") return ..() @@ -164,6 +166,14 @@ w_class = ITEMSIZE_SMALL origin_tech = list(TECH_MATERIAL = 2) matter = list(DEFAULT_WALL_MATERIAL = 30000,"glass" = 15000) + var/remaining = 10 + +/obj/item/weapon/rcd_ammo/large + name = "high-capacity matter cartridge" + desc = "Do not ingest." + matter = list(DEFAULT_WALL_MATERIAL = 45000,"glass" = 22500) + remaining = 30 + origin_tech = list(TECH_MATERIAL = 4) /obj/item/weapon/rcd/borg canRwall = 1 diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm index 6f76aad00a..87a76305c6 100644 --- a/code/game/objects/items/weapons/implants/implanter.dm +++ b/code/game/objects/items/weapons/implants/implanter.dm @@ -44,7 +44,7 @@ return if(active) if (imp) - M.visible_message("[user] is attemping to implant [M].") + M.visible_message("[user] is attempting to implant [M].") user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) user.do_attack_animation(M) diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index b3e3bb4e80..53aa3258e1 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -122,6 +122,8 @@ sharp = 1 edge = 1 var/blade_color + var/random_color = TRUE + var/active_state = "sword" /obj/item/weapon/melee/energy/sword/dropped(var/mob/user) ..() @@ -129,8 +131,9 @@ deactivate(user) /obj/item/weapon/melee/energy/sword/New() - blade_color = pick("red","blue","green","purple") - lcolor = blade_color + if(random_color) + blade_color = pick("red","blue","green","purple") + lcolor = blade_color /obj/item/weapon/melee/energy/sword/green/New() blade_color = "green" @@ -154,7 +157,7 @@ ..() attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - icon_state = "sword[blade_color]" + icon_state = "[active_state][blade_color]" /obj/item/weapon/melee/energy/sword/deactivate(mob/living/user) @@ -184,6 +187,55 @@ ..() icon_state = "cutlass1" +/* + *Ionic Rapier + */ + +/obj/item/weapon/melee/energy/sword/ionic_rapier + name = "ionic rapier" + desc = "Designed specifically for disrupting electronics at close range, it is extremely deadly against synthetics, but almost harmless to pure organic targets." + description_info = "This is a dangerous melee weapon that will deliver a moderately powerful electromagnetic pulse to whatever it strikes. \ + Striking a lesser robotic entity will compel it to attack you, as well. It also does extra burn damage to robotic entities, but it does \ + very little damage to purely organic targets." + icon_state = "ionic_rapier0" + random_color = FALSE + active_force = 5 + active_throwforce = 3 + active_embed_chance = 0 + sharp = 1 + edge = 1 + armor_penetration = 0 + flags = NOBLOODY + lrange = 2 + lpower = 2 + lcolor = "#0000FF" + active_state = "ionic_rapier" + +/obj/item/weapon/melee/energy/sword/ionic_rapier/afterattack(var/atom/movable/AM, var/mob/living/user, var/proximity) + if(istype(AM, /obj) && proximity && active) + // EMP stuff. + var/obj/O = AM + O.emp_act(3) // A weaker severity is used because this has infinite uses. + playsound(get_turf(O), 'sound/effects/EMPulse.ogg', 100, 1) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) // A lot of objects don't set click delay. + return ..() + +/obj/item/weapon/melee/energy/sword/ionic_rapier/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone) + . = ..() + if(target.isSynthetic() && active) + // Do some extra damage. Not a whole lot more since emp_act() is pretty nasty on FBPs already. + target.emp_act(3) // A weaker severity is used because this has infinite uses. + playsound(get_turf(target), 'sound/effects/EMPulse.ogg', 100, 1) + target.adjustFireLoss(force * 3) // 15 Burn, for 20 total. + playsound(get_turf(target), 'sound/weapons/blade1.ogg', 100, 1) + + // Make lesser robots really mad at us. + if(istype(target, /mob/living/simple_animal)) + var/mob/living/simple_animal/SA = target + if(SA.intelligence_level == SA_ROBOTIC) + SA.taunt(user) + SA.adjustFireLoss(force * 6) // 30 Burn, for 50 total. + /* *Energy Blade */ diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm index 7398efa44d..b958d18840 100644 --- a/code/modules/clothing/under/jobs/medsci.dm +++ b/code/modules/clothing/under/jobs/medsci.dm @@ -16,7 +16,7 @@ /obj/item/clothing/under/rank/research_director/dress_rd name = "research director dress uniform" - desc = "Feminine fashion for the style concious RD. Its fabric provides minor protection from biological contaminants." + desc = "Feminine fashion for the style conscious RD. Its fabric provides minor protection from biological contaminants." icon_state = "dress_rd" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS @@ -194,4 +194,4 @@ item_state_slots = list(slot_r_hand_str = "white", slot_l_hand_str = "white") permeability_coefficient = 0.50 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) - rolled_sleeves = 0 \ No newline at end of file + rolled_sleeves = 0 diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 9c8eb14582..7f9586b6a0 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -363,13 +363,13 @@ /obj/item/clothing/under/dress/dress_cap name = "colony director's dress uniform" - desc = "Feminine fashion for the style concious Colony Director." + desc = "Feminine fashion for the style conscious Colony Director." icon_state = "dress_cap" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS /obj/item/clothing/under/dress/dress_hop name = "head of personnel dress uniform" - desc = "Feminine fashion for the style concious HoP." + desc = "Feminine fashion for the style conscious HoP." icon_state = "dress_hop" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS @@ -808,4 +808,4 @@ name = "bathrobe" desc = "A fluffy robe to keep you from showing off to the world." icon_state = "bathrobe" - worn_state = "bathrobe" \ No newline at end of file + worn_state = "bathrobe" diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm index 99abbe2e12..3e3099bbbc 100644 --- a/code/modules/materials/material_recipes.dm +++ b/code/modules/materials/material_recipes.dm @@ -135,6 +135,7 @@ recipes += new/datum/stack_recipe("book shelf", /obj/structure/bookcase, 5, time = 15, one_per_turf = 1, on_floor = 1) recipes += new/datum/stack_recipe("noticeboard frame", /obj/item/frame/noticeboard, 4, time = 5, one_per_turf = 0, on_floor = 1) recipes += new/datum/stack_recipe("wooden bucket", /obj/item/weapon/reagent_containers/glass/bucket/wood, 2, time = 4, one_per_turf = 0, on_floor = 0) + recipes += new/datum/stack_recipe("coilgun stock", /obj/item/weapon/coilgun_assembly, 5) /material/cardboard/generate_recipes() ..() diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 55d82ef2ce..896c699777 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -232,14 +232,28 @@ m_type = 1 else if(!muzzled) - message = "coughs!" + var/robotic = 0 m_type = 2 - if(gender == FEMALE) - if(species.female_cough_sounds) - playsound(src, pick(species.female_cough_sounds), 120) + if(should_have_organ(O_LUNGS)) + var/obj/item/organ/internal/lungs/L = internal_organs_by_name[O_LUNGS] + if(L && L.robotic == 2) //Hard-coded to 2, incase we add lifelike robotic lungs + robotic = 1 + if(!robotic) + message = "coughs!" + if(gender == FEMALE) + if(species.female_cough_sounds) + playsound(src, pick(species.female_cough_sounds), 120) + else + if(species.male_cough_sounds) + playsound(src, pick(species.male_cough_sounds), 120) else - if(species.male_cough_sounds) - playsound(src, pick(species.male_cough_sounds), 120) + message = "emits a robotic cough" + var/use_sound + if(gender == FEMALE) + use_sound = pick('sound/effects/mob_effects/f_machine_cougha.ogg','sound/effects/mob_effects/f_machine_coughb.ogg') + else + use_sound = pick('sound/effects/mob_effects/m_machine_cougha.ogg','sound/effects/mob_effects/m_machine_coughb.ogg', 'sound/effects/mob_effects/m_machine_coughc.ogg') + playsound(src.loc, use_sound, 50, 0) else message = "makes a strong noise." m_type = 2 @@ -492,12 +506,27 @@ m_type = 1 else if(!muzzled) - message = "sneezes." - if(gender == FEMALE) - playsound(src, species.female_sneeze_sound, 70) - else - playsound(src, species.male_sneeze_sound, 70) + var/robotic = 0 m_type = 2 + if(should_have_organ(O_LUNGS)) + var/obj/item/organ/internal/lungs/L = internal_organs_by_name[O_LUNGS] + if(L && L.robotic == 2) //Hard-coded to 2, incase we add lifelike robotic lungs + robotic = 1 + if(!robotic) + message = "sneezes." + if(gender == FEMALE) + playsound(src, species.female_sneeze_sound, 70) + else + playsound(src, species.male_sneeze_sound, 70) + m_type = 2 + else + message = "emits a robotic sneeze" + var/use_sound + if(gender == FEMALE) + use_sound = 'sound/effects/mob_effects/machine_sneeze.ogg' + else + use_sound = 'sound/effects/mob_effects/f_machine_sneeze.ogg' + playsound(src.loc, use_sound, 50, 0) else message = "makes a strange noise." m_type = 2 diff --git a/code/modules/mob/living/carbon/taste.dm b/code/modules/mob/living/carbon/taste.dm index 29e28a4559..bd0fbccfd4 100644 --- a/code/modules/mob/living/carbon/taste.dm +++ b/code/modules/mob/living/carbon/taste.dm @@ -1,4 +1,10 @@ /mob/living/carbon/proc/ingest(var/datum/reagents/from, var/datum/reagents/target, var/amount = 1, var/multiplier = 1, var/copy = 0) //we kind of 'sneak' a proc in here for ingesting stuff so we can play with it. + if(ishuman(src)) + var/mob/living/carbon/human/H = src + var/braintype = H.get_FBP_type() + if(braintype == FBP_DRONE || braintype == FBP_POSI) + return from.trans_to_holder(target,amount,multiplier,copy) //skip the taste, complete transfer + if(last_taste_time + 50 < world.time) var/datum/reagents/temp = new(amount) //temporary holder used to analyse what gets transfered. from.trans_to_holder(temp, amount, multiplier, 1) diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 0fa139c36f..22289c6b43 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -87,7 +87,7 @@ return 1 -/mob/living/proc/apply_effects(var/stun = 0, var/weaken = 0, var/paralyze = 0, var/irradiate = 0, var/stutter = 0, var/eyeblur = 0, var/drowsy = 0, var/agony = 0, var/blocked = 0) +/mob/living/proc/apply_effects(var/stun = 0, var/weaken = 0, var/paralyze = 0, var/irradiate = 0, var/stutter = 0, var/eyeblur = 0, var/drowsy = 0, var/agony = 0, var/blocked = 0, var/ignite = 0, var/flammable = 0) if(blocked >= 100) return 0 if(stun) apply_effect(stun, STUN, blocked) @@ -98,4 +98,6 @@ if(eyeblur) apply_effect(eyeblur, EYE_BLUR, blocked) if(drowsy) apply_effect(drowsy, DROWSY, blocked) if(agony) apply_effect(agony, AGONY, blocked) + if(flammable) adjust_fire_stacks(flammable) + if(ignite) IgniteMob() return 1 diff --git a/code/modules/mob/living/simple_animal/aliens/hivebot.dm b/code/modules/mob/living/simple_animal/aliens/hivebot.dm index 02f48d13fa..aefe91b371 100644 --- a/code/modules/mob/living/simple_animal/aliens/hivebot.dm +++ b/code/modules/mob/living/simple_animal/aliens/hivebot.dm @@ -51,6 +51,9 @@ say_maybe_target = list("Possible threat detected. Investigating.", "Motion detected.", "Investigating.") say_got_target = list("Threat detected.", "New task: Remove threat.", "Threat removal engaged.", "Engaging target.") +/mob/living/simple_animal/hostile/hivebot/isSynthetic() + return TRUE + // Subtypes. // Melee like the base type, but more fragile. diff --git a/code/modules/projectiles/ammunition/magnetic.dm b/code/modules/projectiles/ammunition/magnetic.dm new file mode 100644 index 0000000000..fc299adf0b --- /dev/null +++ b/code/modules/projectiles/ammunition/magnetic.dm @@ -0,0 +1,13 @@ +/obj/item/weapon/magnetic_ammo + name = "flechette magazine" + desc = "A magazine containing steel flechettes." + icon = 'icons/obj/ammo.dmi' + icon_state = "5.56" + w_class = ITEMSIZE_SMALL + matter = list(DEFAULT_WALL_MATERIAL = 1800) + origin_tech = list(TECH_COMBAT = 1) + var/remaining = 9 + +/obj/item/weapon/magnetic_ammo/examine(mob/user) + . = ..() + to_chat(user, "There [(remaining == 1)? "is" : "are"] [remaining] flechette\s left!") \ No newline at end of file diff --git a/code/modules/projectiles/guns/magnetic/magnetic.dm b/code/modules/projectiles/guns/magnetic/magnetic.dm new file mode 100644 index 0000000000..130f4410df --- /dev/null +++ b/code/modules/projectiles/guns/magnetic/magnetic.dm @@ -0,0 +1,195 @@ +/obj/item/weapon/gun/magnetic + name = "improvised coilgun" + desc = "A coilgun hastily thrown together out of a basic frame and advanced power storage components. Is it safe for it to be duct-taped together like that?" + icon_state = "coilgun" + item_state = "coilgun" + icon = 'icons/obj/railgun.dmi' +// one_hand_penalty = 1 + origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 4, TECH_ILLEGAL = 2, TECH_MAGNET = 4) + w_class = ITEMSIZE_LARGE + + var/obj/item/weapon/cell/cell // Currently installed powercell. + var/obj/item/weapon/stock_parts/capacitor/capacitor // Installed capacitor. Higher rating == faster charge between shots. + var/removable_components = TRUE // Whether or not the gun can be dismantled. + var/gun_unreliable = 15 // Percentage chance of detonating in your hands. + + var/obj/item/loaded // Currently loaded object, for retrieval/unloading. + var/load_type = /obj/item/stack/rods // Type of stack to load with. + var/projectile_type = /obj/item/projectile/bullet/magnetic // Actual fire type, since this isn't throw_at rod launcher. + + var/power_cost = 950 // Cost per fire, should consume almost an entire basic cell. + var/power_per_tick // Capacitor charge per process(). Updated based on capacitor rating. + + fire_sound = 'sound/weapons/railgun.ogg' + +/obj/item/weapon/gun/magnetic/New() + processing_objects.Add(src) + if(capacitor) + power_per_tick = (power_cost*0.15) * capacitor.rating + update_icon() + . = ..() + +/obj/item/weapon/gun/magnetic/Destroy() + processing_objects.Remove(src) + qdel_null(cell) + qdel_null(loaded) + qdel_null(capacitor) + . = ..() + +/obj/item/weapon/gun/magnetic/process() + if(capacitor) + if(cell) + if(capacitor.charge < capacitor.max_charge && cell.checked_use(power_per_tick)) + capacitor.charge(power_per_tick) + else + capacitor.use(capacitor.charge * 0.05) + update_icon() + +/obj/item/weapon/gun/magnetic/update_icon() + var/list/overlays_to_add = list() + if(removable_components) + if(cell) + overlays_to_add += image(icon, "[icon_state]_cell") + if(capacitor) + overlays_to_add += image(icon, "[icon_state]_capacitor") + if(!cell || !capacitor) + overlays_to_add += image(icon, "[icon_state]_red") + else if(capacitor.charge < power_cost) + overlays_to_add += image(icon, "[icon_state]_amber") + else + overlays_to_add += image(icon, "[icon_state]_green") + if(loaded) + overlays_to_add += image(icon, "[icon_state]_loaded") + + overlays = overlays_to_add + ..() + +/obj/item/weapon/gun/magnetic/proc/show_ammo(var/mob/user) + if(loaded) + to_chat(user, "It has \a [loaded] loaded.") + +/obj/item/weapon/gun/magnetic/examine(var/mob/user) + . = ..(user, 2) + if(.) + show_ammo(user) + + if(cell) + to_chat(user, "The installed [cell.name] has a charge level of [round((cell.charge/cell.maxcharge)*100)]%.") + if(capacitor) + to_chat(user, "The installed [capacitor.name] has a charge level of [round((capacitor.charge/capacitor.max_charge)*100)]%.") + + if(!cell || !capacitor) + to_chat(user, "The capacitor charge indicator is blinking red. Maybe you should check the cell or capacitor.") + else + if(capacitor.charge < power_cost) + to_chat(user, "The capacitor charge indicator is amber.") + else + to_chat(user, "The capacitor charge indicator is green.") + return TRUE + +/obj/item/weapon/gun/magnetic/attackby(var/obj/item/thing, var/mob/user) + + if(removable_components) + if(istype(thing, /obj/item/weapon/cell)) + if(cell) + to_chat(user, "\The [src] already has \a [cell] installed.") + return + cell = thing + user.drop_from_inventory(cell) + cell.forceMove(src) + playsound(loc, 'sound/machines/click.ogg', 10, 1) + user.visible_message("\The [user] slots \the [cell] into \the [src].") + update_icon() + return + + if(isscrewdriver(thing)) + if(!capacitor) + to_chat(user, "\The [src] has no capacitor installed.") + return + capacitor.forceMove(get_turf(src)) + user.put_in_hands(capacitor) + user.visible_message("\The [user] unscrews \the [capacitor] from \the [src].") + playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) + capacitor = null + update_icon() + return + + if(istype(thing, /obj/item/weapon/stock_parts/capacitor)) + if(capacitor) + to_chat(user, "\The [src] already has \a [capacitor] installed.") + return + capacitor = thing + user.drop_from_inventory(capacitor) + capacitor.forceMove(src) + playsound(loc, 'sound/machines/click.ogg', 10, 1) + power_per_tick = (power_cost*0.15) * capacitor.rating + user.visible_message("\The [user] slots \the [capacitor] into \the [src].") + update_icon() + return + + if(istype(thing, load_type)) + + if(loaded) + to_chat(user, "\The [src] already has \a [loaded] loaded.") + return + + // This is not strictly necessary for the magnetic gun but something using + // specific ammo types may exist down the track. + var/obj/item/stack/ammo = thing + if(!istype(ammo)) + loaded = thing + user.drop_from_inventory(thing) + thing.forceMove(src) + else + loaded = new load_type(src, 1) + ammo.use(1) + + user.visible_message("\The [user] loads \the [src] with \the [loaded].") + playsound(loc, 'sound/weapons/flipblade.ogg', 50, 1) + update_icon() + return + . = ..() + +/obj/item/weapon/gun/magnetic/attack_hand(var/mob/user) + if(user.get_inactive_hand() == src) + var/obj/item/removing + + if(loaded) + removing = loaded + loaded = null + else if(cell && removable_components) + removing = cell + cell = null + + if(removing) + removing.forceMove(get_turf(src)) + user.put_in_hands(removing) + user.visible_message("\The [user] removes \the [removing] from \the [src].") + playsound(loc, 'sound/machines/click.ogg', 10, 1) + update_icon() + return + . = ..() + +/obj/item/weapon/gun/magnetic/proc/check_ammo() + return loaded + +/obj/item/weapon/gun/magnetic/proc/use_ammo() + qdel(loaded) + loaded = null + +/obj/item/weapon/gun/magnetic/consume_next_projectile() + + if(!check_ammo() || !capacitor || capacitor.charge < power_cost) + return + + use_ammo() + capacitor.use(power_cost) + update_icon() + + if(gun_unreliable && prob(gun_unreliable)) + spawn(3) // So that it will still fire - considered modifying Fire() to return a value but burst fire makes that annoying. + visible_message("\The [src] explodes with the force of the shot!") + explosion(get_turf(src), -1, 0, 2) + qdel(src) + + return new projectile_type(src) diff --git a/code/modules/projectiles/guns/magnetic/magnetic_construction.dm b/code/modules/projectiles/guns/magnetic/magnetic_construction.dm new file mode 100644 index 0000000000..0c3647458b --- /dev/null +++ b/code/modules/projectiles/guns/magnetic/magnetic_construction.dm @@ -0,0 +1,101 @@ +// We really need some datums for this. +/obj/item/weapon/coilgun_assembly + name = "coilgun stock" + desc = "It might be a coilgun, someday." + icon = 'icons/obj/coilgun.dmi' + icon_state = "coilgun_construction_1" + + var/construction_stage = 1 + +/obj/item/weapon/coilgun_assembly/attackby(var/obj/item/thing, var/mob/user) + + if(istype(thing, /obj/item/stack/material) && construction_stage == 1) + var/obj/item/stack/material/reinforcing = thing + var/material/reinforcing_with = reinforcing.get_material() + if(reinforcing_with.name == DEFAULT_WALL_MATERIAL) // Steel + if(reinforcing.get_amount() < 5) + to_chat(user, "You need at least 5 [reinforcing.singular_name]\s for this task.") + return + reinforcing.use(5) + user.visible_message("\The [user] shapes some steel sheets around \the [src] to form a body.") + increment_construction_stage() + return + + if(istype(thing, /obj/item/weapon/tape_roll) && construction_stage == 2) + user.visible_message("\The [user] secures \the [src] together with \the [thing].") + increment_construction_stage() + return + + if(istype(thing, /obj/item/pipe) && construction_stage == 3) + user.drop_from_inventory(thing) + qdel(thing) + user.visible_message("\The [user] jams \the [thing] into \the [src].") + increment_construction_stage() + return + + if(istype(thing, /obj/item/weapon/weldingtool) && construction_stage == 4) + var/obj/item/weapon/weldingtool/welder = thing + + if(!welder.isOn()) + to_chat(user, "Turn it on first!") + return + + if(!welder.remove_fuel(0,user)) + to_chat(user, "You need more fuel!") + return + + user.visible_message("\The [user] welds the barrel of \the [src] into place.") + playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1) + increment_construction_stage() + return + + if(istype(thing, /obj/item/stack/cable_coil) && construction_stage == 5) + var/obj/item/stack/cable_coil/cable = thing + if(cable.get_amount() < 5) + to_chat(user, "You need at least 5 lengths of cable for this task.") + return + cable.use(5) + user.visible_message("\The [user] wires \the [src].") + increment_construction_stage() + return + + if(istype(thing, /obj/item/weapon/smes_coil) && construction_stage >= 6 && construction_stage <= 8) + user.visible_message("\The [user] installs \a [thing] into \the [src].") + user.drop_from_inventory(thing) + qdel(thing) + increment_construction_stage() + return + + if(isscrewdriver(thing) && construction_stage >= 9) + user.visible_message("\The [user] secures \the [src] and finishes it off.") + playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1) + var/obj/item/weapon/gun/magnetic/coilgun = new(loc) + var/put_in_hands + var/mob/M = src.loc + if(istype(M)) + put_in_hands = M == user + M.drop_from_inventory(src) + if(put_in_hands) + user.put_in_hands(coilgun) + qdel(src) + return + + return ..() + +/obj/item/weapon/coilgun_assembly/proc/increment_construction_stage() + if(construction_stage < 9) + construction_stage++ + icon_state = "coilgun_construction_[construction_stage]" + +/obj/item/weapon/coilgun_assembly/examine(var/mob/user) + . = ..(user,2) + if(.) + switch(construction_stage) + if(2) to_chat(user, "It has a metal frame loosely shaped around the stock.") + if(3) to_chat(user, "It has a metal frame duct-taped to the stock.") + if(4) to_chat(user, "It has a length of pipe attached to the body.") + if(4) to_chat(user, "It has a length of pipe welded to the body.") + if(6) to_chat(user, "It has a cable mount and capacitor jack wired to the frame.") + if(7) to_chat(user, "It has a single superconducting coil threaded onto the barrel.") + if(8) to_chat(user, "It has a pair of superconducting coils threaded onto the barrel.") + if(9) to_chat(user, "It has three superconducting coils attached to the body, waiting to be secured.") diff --git a/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm b/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm new file mode 100644 index 0000000000..d731512bfa --- /dev/null +++ b/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm @@ -0,0 +1,104 @@ +/obj/item/weapon/gun/magnetic/railgun + name = "railgun" + desc = "The Mars Military Industries MI-76 Thunderclap. A man-portable mass driver for squad support anti-armour and destruction of fortifications and emplacements." + gun_unreliable = 0 + icon_state = "railgun" + removable_components = FALSE + load_type = /obj/item/weapon/rcd_ammo + origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 4, TECH_MAGNET = 4) + projectile_type = /obj/item/projectile/bullet/magnetic/slug + power_cost = 300 + w_class = ITEMSIZE_HUGE + slot_flags = SLOT_BELT + loaded = /obj/item/weapon/rcd_ammo/large + + var/initial_cell_type = /obj/item/weapon/cell/hyper + var/initial_capacitor_type = /obj/item/weapon/stock_parts/capacitor/adv + var/slowdown_held = 2 + var/slowdown_worn = 1 + +/obj/item/weapon/gun/magnetic/railgun/New() + capacitor = new initial_capacitor_type(src) + capacitor.charge = capacitor.max_charge + + cell = new initial_cell_type(src) + if (ispath(loaded)) + loaded = new loaded + . = ..() + +// Not going to check type repeatedly, if you code or varedit +// load_type and get runtime errors, don't come crying to me. +/obj/item/weapon/gun/magnetic/railgun/show_ammo(var/mob/user) + var/obj/item/weapon/rcd_ammo/ammo = loaded + if (ammo) + to_chat(user, "There are [ammo.remaining] shot\s remaining in \the [loaded].") + else + to_chat(user, "There is nothing loaded.") + +/obj/item/weapon/gun/magnetic/railgun/check_ammo() + var/obj/item/weapon/rcd_ammo/ammo = loaded + return ammo && ammo.remaining + +/obj/item/weapon/gun/magnetic/railgun/use_ammo() + var/obj/item/weapon/rcd_ammo/ammo = loaded + ammo.remaining-- + if(ammo.remaining <= 0) + spawn(3) + playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 1) + out_of_ammo() + +/obj/item/weapon/gun/magnetic/railgun/proc/out_of_ammo() + qdel(loaded) + loaded = null + visible_message("\The [src] beeps and ejects its empty cartridge.") + +/obj/item/weapon/gun/magnetic/railgun/automatic // Adminspawn only, this shit is absurd. + name = "\improper RHR accelerator" + desc = "The Mars Military Industries MI-227 Meteor. Originally a vehicle-mounted turret weapon for heavy anti-vehicular and anti-structural fire, the fact that it was made man-portable is mindboggling in itself." + icon_state = "heavy_railgun" + + initial_cell_type = /obj/item/weapon/cell/infinite + initial_capacitor_type = /obj/item/weapon/stock_parts/capacitor/super + + slowdown_held = 3 + slowdown_worn = 2 + + slot_flags = SLOT_BACK + w_class = ITEMSIZE_NO_CONTAINER + + firemodes = list( + list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, one_hand_penalty=1, burst_accuracy=null, dispersion=null), + list(mode_name="short bursts", burst=3, fire_delay=null, move_delay=5, one_hand_penalty=2, burst_accuracy=list(0,-1,-1), dispersion=list(0.0, 0.6, 1.0)), + list(mode_name="long bursts", burst=6, fire_delay=null, move_delay=10, one_hand_penalty=2, burst_accuracy=list(0,-1,-1,-1,-2), dispersion=list(0.6, 0.6, 1.0, 1.0, 1.2)), + ) + +/obj/item/weapon/gun/magnetic/railgun/automatic/examine(var/mob/user) + . = ..(user,1) + if(.) + to_chat(user, "Someone has scratched Ultima Ratio Regum onto the side of the barrel.") + +/obj/item/weapon/gun/magnetic/railgun/flechette + name = "flechette gun" + desc = "The MI-12 Skadi is a burst fire capable railgun that fires flechette rounds at high velocity. Deadly against armour, but much less effective against soft targets." + icon_state = "flechette_gun" + item_state = "z8carbine" + initial_cell_type = /obj/item/weapon/cell/hyper + initial_capacitor_type = /obj/item/weapon/stock_parts/capacitor/adv + slot_flags = SLOT_BACK + slowdown_held = 0 + slowdown_worn = 0 + power_cost = 100 + load_type = /obj/item/weapon/magnetic_ammo + projectile_type = /obj/item/projectile/bullet/magnetic/flechette + loaded = /obj/item/weapon/magnetic_ammo + fire_sound = 'sound/weapons/rapidslice.ogg' + + firemodes = list( + list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, one_hand_penalty=1, burst_accuracy=null, dispersion=null), + list(mode_name="short bursts", burst=3, fire_delay=null, move_delay=5, one_hand_penalty=2, burst_accuracy=list(0,-1,-1), dispersion=list(0.0, 0.6, 1.0)), + ) + +/obj/item/weapon/gun/magnetic/railgun/flechette/out_of_ammo() + audible_message("\The [src] beeps to indicate the magazine is empty.") + playsound(loc, 'sound/weapons/smg_empty_alarm.ogg', 40, 1) + ..() diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index c4344c052b..76c4249092 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -45,6 +45,8 @@ var/penetrating = 0 //If greater than zero, the projectile will pass through dense objects as specified by on_penetrate() var/kill_count = 50 //This will de-increment every process(). When 0, it will delete the projectile. //Effects + var/incendiary = 0 //1 for ignite on hit, 2 for trail of fire. 3 maybe later for burst of fire around the impact point. - Mech + var/flammability = 0 //Amount of fire stacks to add for the above. var/stun = 0 var/weaken = 0 var/paralyze = 0 @@ -78,7 +80,7 @@ if(!isliving(target)) return 0 // if(isanimal(target)) return 0 var/mob/living/L = target - L.apply_effects(stun, weaken, paralyze, irradiate, stutter, eyeblur, drowsy, agony, blocked) // add in AGONY! + L.apply_effects(stun, weaken, paralyze, irradiate, stutter, eyeblur, drowsy, agony, blocked, incendiary, flammability) // add in AGONY! return 1 //called when the projectile stops flying because it collided with something @@ -322,6 +324,10 @@ else if(!bumped) tracer_effect(effect_transform) + if(incendiary >= 2) + var/trail_volume = (flammability * 0.10) + new /obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(src.loc, trail_volume, src.dir) + if(!hitscan) sleep(step_delay) //add delay between movement iterations if it's not a hitscan weapon diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index a6237a604a..5b95ee6639 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -252,6 +252,31 @@ explosion(target, -1, 0, 2) ..() +/* Incendiary */ + +/obj/item/projectile/bullet/incendiary + name = "incendiary bullet" + icon_state = "bullet_alt" + damage = 15 + damage_type = BURN + incendiary = 1 + flammability = 2 + +/obj/item/projectile/bullet/incendiary/flamethrower + name = "ball of fire" + desc = "Don't stand in the fire." + icon_state = "fireball" + damage = 10 + embed_chance = 0 + incendiary = 2 + flammability = 4 + agony = 30 + kill_count = 4 + +/obj/item/projectile/bullet/incendiary/flamethrower/large + damage = 15 + kill_count = 6 + /obj/item/projectile/bullet/blank invisibility = 101 damage = 1 diff --git a/code/modules/projectiles/projectile/magnetic.dm b/code/modules/projectiles/projectile/magnetic.dm new file mode 100644 index 0000000000..35f98833ef --- /dev/null +++ b/code/modules/projectiles/projectile/magnetic.dm @@ -0,0 +1,21 @@ +// Rod for railguns. Slightly less nasty than the sniper round. +/obj/item/projectile/bullet/magnetic + name = "rod" + icon_state = "rod" + damage = 65 + stun = 1 + weaken = 1 + penetrating = 5 + armor_penetration = 70 + +/obj/item/projectile/bullet/magnetic/slug + name = "slug" + icon_state = "gauss_silenced" + damage = 75 + armor_penetration = 90 + +/obj/item/projectile/bullet/magnetic/flechette + name = "flechette" + icon_state = "flechette" + damage = 20 + armor_penetration = 100 \ No newline at end of file diff --git a/code/modules/research/mechfab_designs.dm b/code/modules/research/mechfab_designs.dm index 7ebdc5fbb6..4d7149c188 100644 --- a/code/modules/research/mechfab_designs.dm +++ b/code/modules/research/mechfab_designs.dm @@ -354,6 +354,30 @@ materials = list(DEFAULT_WALL_MATERIAL = 15000, "gold" = 4500, "uranium" = 4500) build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited +/datum/design/item/mecha/weapon/flamer + name = "CR-3 Mark 8 Flamethrower" + desc = "A weapon that violates the CCWC at two hundred gallons per minute." + id = "mech_flamer_full" + req_tech = list(TECH_MATERIAL = 4, TECH_COMBAT = 6, TECH_PHORON = 4, TECH_ILLEGAL = 4) + materials = list(DEFAULT_WALL_MATERIAL = 10000, "gold" = 2000, "uranium" = 3000, "phoron" = 8000) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/flamer + +/datum/design/item/mecha/weapon/flamer_rigged + name = "AA-CR-1 Mark 4 Flamethrower" + desc = "A weapon that accidentally violates the CCWC at one hundred gallons per minute." + id = "mech_flamer_rigged" + req_tech = list(TECH_MATERIAL = 3, TECH_COMBAT = 3, TECH_PHORON = 3, TECH_ILLEGAL = 2) + materials = list(DEFAULT_WALL_MATERIAL = 8000, "gold" = 1500, "silver" = 1500, "uranium" = 2000, "phoron" = 6000) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/flamer/rigged + +/datum/design/item/mecha/weapon/flame_mg + name = "DR-AC 3 Incendiary Rotary MG" + desc = "A weapon that violates the CCWC at sixty rounds a minute." + id = "mech_lmg_flamer" + req_tech = list(TECH_MATERIAL = 4, TECH_COMBAT = 5, TECH_PHORON = 2, TECH_ILLEGAL = 1) + materials = list(DEFAULT_WALL_MATERIAL = 8000, "gold" = 2000, "silver" = 1750, "uranium" = 1500, "phoron" = 4000) + build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/incendiary + // *** Nonweapon modules /datum/design/item/mecha/wormhole_gen name = "Wormhole generator" diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index 0da9634b39..5e096fcd8f 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -40,7 +40,7 @@ else shuttle_status = "Standing-by at offsite location." if(WAIT_LAUNCH, FORCE_LAUNCH) - shuttle_status = "Shuttle has recieved command and will depart shortly." + shuttle_status = "Shuttle has received command and will depart shortly." if(WAIT_ARRIVE) shuttle_status = "Proceeding to destination." if(WAIT_FINISH) diff --git a/icons/mecha/mecha_equipment.dmi b/icons/mecha/mecha_equipment.dmi index 5f1898b857..930e724d22 100644 Binary files a/icons/mecha/mecha_equipment.dmi and b/icons/mecha/mecha_equipment.dmi differ diff --git a/icons/mob/items/lefthand_guns.dmi b/icons/mob/items/lefthand_guns.dmi index 7b2b705c94..180f51236a 100644 Binary files a/icons/mob/items/lefthand_guns.dmi and b/icons/mob/items/lefthand_guns.dmi differ diff --git a/icons/mob/items/lefthand_melee.dmi b/icons/mob/items/lefthand_melee.dmi index 41f7617c3f..0f08605207 100644 Binary files a/icons/mob/items/lefthand_melee.dmi and b/icons/mob/items/lefthand_melee.dmi differ diff --git a/icons/mob/items/righthand_guns.dmi b/icons/mob/items/righthand_guns.dmi index 7c05fbd61d..4fcc8b6b8d 100644 Binary files a/icons/mob/items/righthand_guns.dmi and b/icons/mob/items/righthand_guns.dmi differ diff --git a/icons/mob/items/righthand_melee.dmi b/icons/mob/items/righthand_melee.dmi index fb7baddc29..c1313715a6 100644 Binary files a/icons/mob/items/righthand_melee.dmi and b/icons/mob/items/righthand_melee.dmi differ diff --git a/icons/obj/coilgun.dmi b/icons/obj/coilgun.dmi new file mode 100644 index 0000000000..238bbd9a3d Binary files /dev/null and b/icons/obj/coilgun.dmi differ diff --git a/icons/obj/railgun.dmi b/icons/obj/railgun.dmi new file mode 100644 index 0000000000..0b00e7a156 Binary files /dev/null and b/icons/obj/railgun.dmi differ diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index 6807e3fbc9..9b434f628d 100644 Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ diff --git a/polaris.dme b/polaris.dme index bd694329a4..37cef8a239 100644 --- a/polaris.dme +++ b/polaris.dme @@ -1986,6 +1986,7 @@ #include "code\modules\projectiles\gun.dm" #include "code\modules\projectiles\projectile.dm" #include "code\modules\projectiles\ammunition\magazines.dm" +#include "code\modules\projectiles\ammunition\magnetic.dm" #include "code\modules\projectiles\ammunition\rounds.dm" #include "code\modules\projectiles\guns\energy.dm" #include "code\modules\projectiles\guns\launcher.dm" @@ -2002,6 +2003,9 @@ #include "code\modules\projectiles\guns\launcher\pneumatic.dm" #include "code\modules\projectiles\guns\launcher\rocket.dm" #include "code\modules\projectiles\guns\launcher\syringe_gun.dm" +#include "code\modules\projectiles\guns\magnetic\magnetic.dm" +#include "code\modules\projectiles\guns\magnetic\magnetic_construction.dm" +#include "code\modules\projectiles\guns\magnetic\magnetic_railgun.dm" #include "code\modules\projectiles\guns\projectile\automatic.dm" #include "code\modules\projectiles\guns\projectile\boltaction.dm" #include "code\modules\projectiles\guns\projectile\contender.dm" @@ -2018,6 +2022,7 @@ #include "code\modules\projectiles\projectile\change.dm" #include "code\modules\projectiles\projectile\energy.dm" #include "code\modules\projectiles\projectile\force.dm" +#include "code\modules\projectiles\projectile\magnetic.dm" #include "code\modules\projectiles\projectile\special.dm" #include "code\modules\projectiles\targeting\targeting_client.dm" #include "code\modules\projectiles\targeting\targeting_gun.dm" diff --git a/sound/weapons/railgun.ogg b/sound/weapons/railgun.ogg new file mode 100644 index 0000000000..0b939fd9a6 Binary files /dev/null and b/sound/weapons/railgun.ogg differ