Your station has been selected to carry out the Gateway Project.
The equipment will be shipped to you at the start of the next quarter. You are to prepare a secure location to house the equipment as outlined in the attached documents.
Log 2: Really dumb of me but I just waved at an engineer in the outpost, and he waved back. I hope to god he was too dumb or drunk to recognize the suit, because if he isn't then we might have to pull out before they come looking for us.
Hello there, proud operator of an NT-Sec Prisoner Rehabilitation Center. A solution to rising crime rates and falling productivity, these facilities are specifically designed for the safe, productive imprisonment of your most dangerous criminals.
To press a long-term prisoner into the service of the station, replace his equipment with prisoners' garb at one of the prison lockers, as per normal operating procedure. Before assigning a prisoner his ID, insert the ID into a prisoner management console and assign the prisoner a quota, based on the severity of his crime. A single sheet of most materials produces five points for the prisoner, and points can be expected to be produced at a rate of about 100 per minute, though punishments as severe as forced labor should be reserved for serious crimes of sentences not less than five minutes long. Once you have prepared the prisoner, place him in the secure northern half of the labor shuttle, and send him to the station. Once he meets his quota by feeding sheets to the stacker, he will be allowed to return to the station, and will be able to open the secure door to the prisoner release area.
Your station has been selected to carry out the Gateway Project.
The equipment will be shipped to you at the start of the next quarter. You are to prepare a secure location to house the equipment as outlined in the attached documents.
Hello there, proud operator of an NT-Sec Prisoner Rehabilitation Center. A solution to rising crime rates and falling productivity, these facilities are specifically designed for the safe, productive imprisonment of your most dangerous criminals.
To press a long-term prisoner into the service of the station, replace his equipment with prisoners' garb at one of the prison lockers, as per normal operating procedure. Before assigning a prisoner his ID, insert the ID into a prisoner management console and assign the prisoner a quota, based on the severity of his crime. A single sheet of most materials produces five points for the prisoner, and points can be expected to be produced at a rate of about 100 per minute, though punishments as severe as forced labor should be reserved for serious crimes of sentences not less than five minutes long. Once you have prepared the prisoner, place him in the secure northern half of the labor shuttle, and send him to the station. Once he meets his quota by feeding sheets to the stacker, he will be allowed to return to the station, and will be able to open the secure door to the prisoner release area.
Your station has been selected to carry out the Gateway Project.
The equipment will be shipped to you at the start of the next quarter. You are to prepare a secure location to house the equipment as outlined in the attached documents.
"
- else
- dat += " Experiment "
-
- if(!occupant)
- dat += "
Machine Unoccupied
"
- else
- dat += "
Subject Status :
"
- dat += "[occupant.name] => "
- switch(occupant.stat)
- if(0)
- dat += "Conscious"
- if(1)
- dat += "Unconscious"
- else
- dat += "DEAD"
- dat += " "
- dat += "[flash]"
- dat += " "
- dat += "Scan"
- dat += "Close" : "open=1'>Open"]"
- var/datum/browser/popup = new(user, "experiment", "Probing Console", 300, 300)
- popup.set_title_image(user.browse_rsc_icon(icon, icon_state))
- popup.set_content(dat)
- popup.open()
-
-/obj/machinery/abductor/experiment/Topic(href, href_list)
- if(..() || usr == occupant)
- return
- usr.set_machine(src)
- if(href_list["refresh"])
- updateUsrDialog()
- return
- if(href_list["open"])
- open_machine()
- return
- if(href_list["close"])
- close_machine()
- return
- if(occupant && occupant.stat != DEAD)
- if(href_list["experiment"])
- flash = Experiment(occupant,href_list["experiment"])
- updateUsrDialog()
- add_fingerprint(usr)
-
-/obj/machinery/abductor/experiment/proc/Experiment(var/mob/occupant,var/type)
- var/mob/living/carbon/human/H = occupant
- var/point_reward = 0
- if(H in history)
- return "Specimen already in the database"
- if(H.stat == DEAD)
- say("Specimen deceased - please provide fresh sample.")
- return "Specimen Deceased"
- var/obj/item/gland/GlandTest = locate() in H
- if(!GlandTest)
- say("Experimental dissection not detected!")
- return "No glands detected!"
- if(H.mind != null || H.ckey != null)
- history += H
- say("Processing Specimen...")
- sleep(5)
- switch(text2num(type))
- if(1)
- H << "You feel violated."
- if(2)
- H << "You feel being sliced and put back together."
- if(3)
- H << "You feel under intense scrutiny."
- sleep(5)
- H << "Your mind snaps!"
- var/objtype = pick(typesof(/datum/objective/abductee/) - /datum/objective/abductee/)
- var/datum/objective/abductee/O = new objtype()
- H.mind.objectives += O
- var/obj_count = 1
- H << "Your current objectives:"
- for(var/datum/objective/objective in H.mind.objectives)
- H << "Objective #[obj_count]: [objective.explanation_text]"
- obj_count++
-
- for(var/obj/item/gland/G in H)
- G.Start()
- point_reward++
- if(point_reward > 0)
- open_machine()
- SendBack(H)
- playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
- points += point_reward
- return "Experiment Successfull! [point_reward] new data-points collected."
- else
- playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 1)
- return "Experiment Failed! No replacement organ detected."
- else
- say("Brain Activity Nonexistant - Disposing Sample...")
- open_machine()
- SendBack(H)
- return "Specimen Braindead - Disposed"
- return "ERROR"
-
-
-/obj/machinery/abductor/experiment/proc/SendBack(var/mob/living/carbon/human/H)
- H.Sleeping(8)
- var/area/A
- if(console && console.pad && console.pad.teleport_target)
- A = console.pad.teleport_target
- else
- A = teleportlocs[pick(teleportlocs)]
- TeleportToArea(H,A)
-
-/obj/machinery/abductor/experiment/update_icon()
- if(state_open)
- icon_state = "experiment-open"
- else
- icon_state = "experiment"
-
-/obj/machinery/abductor/experiment/say_quote(text)
- return "beeps, \"[text]\""
-
-
-/obj/machinery/abductor/gland_dispenser
- name = "Replacement Organ Storage"
- desc = "A tank filled with replacement organs"
- icon = 'icons/obj/abductor.dmi'
- icon_state = "dispenser"
- density = 1
- anchored = 1
- var/list/gland_types
- var/list/gland_colors
- var/list/amounts
-
-/obj/machinery/abductor/gland_dispenser/proc/random_color()
- //TODO : replace with presets or spectrum
- return rgb(rand(0,255),rand(0,255),rand(0,255))
-
-/obj/machinery/abductor/gland_dispenser/New()
- gland_types = typesof(/obj/item/gland) - /obj/item/gland
- gland_types = shuffle(gland_types)
- gland_colors = new/list(gland_types.len)
- amounts = new/list(gland_types.len)
- for(var/i=1,i<=gland_types.len,i++)
- gland_colors[i] = random_color()
- amounts[i] = rand(1,5)
-
-/obj/machinery/abductor/gland_dispenser/attack_hand(var/mob/user as mob)
- if(..())
- return
- if(!IsAbductor(user))
- return
- user.set_machine(src)
- var/box_css = {"
- "}
- var/dat = ""
- var/item_count = 0
- for(var/i=1,i<=gland_colors.len,i++)
- item_count++
- var/g_color = gland_colors[i]
- var/amount = amounts[i]
- dat += "[amount]"
- if(item_count == 3) // Three boxes per line
- dat +=""
- item_count = 0
- var/datum/browser/popup = new(user, "glands", "Gland Dispenser", 200, 200)
- popup.add_head_content(box_css)
- popup.set_content(dat)
- popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
- popup.open()
- return
-
-/obj/machinery/abductor/gland_dispenser/attackby(obj/item/weapon/W, mob/user, params)
- if(istype(W, /obj/item/gland))
- user.drop_item()
- W.loc = src
- for(var/i=1,i<=gland_colors.len,i++)
- if(gland_types[i] == W.type)
- amounts[i]++
-
-/obj/machinery/abductor/gland_dispenser/Topic(href, href_list)
- if(..())
- return
- if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
- usr.set_machine(src)
- if(href_list["dispense"])
- Dispense(text2num(href_list["dispense"]))
- src.updateUsrDialog()
-
-/obj/machinery/abductor/gland_dispenser/proc/Dispense(var/count)
- if(amounts[count]>0)
- amounts[count]--
- var/T = gland_types[count]
- new T(get_turf(src))
\ No newline at end of file
diff --git a/code/game/gamemodes/abduction/abduction_surgery.dm b/code/game/gamemodes/abduction/abduction_surgery.dm
deleted file mode 100644
index 6230889706284..0000000000000
--- a/code/game/gamemodes/abduction/abduction_surgery.dm
+++ /dev/null
@@ -1,46 +0,0 @@
-/datum/surgery/organ_extraction
- name = "experimental dissection"
- steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin,/datum/surgery_step/incise, /datum/surgery_step/extract_organ ,/datum/surgery_step/gland_insert)
- species = list(/mob/living/carbon/human)
- location = "chest"
- user_species_restricted = 1
- user_species_ids = list("abductor")
-
-/datum/surgery_step/extract_organ
- accept_hand = 1
- time = 32
- var/obj/item/IC = null
- var/list/organ_types = list(/obj/item/organ/heart)
-
-/datum/surgery_step/extract_organ/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- for(var/obj/item/I in target.internal_organs)
- if(I.type in organ_types)
- IC = I
- break
- user.visible_message("[user] starts to remove [target]'s organs.")
-
-/datum/surgery_step/extract_organ/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- if(IC)
- user.visible_message("[user] pulls [IC] out of [target]'s [target_zone]!")
- user.put_in_hands(IC)
- target.internal_organs -= IC
- return 1
- else
- user.visible_message("[user] doesn't find anything in [target]'s [target_zone].")
- return 0
-
-/datum/surgery_step/gland_insert
- implements = list(/obj/item/gland = 100)
- time = 32
-
-/datum/surgery_step/gland_insert/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] starts to insert [tool] into [target].")
-
-/datum/surgery_step/gland_insert/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] inserts [tool] into [target].")
- user.drop_item()
- var/obj/item/gland/gland = tool
- gland.Inject(target)
- return 1
-
-
diff --git a/code/game/gamemodes/abduction/gland.dm b/code/game/gamemodes/abduction/gland.dm
deleted file mode 100644
index 4a0110ac30b57..0000000000000
--- a/code/game/gamemodes/abduction/gland.dm
+++ /dev/null
@@ -1,172 +0,0 @@
-/obj/item/gland/
- name = "Fleshy mass"
- desc = "Eww"
- icon = 'icons/obj/abductor.dmi'
- icon_state = "gland"
- var/cooldown_low = 30
- var/cooldown_high = 30
- var/cooldown_current = 0
- var/cooldown = 0
- var/uses // -1 For inifinite
- var/active = 0
- var/mob/living/carbon/human/host
-
-/obj/item/gland/proc/HostCheck()
- if(ishuman(host) && host == src.loc)
- if(host.stat != DEAD)
- return 1
- return 0
-
-/obj/item/gland/proc/Start()
- active = 1
- SSobj.processing |= src
-
-/obj/item/gland/proc/Inject(var/mob/living/carbon/human/target)
- host = target
- target.internal_organs += src
- src.loc = target
-
-/obj/item/gland/process()
- if(!active)
- SSobj.processing.Remove(src)
- return
- cooldown++
- if(cooldown >= cooldown_current)
- //This gives a chance to transplant the gland active into someone else if you're fast
- if(!HostCheck())
- active = 0
- return
- activate()
- uses--
- cooldown = 0
- cooldown_current = rand(cooldown_low,cooldown_high)
- if(uses == 0)
- active = 0
-
-/obj/item/gland/proc/activate()
- return
-
-/obj/item/gland/heals
- cooldown_low = 20
- cooldown_high = 40
- uses = -1
- icon_state = "health"
-
-obj/item/gland/heals/activate()
- host << "You feel weird."
- host.adjustBruteLoss(-20)
- host.adjustOxyLoss(-20)
- host.adjustFireLoss(-20)
-
-/obj/item/gland/slime
- cooldown_low = 60
- cooldown_high = 120
- uses = -1
- icon_state = "slime"
-
-obj/item/gland/slime/activate()
- host << "You feel weird."
-
- host.visible_message("[host] vomits on the floor!", \
- "You throw up on the floor!")
-
- host.nutrition -= 20
- host.adjustToxLoss(-3)
-
- var/turf/pos = get_turf(host)
- pos.add_vomit_floor(host)
- playsound(pos, 'sound/effects/splat.ogg', 50, 1)
-
- var/mob/living/simple_animal/slime/Slime = new/mob/living/simple_animal/slime(pos)
- Slime.Friends = list(host)
- Slime.Leader = host
-
-/obj/item/gland/mindshock
- cooldown_low = 30
- cooldown_high = 30
- uses = -1
- icon_state = "mindshock"
-
-/obj/item/gland/mindshock/activate()
- host << "You feel weird."
-
- var/turf/T = get_turf(host)
- for(var/mob/living/carbon/human/H in orange(4,T))
- if(H == host)
- continue
- H << " You hear a buzz in your head "
- H.confused += 20
-
-/obj/item/gland/pop
- cooldown_low = 120
- cooldown_high = 180
- uses = 5
- icon_state = "species"
-
-/obj/item/gland/pop/activate()
- host << "You feel weird."
- var/species = pick(list(/datum/species/lizard,/datum/species/slime,/datum/species/plant/pod,/datum/species/fly))
- host.dna.species = new species()
- host.regenerate_icons()
- return
-
-/obj/item/gland/ventcrawling
- cooldown_low = 180
- cooldown_high = 240
- uses = 1
- icon_state = "vent"
-
-/obj/item/gland/ventcrawling/activate()
- host << "You feel weird."
- host << "You feel very stretchy."
- host.ventcrawler = 2
- return
-
-
-/obj/item/gland/viral
- cooldown_low = 180
- cooldown_high = 240
- uses = 1
- icon_state = "viral"
-
-/obj/item/gland/viral/activate()
- var/virus_type = pick(/datum/disease/beesease, /datum/disease/brainrot, /datum/disease/magnitis)
- var/datum/disease/D = new virus_type()
- D.carrier = 1
- host.viruses += D
- D.affected_mob = host
- D.holder = host
- host.med_hud_set_status()
-
-
-/obj/item/gland/emp //TODO : Replace with something more interesting
- cooldown_low = 90
- cooldown_high = 160
- uses = 5
- icon_state = "emp"
-
-/obj/item/gland/emp/activate()
- empulse(get_turf(host), 2, 5, 1)
-
-
-/obj/item/gland/spiderman
- cooldown_low = 90
- cooldown_high = 160
- uses = 10
- icon_state = "spider"
-
-/obj/item/gland/spiderman/activate()
- if(uses == initial(uses))
- host.faction += "spiders"
- new /obj/effect/spider/spiderling(host.loc)
-
-/obj/item/gland/egg
- cooldown_low = 60
- cooldown_high = 90
- uses = -1
- icon_state = "egg"
-
-/obj/item/gland/egg/activate()
- var/obj/item/weapon/reagent_containers/food/snacks/egg/egg = new(host.loc)
- egg.reagents.add_reagent("sacid",20)
- egg.desc += " It smells bad."
\ No newline at end of file
diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm
index 549243bf86c50..f2a2ca65f297a 100644
--- a/code/game/gamemodes/antag_spawner.dm
+++ b/code/game/gamemodes/antag_spawner.dm
@@ -64,28 +64,28 @@
H << "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later."
/obj/item/weapon/antag_spawner/contract/spawn_antag(var/client/C, var/turf/T, var/type = "")
- PoolOrNew(/obj/effect/effect/harmless_smoke, T)
+ new /obj/effect/effect/harmless_smoke(T)
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
C.prefs.copy_to(M)
M.key = C.key
M << "You are the [usr.real_name]'s apprentice! You are bound by magic contract to follow their orders and help them in accomplishing their goals."
switch(type)
if("destruction")
- M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(null))
- M.mind.AddSpell(new /obj/effect/proc_holder/spell/dumbfire/fireball(null))
+ M.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(null)
+ M.mind.spell_list += new /obj/effect/proc_holder/spell/dumbfire/fireball(null)
M << "Your service has not gone unrewarded, however. Studying under [usr.real_name], you have learned powerful, destructive spells. You are able to cast magic missile and fireball."
if("bluespace")
- M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null))
- M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null))
+ M.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null)
+ M.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null)
M << "Your service has not gone unrewarded, however. Studying under [usr.real_name], you have learned reality bending mobility spells. You are able to cast teleport and ethereal jaunt."
if("healing")
- M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/charge(null))
- M.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall(null))
+ M.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/charge(null)
+ M.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall(null)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/magic/staff/healing(M), slot_r_hand)
M << "Your service has not gone unrewarded, however. Studying under [usr.real_name], you have learned livesaving survival spells. You are able to cast charge and forcewall."
if("robeless")
- M.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
- M.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mind_transfer(null))
+ M.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/knock(null)
+ M.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/mind_transfer(null)
M << "Your service has not gone unrewarded, however. Studying under [usr.real_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap."
equip_antag(M)
diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm
index 207805d235b68..b80436075f49d 100644
--- a/code/game/gamemodes/blob/blob.dm
+++ b/code/game/gamemodes/blob/blob.dm
@@ -11,7 +11,7 @@ var/list/blob_nodes = list()
config_tag = "blob"
antag_flag = BE_BLOB
- required_players = 30
+ required_players = 20
required_enemies = 1
recommended_enemies = 1
diff --git a/code/game/gamemodes/blob/blob_finish.dm b/code/game/gamemodes/blob/blob_finish.dm
index aec576277781c..32073430a46f8 100644
--- a/code/game/gamemodes/blob/blob_finish.dm
+++ b/code/game/gamemodes/blob/blob_finish.dm
@@ -1,6 +1,4 @@
/datum/game_mode/blob/check_finished()
- if(replacementmode && round_converted == 2)
- return replacementmode.check_finished()
if(round_converted)
return ..()
if(infected_crew.len > burst)//Some blobs have yet to burst
@@ -8,18 +6,15 @@
if(blobwincount <= blobs.len)//Blob took over
return 1
if(!blob_cores.len) // blob is dead
- if(config.continuous["blob"])
- SSshuttle.emergencyNoEscape = 0
+ if(config.continuous_round_blob)
+ round_converted = convert_roundtype()
+ if(!round_converted)
+ return 1
if(SSshuttle.emergency.mode == SHUTTLE_STRANDED)
SSshuttle.emergency.mode = SHUTTLE_DOCKED
SSshuttle.emergency.timer = world.time
priority_announce("Hostile enviroment resolved. You have 3 minutes to board the Emergency Shuttle.", null, 'sound/AI/shuttledock.ogg', "Priority")
-
- if(config.midround_antag["blob"])
- round_converted = convert_roundtype()
- if(!round_converted)
- return 1
- return ..()
+ return 0
return 1
if(station_was_nuked)//Nuke went off
return 1
diff --git a/code/game/gamemodes/blob/blob_report.dm b/code/game/gamemodes/blob/blob_report.dm
index d08526eda5d03..736fa2e7df9c0 100644
--- a/code/game/gamemodes/blob/blob_report.dm
+++ b/code/game/gamemodes/blob/blob_report.dm
@@ -54,11 +54,12 @@
var/door = 0
var/grille = 0
var/mach = 0
- var/num_territories = 1//Number of total valid territories for gang mode
-/datum/station_state/proc/count(var/count_territories)
- for(var/turf/T in block(locate(1,1,1), locate(world.maxx,world.maxy,1)))
+/datum/station_state/proc/count()
+ for(var/turf/T in world)
+ if(T.z != ZLEVEL_STATION)
+ continue
if(istype(T,/turf/simulated/floor))
if(!(T:burnt))
@@ -78,27 +79,20 @@
else
src.r_wall += 1
+ for(var/obj/O in world)
+ if(O.z != ZLEVEL_STATION)
+ continue
+
+ if(istype(O, /obj/structure/window))
+ src.window += 1
+ else if(istype(O, /obj/structure/grille) && (!O:destroyed))
+ src.grille += 1
+ else if(istype(O, /obj/machinery/door))
+ src.door += 1
+ else if(istype(O, /obj/machinery))
+ src.mach += 1
+ return
- for(var/obj/O in T.contents)
- if(istype(O, /obj/structure/window))
- src.window += 1
- else if(istype(O, /obj/structure/grille) && (!O:destroyed))
- src.grille += 1
- else if(istype(O, /obj/machinery/door))
- src.door += 1
- else if(istype(O, /obj/machinery))
- src.mach += 1
-
- if(count_territories)
- var/list/valid_territories = list()
- for(var/area/A in world) //First, collect all area types on the station zlevel
- if(A.z == ZLEVEL_STATION)
- if(!(A.type in valid_territories) && A.valid_territory)
- valid_territories |= A.type
- if(valid_territories.len)
- num_territories = valid_territories.len //Add them all up to make the total number of area types
- else
- world << "ERROR: NO VALID TERRITORIES"
/datum/station_state/proc/score(var/datum/station_state/result)
if(!result) return 0
diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index 04508a5e2d04b..8950e4c2f3365 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -8,7 +8,14 @@
icon = 'icons/mob/blob.dmi'
pass_flags = PASSBLOB
faction = list("blob")
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ min_oxy = 0
+ max_oxy = 0
+ min_tox = 0
+ max_tox = 0
+ min_co2 = 0
+ max_co2 = 0
+ min_n2 = 0
+ max_n2 = 0
minbodytemp = 0
maxbodytemp = 360
var/mob/camera/blob/overmind = null
@@ -35,7 +42,6 @@
melee_damage_upper = 4
attacktext = "hits"
attack_sound = 'sound/weapons/genhit1.ogg'
- speak_emote = list("pulses")
var/obj/effect/blob/factory/factory = null
var/list/human_overlays = list()
var/is_zombie = 0
@@ -78,18 +84,15 @@
melee_damage_lower = 10
melee_damage_upper = 15
icon = H.icon
- speak_emote = list("groans")
- icon_state = "zombie_s"
+ icon_state = "husk_s"
H.hair_style = null
H.update_hair()
human_overlays = H.overlays
- if(overmind && overmind.blob_reagent_datum)
- adjustcolors(overmind.blob_reagent_datum.color)
+ adjustcolors(overmind.blob_reagent_datum.color)
H.loc = src
loc.visible_message(" The corpse of [H.name] suddenly rises!")
-/mob/living/simple_animal/hostile/blob/blobspore/death(gibbed)
- ..(1)
+/mob/living/simple_animal/hostile/blob/blobspore/Die()
// On death, create a small smoke of harmful gas (s-Acid)
var/datum/effect/effect/system/chem_smoke_spread/S = new
var/turf/location = get_turf(src)
@@ -107,7 +110,6 @@
S.set_up(reagents, 1, 1, location, 15, 1) // only 1-2 smoke cloud
S.start()
- ghostize()
qdel(src)
/mob/living/simple_animal/hostile/blob/blobspore/Destroy()
@@ -142,11 +144,10 @@
icon_dead = "blobbernaut_dead"
health = 240
maxHealth = 240
- melee_damage_lower = 20
- melee_damage_upper = 20
+ melee_damage_lower = 10
+ melee_damage_upper = 10
attacktext = "hits"
attack_sound = 'sound/effects/blobattack.ogg'
- speak_emote = list("gurgles")
minbodytemp = 0
maxbodytemp = 360
force_threshold = 10
@@ -154,9 +155,16 @@
mob_size = MOB_SIZE_LARGE
+/mob/living/simple_animal/hostile/blob/blobbernaut/AttackingTarget()
+ ..()
+ if(isliving(target))
+ if(overmind)
+ overmind.blob_reagent_datum.reaction_mob(target, TOUCH)
+
+
/mob/living/simple_animal/hostile/blob/blobbernaut/blob_act()
return
-/mob/living/simple_animal/hostile/blob/blobbernaut/death(gibbed)
- ..(gibbed)
- flick("blobbernaut_death", src)
+/mob/living/simple_animal/hostile/blob/blobbernaut/Die()
+ ..()
+ flick("blobbernaut_death", src)
\ No newline at end of file
diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm
index b57568953fad3..26fe695a62f10 100644
--- a/code/game/gamemodes/blob/blobs/core.dm
+++ b/code/game/gamemodes/blob/blobs/core.dm
@@ -8,9 +8,8 @@
var/overmind_get_delay = 0 // we don't want to constantly try to find an overmind, do it every 30 seconds
var/resource_delay = 0
var/point_rate = 2
- var/is_offspring = null
-/obj/effect/blob/core/New(loc, var/h = 200, var/client/new_overmind = null, var/new_rate = 2, offspring)
+/obj/effect/blob/core/New(loc, var/h = 200, var/client/new_overmind = null, var/new_rate = 2)
blob_cores += src
SSobj.processing |= src
adjustcolors(color) //so it atleast appears
@@ -18,8 +17,6 @@
create_overmind(new_overmind)
if(overmind)
adjustcolors(overmind.blob_reagent_datum.color)
- if(offspring)
- is_offspring = 1
point_rate = new_rate
..(loc, h)
@@ -37,7 +34,7 @@
/obj/effect/blob/core/Destroy()
blob_cores -= src
if(overmind)
- overmind.blob_core = null
+ qdel(overmind)
SSobj.processing.Remove(src)
..()
@@ -105,9 +102,6 @@
B.blob_core = src
src.overmind = B
color = overmind.blob_reagent_datum.color
- spawn(0)
- if(is_offspring)
- B.verbs -= /mob/camera/blob/verb/split_consciousness
return 1
return 0
diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm
index 2ca962f00df72..2b354f6c8012e 100644
--- a/code/game/gamemodes/blob/overmind.dm
+++ b/code/game/gamemodes/blob/overmind.dm
@@ -36,18 +36,12 @@
updateallghostimages()
..()
-/mob/camera/blob/Life()
- if(!blob_core)
- qdel(src)
- ..()
-
/mob/camera/blob/Destroy()
if (ghostimage)
ghost_darkness_images -= ghostimage
qdel(ghostimage)
ghostimage = null;
updateallghostimages()
- ..()
/mob/camera/blob/Login()
..()
diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm
index 43c17da62117d..94c650a7ee9d8 100644
--- a/code/game/gamemodes/blob/powers.dm
+++ b/code/game/gamemodes/blob/powers.dm
@@ -312,25 +312,39 @@
set name = "Split consciousness (100) (One use)"
set desc = "Expend resources to attempt to produce another sentient overmind"
- if(!blob_nodes || !blob_nodes.len)
- src << "A node is required to birth your offspring..."
- return
- var/obj/effect/blob/node/N = locate(/obj/effect/blob) in blob_nodes
- if(!N)
- src << "A node is required to birth your offspring..."
- return
-
- if(!can_buy(100))
- return
-
- verbs -= /mob/camera/blob/verb/split_consciousness //we've used our split_consciousness
- new /obj/effect/blob/core/ (get_turf(N), 200, null, blob_core.point_rate, "offspring")
- qdel(N)
- if(ticker && ticker.mode.name == "blob")
- var/datum/game_mode/blob/BL = ticker.mode
- BL.blobwincount = initial(BL.blobwincount) * 2
+ var/client/C = null
+ var/list/candidates = get_candidates(BE_BLOB)
+ if(candidates.len)
+ C = pick(candidates)
+
+ if(C)
+ if(!blob_nodes || !blob_nodes.len)
+ src << "A node is required to birth your offspring..."
+ return
+ var/obj/effect/blob/node/N = locate(/obj/effect/blob) in blob_nodes
+ if(!N)
+ src << "A node is required to birth your offspring..."
+ return
+
+ if(!can_buy(100))
+ return
+
+ verbs -= /mob/camera/blob/verb/split_consciousness //we've used our split_consciousness
+ var/obj/effect/blob/core/new_core = new(get_turf(N), 200, C, blob_core.point_rate)
+ qdel(N)
+ var/mob/camera/blob/B = new(get_turf(new_core))
+ B.verbs -= /mob/camera/blob/verb/split_consciousness // this was a bad idea to allow you were right remie
+ B.key = C.key
+ B.blob_core = new_core
+ new_core.overmind = B
+
+ if(ticker && ticker.mode.name == "blob")
+ var/datum/game_mode/blob/BL = ticker.mode
+ BL.blobwincount = initial(BL.blobwincount) * 2
+ else
+ src << "You weren't able to split your consciousness at this time..."
/mob/camera/blob/verb/blob_broadcast()
set category = "Blob"
diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm
index b7dcf10b6f6f3..6a45f0e4765ad 100644
--- a/code/game/gamemodes/blob/theblob.dm
+++ b/code/game/gamemodes/blob/theblob.dm
@@ -42,8 +42,10 @@
/obj/effect/blob/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume)
..()
- var/damage = Clamp(0.01 * exposed_temperature, 0, 4)
- take_damage(damage, BURN)
+ var/damage = Clamp(0.01 * exposed_temperature / fire_resist, 0, 4 - fire_resist)
+ if(damage)
+ health -= damage
+ update_icon()
/obj/effect/blob/proc/Life()
return
@@ -130,12 +132,21 @@
/obj/effect/blob/ex_act(severity, target)
..()
- var/damage = 150 - 20 * severity
- take_damage(damage, BRUTE)
+ var/damage = 150
+ health -= ((damage/brute_resist) - (severity * 5))
+ update_icon()
+ return
+
/obj/effect/blob/bullet_act(var/obj/item/projectile/Proj)
..()
- take_damage(Proj.damage, Proj.damage_type)
+ switch(Proj.damage_type)
+ if(BRUTE)
+ health -= (Proj.damage/brute_resist)
+ if(BURN)
+ health -= (Proj.damage/fire_resist)
+
+ update_icon()
return 0
/obj/effect/blob/Crossed(var/mob/living/L)
@@ -148,9 +159,18 @@
user.do_attack_animation(src)
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
visible_message("[user] has attacked the [src.name] with \the [W]!")
- if(W.damtype == BURN)
- playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
- take_damage(W.force, W.damtype)
+ var/damage = 0
+ switch(W.damtype)
+ if("fire")
+ damage = (W.force / max(src.fire_resist,1))
+ if(istype(W, /obj/item/weapon/weldingtool))
+ playsound(src.loc, 'sound/items/Welder.ogg', 100, 1)
+ if("brute")
+ damage = (W.force / max(src.brute_resist,1))
+
+ health -= damage
+ update_icon()
+ return
/obj/effect/blob/attack_animal(mob/living/simple_animal/M as mob)
M.changeNext_move(CLICK_CD_MELEE)
@@ -158,28 +178,12 @@
playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
visible_message("\The [M] has attacked the [src.name]!")
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
- take_damage(damage, BRUTE)
- return
-
-/obj/effect/blob/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
- M.changeNext_move(CLICK_CD_MELEE)
- M.do_attack_animation(src)
- playsound(src.loc, 'sound/effects/attackblob.ogg', 50, 1)
- visible_message("[M] has slashed the [src.name]!")
- var/damage = rand(15, 30)
- take_damage(damage, BRUTE)
- return
-
-/obj/effect/blob/proc/take_damage(damage, damage_type)
- if(!damage || damage_type == STAMINA) // Avoid divide by zero errors
+ if(!damage) // Avoid divide by zero errors
return
- switch(damage_type)
- if(BRUTE)
- damage /= max(brute_resist, 1)
- if(BURN)
- damage /= max(fire_resist, 1)
+ damage /= max(src.brute_resist, 1)
health -= damage
update_icon()
+ return
/obj/effect/blob/proc/change_to(var/type)
if(!ispath(type))
diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index 17e34ff67e9aa..9e53d64cfc39e 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -154,8 +154,8 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
/datum/game_mode/proc/greet_changeling(var/datum/mind/changeling, var/you_are=1)
if (you_are)
- changeling.current << "You are [changeling.changeling.changelingID], a changeling! You have absorbed and taken the form of a human."
- changeling.current << "Use say \":g message\" to communicate with your fellow changelings."
+ changeling.current << "You are [changeling.changeling.changelingID], a changeling! You have absorbed and taken the form of a human."
+ changeling.current << "Use say \":g message\" to communicate with your fellow changelings."
changeling.current << "You must complete the following tasks:"
if (changeling.current.mind)
@@ -222,7 +222,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
text += " The changeling was successful!"
feedback_add_details("changeling_success","SUCCESS")
else
- text += " The changeling has failed."
+ text += " The changeling has failed."
feedback_add_details("changeling_success","FAIL")
text += " "
diff --git a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm
index e76ed33827c03..e2f88ac9d9f4e 100644
--- a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm
+++ b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm
@@ -4,7 +4,7 @@
/obj/effect/proc_holder/changeling/augmented_eyesight
name = "Augmented Eyesight"
desc = "Creates heat receptors in our eyes and dramatically increases light sensing ability."
- helptext = "Grants us night vision and thermal vision. It may be toggled on or off. We will become more vulnerable to flash-based devices while active."
+ helptext = "Grants us night vision and thermal vision. It may be toggled on or off."
chemical_cost = 0
dna_cost = 2 //Would be 1 without thermal vision
var/active = 0 //Whether or not vision is enhanced
@@ -13,11 +13,9 @@
active = !active
if(active)
user << "We feel a minute twitch in our eyes, and darkness creeps away."
- user.weakeyes = 1
else
user << "Our vision dulls. Shadows gather."
user.sight -= SEE_MOBS
- user.weakeyes = 0
while(active)
user.see_in_dark = 8
user.see_invisible = 2
diff --git a/code/game/gamemodes/changeling/powers/headcrab.dm b/code/game/gamemodes/changeling/powers/headcrab.dm
deleted file mode 100644
index a04b48ce627dd..0000000000000
--- a/code/game/gamemodes/changeling/powers/headcrab.dm
+++ /dev/null
@@ -1,19 +0,0 @@
-/obj/effect/proc_holder/changeling/headcrab
- name = "Last Resort"
- desc = "We sacrifice our current body in a moment of need, stunning and damaging everyone nearby. If a dead body is nearby we infect it to raise again."
- chemical_cost = 20
- dna_cost = 1
- req_human = 1
-
-/obj/effect/proc_holder/changeling/headcrab/sting_action(var/mob/user)
- explosion(get_turf(user),0,0,2,0,silent=1)
- var/turf = get_turf(user)
- spawn(5) // So it's not killed in explosion
- var/mob/living/simple_animal/hostile/headcrab/crab = new(turf)
- crab.origin = user.mind
- if(user.mind)
- user.mind.transfer_to(crab)
- crab << "You burst out of the remains of your former body in a shower of gore!"
- user.gib()
- feedback_add_details("changeling_powers","LR")
- return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm
index eb77d14ef3d6b..0ee377ea6361c 100644
--- a/code/game/gamemodes/changeling/powers/mutations.dm
+++ b/code/game/gamemodes/changeling/powers/mutations.dm
@@ -125,7 +125,7 @@
item_state = "arm_blade"
flags = ABSTRACT | NODROP
w_class = 5.0
- force = 25
+ force = 24
throwforce = 0 //Just to be on the safe side
throw_range = 0
throw_speed = 0
diff --git a/code/game/gamemodes/changeling/traitor_chan.dm b/code/game/gamemodes/changeling/traitor_chan.dm
index 292cbe9d52a8c..37535659afb34 100644
--- a/code/game/gamemodes/changeling/traitor_chan.dm
+++ b/code/game/gamemodes/changeling/traitor_chan.dm
@@ -6,7 +6,6 @@
required_players = 0
required_enemies = 1 // how many of each type are required
recommended_enemies = 3
- reroll_friendly = 1
var/list/possible_changelings = list()
var/const/changeling_amount = 1 //hard limit on changelings if scaling is turned off
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index 3e31c0f573b87..b6cf1f1c75c0b 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -26,11 +26,9 @@
antag_flag = BE_CULTIST
restricted_jobs = list("Chaplain","AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel")
protected_jobs = list()
- required_players = 20
- required_enemies = 6
- recommended_enemies = 6
- enemy_minimum_age = 14
-
+ required_players = 10
+ required_enemies = 2
+ recommended_enemies = 4
var/finished = 0
@@ -39,7 +37,7 @@
var/eldergod = 1 //for the summon god objective
- var/acolytes_needed = 10 //for the survive objective
+ var/acolytes_needed = 7 //for the survive objective
var/acolytes_survived = 0
@@ -56,7 +54,17 @@
cult_objectives += "eldergod"
cult_objectives += "sacrifice"
+ //adjust game mode for player numbers
+ if(num_players() < 20)
+ set_runecults(setELDERGOD_CULTS=6, setCONVERT_CULTS=2, setSACRIFICE_CULTS=2)
+
+ if(num_players() >= 20)
+ required_enemies = 4
+ recommended_enemies = 6
+ acolytes_needed = 10
+
if(num_players() >= 30)
+ required_enemies = 6
recommended_enemies = 9 // 3+3+3 - d' magic number o' magic numbars mon
acolytes_needed = 15
@@ -123,7 +131,7 @@
else
explanation = "Free objective."
if("eldergod")
- explanation = "Summon Nar-Sie via the use of the appropriate rune (Hell join self). It will only work if nine cultists stand on and around it."
+ explanation = "Summon Nar-Sie via the use of the appropriate rune (Hell join self). It will only work if [ELDERGOD_CULTS] cultists stand on and around it."
cult_mind.current << "Objective #[obj_count]: [explanation]"
cult_mind.memory += "Objective #[obj_count]: [explanation] "
cult_mind.current << "The Geometer of Blood grants you the knowledge to sacrifice non-believers. (Hell Blood Join)"
@@ -216,7 +224,6 @@
if (!istype(cult_mind))
return 0
if(!(cult_mind in cult) && is_convertable_to_cult(cult_mind))
- cult_mind.current.Paralyse(5)
cult += cult_mind
cult_mind.current.cult_add_comm()
update_cult_icons_added(cult_mind)
@@ -234,8 +241,7 @@
if(cult_mind in cult)
cult -= cult_mind
cult_mind.current.verbs -= /mob/living/proc/cult_innate_comm
- cult_mind.current.Paralyse(5)
- cult_mind.current << "An unfamiliar white light flashes through your mind, cleansing the taint of the dark-one and the memories of your time as his servant with it."
+ cult_mind.current << "An unfamiliar white light flashes through your mind, cleansing the taint of the dark-one and the memories of your time as his servant with it."
cult_mind.memory = ""
cult_mind.cult_words = initial(cult_mind.cult_words)
update_cult_icons_removed(cult_mind)
diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm
index 32ae9b5a7e0f2..95ea5c6bef0c9 100644
--- a/code/game/gamemodes/cult/ritual.dm
+++ b/code/game/gamemodes/cult/ritual.dm
@@ -63,7 +63,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
usr.say("[input]")
for(var/mob/M in mob_list)
if((M.mind && (M.mind in ticker.mode.cult)) || (M in dead_mob_list))
- M << "[input]"
+ M << "[input]"
return
@@ -339,106 +339,108 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
throw_range = 5
w_class = 2.0
var/notedat = ""
- var/tomedat = ""
var/list/words = list("ire" = "ire", "ego" = "ego", "nahlizet" = "nahlizet", "certum" = "certum", "veri" = "veri", "jatkaa" = "jatkaa", "balaq" = "balaq", "mgar" = "mgar", "karazet" = "karazet", "geeri" = "geeri")
- tomedat = {"
-
-
-
-
-
The scriptures of Nar-Sie, The One Who Sees, The Geometer of Blood.
-
- The book is written in an unknown dialect, there are lots of pictures of various complex geometric shapes. You find some notes in english that give you basic understanding of the many runes written in the book. The notes give you an understanding what the words for the runes should be. However, you do not know how to write all these words in this dialect.
- Below is the summary of the runes.
-
-
Contents
-
- Teleport self: Travel Self (word)
- Teleport other: Travel Other (word)
- Summon new tome: See Blood Hell
- Convert a person: Join Blood Self
- Summon Nar-Sie: Hell Join Self
- Disable technology: Destroy See Technology
- Drain blood: Travel Blood Self
- Raise dead: Blood Join Hell
- Hide runes: Hide See Blood
- Reveal hidden runes: Blood See Hide
- Leave your body: Hell travel self
- Ghost Manifest: Blood See Travel
- Imbue a talisman: Hell Technology Join
- Sacrifice: Hell Blood Join
- Create a wall: Destroy Travel Self
- Summon cultist: Join Other Self
- Free a cultist: Travel technology other
- Deafen: Hide Other See
- Blind: Destroy See Other
- Blood Boil: Destroy See Blood
- Communicate: Self Other Technology
- Stun: Join Hide Technology
- Summon Cultist Armor: Hell Destroy Other
- See Invisible: See Hell Join
-
-
Rune Descriptions
-
Teleport self
- Teleport rune is a special rune, as it only needs two words, with the third word being destination. Basically, when you have two runes with the same destination, invoking one will teleport you to the other one. If there are more than 2 runes, you will be teleported to a random one. Runes with different third words will create separate networks. You can imbue this rune into a talisman, giving you a great escape mechanism.
-
Teleport other
- Teleport other allows for teleportation for any movable object to another rune with the same third word.
-
Summon new tome
- Invoking this rune summons a new arcane tome.
-
Convert a person
- This rune opens target's mind to the realm of Nar-Sie, which usually results in this person joining the cult. However, some people (mostly the ones who posess high authority) have strong enough will to stay true to their old ideals.
-
Summon Nar-Sie
- The ultimate rune. It summons the Avatar of Nar-Sie himself, tearing a huge hole in reality and consuming everything around it. Summoning it is the final goal of any cult.
-
Disable Technology
- Invoking this rune creates a strong electromagnetic pulse in a small radius, making it basically analogic to an EMP grenade. You can imbue this rune into a talisman, making it a decent defensive item.
-
Drain Blood
- This rune instantly heals you of some brute damage at the expense of a person placed on top of the rune. Whenever you invoke a drain rune, ALL drain runes on the station are activated, draining blood from anyone located on top of those runes. This includes yourself, though the blood you drain from yourself just comes back to you. This might help you identify this rune when studying words. One drain gives up to 25HP per each victim, but you can repeat it if you need more. Draining only works on living people, so you might need to recharge your "Battery" once its empty. Drinking too much blood at once might cause blood hunger.
-
Raise Dead
- This rune allows for the resurrection of any dead person. You will need a dead human body and a living human sacrifice. Make 2 raise dead runes. Put a living non-braindead human on top of one, and a dead body on the other one. When you invoke the rune, the life force of the living human will be transferred into the dead body, allowing a ghost standing on top of the dead body to enter it, instantly and fully healing it. Use other runes to ensure there is a ghost ready to be resurrected.
-
Hide runes
- This rune makes all nearby runes completely invisible. They are still there and will work if activated somehow, but you cannot invoke them directly if you do not see them.
-
Reveal runes
- This rune is made to reverse the process of hiding a rune. It reveals all hidden runes in a rather large area around it.
-
Leave your body
- This rune gently rips your soul out of your body, leaving it intact. You can observe the surroundings as a ghost as well as communicate with other ghosts. Your body takes damage while you are there, so ensure your journey is not too long, or you might never come back.
-
Manifest a ghost
- Unlike the Raise Dead rune, this rune does not require any special preparations or vessels. Instead of using full lifeforce of a sacrifice, it will drain YOUR lifeforce. Stand on the rune and invoke it. If theres a ghost standing over the rune, it will materialise, and will live as long as you dont move off the rune or die. You can put a paper with a name on the rune to make the new body look like that person.
-
Imbue a talisman
- This rune allows you to imbue the magic of some runes into paper talismans. Create an imbue rune, then an appropriate rune beside it. Put an empty piece of paper on the imbue rune and invoke it. You will now have a one-use talisman with the power of the target rune. Using a talisman drains some health, so be careful with it. You can imbue a talisman with power of the following runes: summon tome, reveal, conceal, teleport, tisable technology, communicate, deafen, blind and stun.
-
Sacrifice
- Sacrifice rune allows you to sacrifice a living thing or a body to the Geometer of Blood. Monkeys and dead humans are the most basic sacrifices, they might or might not be enough to gain His favor. A living human is what a real sacrifice should be, however, you will need 3 people chanting the invocation to sacrifice a living person.
-
Create a wall
- Invoking this rune solidifies the air above it, creating an an invisible wall. To remove the wall, simply invoke the rune again.
-
Summon cultist
- This rune allows you to summon a fellow cultist to your location. The target cultist must be unhandcuffed ant not buckled to anything. You also need to have 3 people chanting at the rune to successfully invoke it. Invoking it takes heavy strain on the bodies of all chanting cultists.
-
Free a cultist
- This rune unhandcuffs and unbuckles any cultist of your choice, no matter where he is. Invoking it takes heavy strain on the bodies of all chanting cultists.
-
Deafen
- This rune temporarily deafens all non-cultists around you.
-
Blind
- This rune temporarily blinds all non-cultists around you. Very robust. Use together with the deafen rune to leave your enemies completely helpless.
-
Blood boil
- This rune boils the blood all non-cultists in visible range. The damage is enough to instantly critically hurt any person. You need 3 cultists invoking the rune for it to work. This rune is unreliable and may cause unpredicted effect when invoked. It also drains significant amount of your health when successfully invoked.
-
Communicate
- Invoking this rune allows you to relay a message to all cultists on the station and nearby space objects.
-
Stun
- Unlike other runes, this ons is supposed to be used in talisman form. When invoked directly, it simply releases some dark energy, briefly stunning everyone around. When imbued into a talisman, you can force all of its energy into one person, stunning him so hard he cant even speak. However, effect wears off rather fast.
-
Equip Armor
- When this rune is invoked, either from a rune or a talisman, it will equip the user with the armor of the followers of Nar-Sie. To use this rune to its fullest extent, make sure you are not wearing any form of headgear, armor, gloves or shoes, and make sure you are not holding anything in your hands.
-
See Invisible
- When invoked when standing on it, this rune allows the user to see the the world beyond as long as he does not move.
-
-
- "}
-
+var/TOMEDAT = ""
+
+proc/update_tome()
+ TOMEDAT = {"
+
+
+
+
+
The scriptures of Nar-Sie, The One Who Sees, The Geometer of Blood.
+
+ The book is written in an unknown dialect, there are lots of pictures of various complex geometric shapes. You find some notes in english that give you basic understanding of the many runes written in the book. The notes give you an understanding what the words for the runes should be. However, you do not know how to write all these words in this dialect.
+ Below is the summary of the runes.
+
+
Contents
+
+ Teleport self: Travel Self (word)
+ Teleport other ([ITEMPORT_CULTS]): Travel Other (word)
+ Summon new tome: See Blood Hell
+ Convert a person ([CONVERT_CULTS]): Join Blood Self
+ Summon Nar-Sie ([ELDERGOD_CULTS]): Hell Join Self
+ Disable technology: Destroy See Technology
+ Drain blood: Travel Blood Self
+ Raise dead: Blood Join Hell
+ Hide runes: Hide See Blood
+ Reveal hidden runes: Blood See Hide
+ Leave your body: Hell travel self
+ Ghost Manifest: Blood See Travel
+ Imbue a talisman: Hell Technology Join
+ Sacrifice ([SACRIFICE_CULTS]): Hell Blood Join
+ Create a wall: Destroy Travel Self
+ Summon cultist ([CULTSUMMON_CULTS]): Join Other Self
+ Free a cultist ([FREEDOM_CULTS]): Travel technology other
+ Deafen: Hide Other See
+ Blind: Destroy See Other
+ Blood Boil ([BLOODBOIL_CULTS]): Destroy See Blood
+ Communicate: Self Other Technology
+ Stun: Join Hide Technology
+ Summon Cultist Armor: Hell Destroy Other
+ See Invisible: See Hell Join
+
+
Rune Descriptions
+
Teleport self
+ Teleport rune is a special rune, as it only needs two words, with the third word being destination. Basically, when you have two runes with the same destination, invoking one will teleport you to the other one. If there are more than 2 runes, you will be teleported to a random one. Runes with different third words will create separate networks. You can imbue this rune into a talisman, giving you a great escape mechanism.
+
Teleport other
+ Teleport other allows for teleportation for any movable object to another rune with the same third word. Requires [ITEMPORT_CULTS] cultists.
+
Summon new tome
+ Invoking this rune summons a new arcane tome.
+
Convert a person
+ This rune opens target's mind to the realm of Nar-Sie, which usually results in this person joining the cult. However, some people (mostly the ones who posess high authority) have strong enough will to stay true to their old ideals. Requires [CONVERT_CULTS] cultists.
+
Summon Nar-Sie
+ The ultimate rune. It summons the Avatar of Nar-Sie himself, tearing a huge hole in reality and consuming everything around it. Summoning it is the final goal of any cult. Requires [ELDERGOD_CULTS].
+
Disable Technology
+ Invoking this rune creates a strong electromagnetic pulse in a small radius, making it basically analogic to an EMP grenade. You can imbue this rune into a talisman, making it a decent defensive item.
+
Drain Blood
+ This rune instantly heals you of some brute damage at the expense of a person placed on top of the rune. Whenever you invoke a drain rune, ALL drain runes on the station are activated, draining blood from anyone located on top of those runes. This includes yourself, though the blood you drain from yourself just comes back to you. This might help you identify this rune when studying words. One drain gives up to 25HP per each victim, but you can repeat it if you need more. Draining only works on living people, so you might need to recharge your "Battery" once its empty. Drinking too much blood at once might cause blood hunger.
+
Raise Dead
+ This rune allows for the resurrection of any dead person. You will need a dead human body and a living human sacrifice. Make 2 raise dead runes. Put a living non-braindead human on top of one, and a dead body on the other one. When you invoke the rune, the life force of the living human will be transferred into the dead body, allowing a ghost standing on top of the dead body to enter it, instantly and fully healing it. Use other runes to ensure there is a ghost ready to be resurrected.
+
Hide runes
+ This rune makes all nearby runes completely invisible. They are still there and will work if activated somehow, but you cannot invoke them directly if you do not see them.
+
Reveal runes
+ This rune is made to reverse the process of hiding a rune. It reveals all hidden runes in a rather large area around it.
+
Leave your body
+ This rune gently rips your soul out of your body, leaving it intact. You can observe the surroundings as a ghost as well as communicate with other ghosts. Your body takes damage while you are there, so ensure your journey is not too long, or you might never come back.
+
Manifest a ghost
+ Unlike the Raise Dead rune, this rune does not require any special preparations or vessels. Instead of using full lifeforce of a sacrifice, it will drain YOUR lifeforce. Stand on the rune and invoke it. If theres a ghost standing over the rune, it will materialise, and will live as long as you dont move off the rune or die. You can put a paper with a name on the rune to make the new body look like that person.
+
Imbue a talisman
+ This rune allows you to imbue the magic of some runes into paper talismans. Create an imbue rune, then an appropriate rune beside it. Put an empty piece of paper on the imbue rune and invoke it. You will now have a one-use talisman with the power of the target rune. Using a talisman drains some health, so be careful with it. You can imbue a talisman with power of the following runes: summon tome, reveal, conceal, teleport, tisable technology, communicate, deafen, blind and stun.
+
Sacrifice
+ Sacrifice rune allows you to sacrifice a living thing or a body to the Geometer of Blood. Monkeys and dead humans are the most basic sacrifices, they might or might not be enough to gain His favor. A living human is what a real sacrifice should be, however, you will need 3 people chanting the invocation to sacrifice a living person. Requires [SACRIFICE_CULTS] cultists.
+
Create a wall
+ Invoking this rune solidifies the air above it, creating an an invisible wall. To remove the wall, simply invoke the rune again.
+
Summon cultist
+ This rune allows you to summon a fellow cultist to your location. The target cultist must be unhandcuffed ant not buckled to anything. You also need to have 3 people chanting at the rune to successfully invoke it. Invoking it takes heavy strain on the bodies of all chanting cultists. Requires [CULTSUMMON_CULTS] cultists.
+
Free a cultist
+ This rune unhandcuffs and unbuckles any cultist of your choice, no matter where he is. Invoking it takes heavy strain on the bodies of all chanting cultists. Requires [FREEDOM_CULTS] cultists.
+
Deafen
+ This rune temporarily deafens all non-cultists around you.
+
Blind
+ This rune temporarily blinds all non-cultists around you. Very robust. Use together with the deafen rune to leave your enemies completely helpless.
+
Blood boil
+ This rune boils the blood all non-cultists in visible range. The damage is enough to instantly critically hurt any person. You need 3 cultists invoking the rune for it to work. This rune is unreliable and may cause unpredicted effect when invoked. It also drains significant amount of your health when successfully invoked. Requires [BLOODBOIL_CULTS] cultists to work.
+
Communicate
+ Invoking this rune allows you to relay a message to all cultists on the station and nearby space objects.
+
Stun
+ Unlike other runes, this ons is supposed to be used in talisman form. When invoked directly, it simply releases some dark energy, briefly stunning everyone around. When imbued into a talisman, you can force all of its energy into one person, stunning him so hard he cant even speak. However, effect wears off rather fast.
+
Equip Armor
+ When this rune is invoked, either from a rune or a talisman, it will equip the user with the armor of the followers of Nar-Sie. To use this rune to its fullest extent, make sure you are not wearing any form of headgear, armor, gloves or shoes, and make sure you are not holding anything in your hands.
+
See Invisible
+ When invoked when standing on it, this rune allows the user to see the the world beyond as long as he does not move.
+
+
+ "}
+update_tome()
/obj/item/weapon/tome/Topic(href,href_list[])
if (src.loc == usr)
@@ -451,7 +453,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
if("read")
if(usr.get_active_hand() != src)
return
- usr << browse("[tomedat]", "window=Arcane Tome")
+ usr << browse("[TOMEDAT]", "window=Arcane Tome")
return
if("change")
words[words[number]] = input("Enter the translation for [words[number]]", "Word notes") in engwords
@@ -517,8 +519,9 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
M.reagents.add_reagent("unholywater",holy2unholy)
return
M.take_organ_damage(0,rand(5,20)) //really lucky - 5 hits for a crit
- M.visible_message("[user] beats [M] with the arcane tome!", \
- "You feel searing heat inside!")
+ for(var/mob/O in viewers(M, null))
+ O.show_message(text("[] beats [] with the arcane tome!", user, M), 1)
+ M << "You feel searing heat inside!"
/obj/item/weapon/tome/attack_self(mob/living/user as mob)
@@ -548,7 +551,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
usr.whisper("[input]")
for(var/datum/mind/H in ticker.mode.cult)
if (H.current)
- H.current << "[input]"
+ H.current << "[input]"
return
if("Notes")
if(usr.get_active_hand() != src)
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index babeb58ab51b4..29e56c68ec755 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -1,4 +1,32 @@
var/list/sacrificed = list()
+// Sets number of cultists required for various runes, default values below are for 20+ player rounds
+var/CONVERT_CULTS = 3
+var/ELDERGOD_CULTS = 9
+var/SACRIFICE_CULTS = 3
+var/ITEMPORT_CULTS = 1
+var/FREEDOM_CULTS = 1
+var/CULTSUMMON_CULTS = 3
+var/BLOODBOIL_CULTS = 3
+var/BURNINGBLOOD_CULTS = 5
+
+proc/set_runecults( setELDERGOD_CULTS = null, setCONVERT_CULTS = null, setSACRIFICE_CULTS = null, setITEMPORT_CULTS = null, setFREEDOM_CULTS = null, setCULTSUMMON_CULTS = null, setBLOODBOIL_CULTS = null, setBURNINGBLOOD_CULTS = null ) //Convenience Method for setting number of cultists required for runes, automatically updates tome
+ if(setELDERGOD_CULTS)
+ ELDERGOD_CULTS = setELDERGOD_CULTS
+ if(setCONVERT_CULTS)
+ CONVERT_CULTS = setCONVERT_CULTS
+ if(setSACRIFICE_CULTS)
+ SACRIFICE_CULTS = setSACRIFICE_CULTS
+ if(setITEMPORT_CULTS)
+ ITEMPORT_CULTS = setITEMPORT_CULTS
+ if(setFREEDOM_CULTS)
+ FREEDOM_CULTS = setFREEDOM_CULTS
+ if(setCULTSUMMON_CULTS)
+ CULTSUMMON_CULTS = setCULTSUMMON_CULTS
+ if(setBLOODBOIL_CULTS)
+ BLOODBOIL_CULTS = setBLOODBOIL_CULTS
+ if(setBURNINGBLOOD_CULTS)
+ BURNINGBLOOD_CULTS = setBURNINGBLOOD_CULTS
+ update_tome()
/obj/effect/rune
/////////////////////////////////////////FIRST RUNE
@@ -62,7 +90,7 @@ var/list/sacrificed = list()
culcount++
if(user.loc==src.loc)
return fizzle(user)
- if(culcount>=1)
+ if(culcount>=ITEMPORT_CULTS)
user.say("Sas[pick("'","`")]so c'arta forbici tarem!")
user.visible_message("You feel air moving from the rune - like as it was swapped with somewhere else.", \
"You feel air moving from the rune - like as it was swapped with somewhere else.", \
@@ -108,7 +136,7 @@ var/list/sacrificed = list()
if(iscultist(C) && !C.stat) //converting requires three cultists
cultsinrange += C
C.say("Mah[pick("'","`")]weyh pleggh at e'ntrath!")
- if(cultsinrange.len >= 3)
+ if(cultsinrange.len >= CONVERT_CULTS)
M.visible_message("[M] writhes in pain as the markings below him glow a bloody red.", \
"AAAAAAHHHH!", \
"You hear an anguished scream.")
@@ -135,11 +163,11 @@ var/list/sacrificed = list()
return 1 */
else
M << "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root."
- M << "And not a single fuck was given, exterminate the cult at all costs."
+ M << "And not a single fuck was given, exterminate the cult at all costs."
if(ticker.mode.name == "cult")
if(M.mind == ticker.mode.sacrifice_target)
for(var/mob/living/carbon/human/cultist in cultsinrange)
- cultist << "The Chosen One!! KILL THE CHOSEN ONE!!! "
+ cultist << "The Chosen One!! KILL THE CHOSEN ONE!!! "
return 0
else
for(var/mob/living/carbon/human/cultist in cultsinrange)
@@ -157,24 +185,16 @@ var/list/sacrificed = list()
for(var/mob/M in range(1,src))
if(iscultist(M) && !M.stat)
cultist_count += M
- if(cultist_count.len >= 9)
+ if(cultist_count.len >= ELDERGOD_CULTS)
if(ticker.mode.name == "cult")
- var/datum/game_mode/cult/cultmode = ticker.mode
- if(!("eldergod" in cultmode.cult_objectives))
+ if("eldergod" in ticker.mode.cult_objectives)
+ ticker.mode:eldergod = 0
+ else
message_admins("[usr.real_name]([usr.ckey]) tried to summon a god when she didn't want to come out to play.") // Admin alert because you *KNOW* dickbutts are going to abuse this.
for(var/mob/M in cultist_count)
M.reagents.add_reagent("hell_water", 10)
M << "YOUR SOUL BURNS WITH YOUR ARROGANCE!!!"
return
- else
- for(var/obj_count=1, obj_count <= cultmode.cult_objectives.len, obj_count++)
- if(cultmode.cult_objectives[obj_count] == "sacrifice")
- if(cultmode.sacrifice_target)
- if(!(cultmode.sacrifice_target in sacrificed))
- for(var/mob/M in cultist_count)
- M << "Nar-sie refuses to be summoned while the sacrifice isn't complete."
- return
- cultmode.eldergod = 0
var/narsie_type = /obj/singularity/narsie/large
// Moves narsie if she was already summoned.
var/obj/her = locate(narsie_type, SSobj.processing)
@@ -610,11 +630,11 @@ var/list/sacrificed = list()
if(iscultist(C) && !C.stat)
cultsinrange += C
C.say("Barhah hra zar[pick("'","`")]garis!")
- if(cultsinrange.len >= 3) break //we only need to check for three alive cultists, loop breaks so their aren't extra cultists getting word rewards
+ if(cultsinrange.len >= SACRIFICE_CULTS) break //we only need to check for three alive cultists, loop breaks so their aren't extra cultists getting word rewards
for(var/mob/H in victims)
if (ticker.mode.name == "cult")
if(H.mind == ticker.mode:sacrifice_target)
- if(cultsinrange.len >= 3)
+ if(cultsinrange.len >= SACRIFICE_CULTS)
sacrificed += H.mind
stone_or_gib(H)
for(var/mob/living/carbon/C in cultsinrange)
@@ -626,7 +646,7 @@ var/list/sacrificed = list()
else
usr << "Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual."
else
- if(cultsinrange.len >= 3)
+ if(cultsinrange.len >= SACRIFICE_CULTS)
if(H.stat !=2)
for(var/mob/living/carbon/C in cultsinrange)
C << "The Geometer of Blood accepts this sacrifice."
@@ -652,7 +672,7 @@ var/list/sacrificed = list()
usr << "However, a mere dead body is not enough to satisfy Him."
stone_or_gib(H)
else
- if(cultsinrange.len >= 3)
+ if(cultsinrange.len >= SACRIFICE_CULTS)
if(H.stat !=2)
for(var/mob/living/carbon/C in cultsinrange)
C << "The Geometer of Blood accepts this sacrifice."
@@ -680,7 +700,7 @@ var/list/sacrificed = list()
for(var/mob/living/carbon/monkey/M in src.loc)
if (ticker.mode.name == "cult")
if(M.mind == ticker.mode:sacrifice_target)
- if(cultsinrange.len >= 3)
+ if(cultsinrange.len >= SACRIFICE_CULTS)
sacrificed += M.mind
for(var/mob/living/carbon/C in cultsinrange)
C << "The Geometer of Blood accepts this sacrifice, your objective is now complete."
@@ -703,7 +723,7 @@ var/list/sacrificed = list()
if(prob(30))
ticker.mode.grant_runeword(usr)
stone_or_gib(M)
- for(var/mob/victim in src.loc) //TO-DO: Move the shite above into the mob's own sac_act - see /mob/living/simple_animal/pet/corgi/sac_act for an example
+ for(var/mob/victim in src.loc) //TO-DO: Move the shite above into the mob's own sac_act - see /mob/living/simple_animal/corgi/sac_act for an example
victim.sac_act(src, victim) //Sacrifice procs are now seperate per mob, this allows us to allow sacrifice on as many mob types as we want without making an already clunky system worse
/* for(var/mob/living/carbon/alien/A)
for(var/mob/K in cultsinrange)
@@ -808,7 +828,7 @@ var/list/sacrificed = list()
for(var/mob/living/C in orange(1,src))
if(iscultist(C) && !C.stat)
users+=C
- if(users.len>=1)
+ if(users.len>=FREEDOM_CULTS)
var/mob/living/carbon/cultist = input("Choose the one who you want to free", "Followers of Geometer") as null|anything in (cultists - users)
if(!cultist)
return fizzle(user)
@@ -823,8 +843,7 @@ var/list/sacrificed = list()
))
user << "The [cultist] is already free."
return
- if(cultist.buckled)
- cultist.buckled.unbuckle_mob()
+ cultist.buckled = null
if (cultist.handcuffed)
cultist.handcuffed.loc = cultist.loc
cultist.handcuffed = null
@@ -859,7 +878,7 @@ var/list/sacrificed = list()
for(var/mob/living/C in orange(1,src))
if(iscultist(C) && !C.stat)
users+=C
- if(users.len>=3)
+ if(users.len>=CULTSUMMON_CULTS)
var/mob/living/carbon/cultist = input("Choose the one who you want to summon", "Followers of Geometer") as null|anything in (cultists - user)
if(!cultist)
return fizzle(user)
@@ -977,7 +996,7 @@ var/list/sacrificed = list()
for(var/mob/living/carbon/C in orange(1,src))
if(iscultist(C) && !C.stat)
culcount++
- if(culcount>=3)
+ if(culcount>=BLOODBOIL_CULTS)
for(var/mob/living/carbon/M in viewers(usr))
if(iscultist(M))
continue
@@ -1008,7 +1027,7 @@ var/list/sacrificed = list()
for(var/mob/living/carbon/C in orange(1,src))
if(iscultist(C) && !C.stat)
culcount++
- if(culcount >= 5)
+ if(culcount >= BURNINGBLOOD_CULTS)
for(var/obj/effect/rune/R in world)
if(R.blood_DNA == src.blood_DNA)
for(var/mob/living/M in orange(2,R))
diff --git a/code/game/gamemodes/extended/extended.dm b/code/game/gamemodes/extended/extended.dm
index 4364718fa7255..409b655f5ba40 100644
--- a/code/game/gamemodes/extended/extended.dm
+++ b/code/game/gamemodes/extended/extended.dm
@@ -2,7 +2,7 @@
name = "extended"
config_tag = "extended"
required_players = 0
- //reroll_friendly = 1
+ reroll_friendly = 1
/datum/game_mode/announce()
world << "The current game mode is - Extended Role-Playing!"
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 2e3654f7b6a9d..795beb6fdf292 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -84,7 +84,7 @@
spawn (rand(waittime_l, waittime_h))
send_intercept(0)
start_state = new /datum/station_state()
- start_state.count(1)
+ start_state.count()
return 1
///make_antag_chance()
@@ -97,28 +97,15 @@
///convert_roundtype()
///Allows rounds to basically be "rerolled" should the initial premise fall through
/datum/game_mode/proc/convert_roundtype()
- var/living_crew = 0
-
- for(var/mob/Player in mob_list)
- if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) &&!isbrain(Player))
- living_crew++
- if(living_crew / joined_player_list.len <= config.midround_antag_life_check) //If a lot of the player base died, we start fresh
- message_admins("Convert_roundtype failed due to too many dead people. Limit is [config.midround_antag_life_check * 100]% living crew")
- return null
-
- var/list/datum/game_mode/runnable_modes = config.get_runnable_midround_modes(living_crew)
- var/list/datum/game_mode/usable_modes = list()
+ var/list/datum/game_mode/runnable_modes = config.get_runnable_modes()
for(var/datum/game_mode/G in runnable_modes)
- if(G.reroll_friendly)
- usable_modes += G
- else
- del(G)
+ if(!G.reroll_friendly) del(G)
+
+ SSshuttle.emergencyNoEscape = 0 //Time to get the fuck out of here
- if(!usable_modes)
- message_admins("Convert_roundtype failed due to no valid modes to convert to. Please report this error to the Coders.")
- return null
+ if(!runnable_modes) return 0
- replacementmode = pickweight(usable_modes)
+ replacementmode = pickweight(runnable_modes)
switch(SSshuttle.emergency.mode) //Rounds on the verge of ending don't get new antags, they just run out
if(SHUTTLE_STRANDED, SHUTTLE_ESCAPE)
@@ -128,8 +115,15 @@
return 1
if(world.time >= (config.midround_antag_time_check * 600))
- message_admins("Convert_roundtype failed due to round length. Limit is [config.midround_antag_time_check] minutes.")
- return null
+ return 0
+
+ var/living_crew = 0
+
+ for(var/mob/Player in mob_list)
+ if(Player.mind && Player.stat != DEAD && !isnewplayer(Player) &&!isbrain(Player))
+ living_crew++
+ if(living_crew / joined_player_list.len <= config.midround_antag_life_check) //If a lot of the player base died, we start fresh
+ return 0
var/list/antag_canadates = list()
@@ -138,8 +132,7 @@
antag_canadates += H
if(!antag_canadates)
- message_admins("Convert_roundtype failed due to no antag canadates.")
- return null
+ return 0
antag_canadates = shuffle(antag_canadates)
@@ -148,21 +141,19 @@
if(config.protect_assistant_from_antagonist)
replacementmode.restricted_jobs += "Assistant"
- message_admins("The roundtype will be converted. If you have other plans for the station or think the round should end stop the creation of antags or end the round now.")
+ message_admins("The roundtype will be converted. If you feel that the round should not continue, end the round now.")
- spawn(rand(1200,3000)) //somewhere between 2 and 5 minutes from now
- if(!config.midround_antag[ticker.mode.config_tag])
- round_converted = 0
- return 1
+ spawn(rand(1800,4200)) //somewhere between 3 and 7 minutes from now
for(var/mob/living/carbon/human/H in antag_canadates)
replacementmode.make_antag_chance(H)
round_converted = 2
message_admins("The roundtype has been converted, antagonists may have been created")
+
return 1
///process()
///Called by the gameticker
-/datum/game_mode/process()
+/datum/game_mode/proc/process()
return 0
@@ -227,7 +218,6 @@
if(BE_GANG) roletext="gangster"
if(BE_CULTIST) roletext="cultist"
if(BE_MONKEY) roletext="monkey"
- if(BE_ABDUCTOR) roletext="abductor"
// Ultimate randomizing code right here
@@ -362,7 +352,7 @@ proc/display_roundstart_logout_report()
continue //AFK client
if(L.stat)
if(L.suiciding) //Suicider
- msg += "[L.name] ([L.ckey]), the [L.job] (Suicide)\n"
+ msg += "[L.name] ([L.ckey]), the [L.job] (Suicide)\n"
continue //Disconnected client
if(L.stat == UNCONSCIOUS)
msg += "[L.name] ([L.ckey]), the [L.job] (Dying)\n"
@@ -376,17 +366,17 @@ proc/display_roundstart_logout_report()
if(D.mind && D.mind.current == L)
if(L.stat == DEAD)
if(L.suiciding) //Suicider
- msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Suicide)\n"
+ msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Suicide)\n"
continue //Disconnected client
else
msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Dead)\n"
continue //Dead mob, ghost abandoned
else
if(D.can_reenter_corpse)
- msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (This shouldn't appear.)\n"
+ msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (This shouldn't appear.)\n"
continue //Lolwhat
else
- msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Ghosted)\n"
+ msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Ghosted)\n"
continue //Ghosted while alive
@@ -428,4 +418,4 @@ proc/display_roundstart_logout_report()
if(!isnum(enemy_minimum_age))
return 0
- return max(0, enemy_minimum_age - C.player_age)
+ return max(0, enemy_minimum_age - C.player_age)
\ No newline at end of file
diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm
index 1432c50efd7b0..c8b6d86037612 100644
--- a/code/game/gamemodes/gang/gang.dm
+++ b/code/game/gamemodes/gang/gang.dm
@@ -2,15 +2,10 @@
//Gang War Game Mode
/datum/game_mode
- var/list/datum/mind/A_gang = list() //gang A Members
- var/list/datum/mind/B_gang = list() //gang B Members
- var/list/datum/mind/A_bosses = list() //gang A Bosses
- var/list/datum/mind/B_bosses = list() //gang B Bosses
- var/obj/item/device/gangtool/A_tools = list()
- var/obj/item/device/gangtool/B_tools = list()
- var/datum/gang_points/gang_points
- var/list/A_territory = list()
- var/list/B_territory = list()
+ var/list/datum/mind/A_bosses = list() //gang A bosses
+ var/list/datum/mind/A_gangsters = list() //gang A Members
+ var/list/datum/mind/B_bosses = list() //gang B bosses
+ var/list/datum/mind/B_gangsters = list() //gang B Members
/datum/game_mode/gang
name = "gang war"
@@ -29,7 +24,7 @@
///////////////////////////
/datum/game_mode/gang/announce()
world << "The current game mode is - Gang War!"
- world << "A violent turf war has erupted on the station! Gangsters - Take over the station by claiming more than half of the station! Crew - The gangs will try to keep you on the station. Successfully evacuate the station to win!"
+ world << "A violent turf war has erupted on the station! Gangsters - Take over the station by recruiting gangsters and killing the rival gang's boss! Crew - Identify and stop the mob bosses without killing either of them!"
///////////////////////////////////////////////////////////////////////////////
@@ -88,25 +83,25 @@
A_bosses += boss
antag_candidates -= boss
boss.special_role = "[gang_name("A")] Gang (A) Boss"
- log_game("[boss.key] has been selected as the boss for the [gang_name("A")] Gang (A)")
+ log_game("[boss.key] has been selected as a boss for the [gang_name("A")] Gang (A)")
boss = pick(antag_candidates)
B_bosses += boss
antag_candidates -= boss
boss.special_role = "[gang_name("B")] Gang (B) Boss"
- log_game("[boss.key] has been selected as the boss for the [gang_name("B")] Gang (B)")
+ log_game("[boss.key] has been selected as a boss for the [gang_name("B")] Gang (B)")
/datum/game_mode/proc/forge_gang_objectives(var/datum/mind/boss_mind)
var/datum/objective/rival_obj = new
rival_obj.owner = boss_mind
- rival_obj.explanation_text = "Claim more than half the station before the [(boss_mind in A_bosses) ? gang_name("B") : gang_name("A")] Gang does."
+ rival_obj.explanation_text = "Assassinate or exile the [(boss_mind in A_bosses) ? gang_name("B") : gang_name("A")] Gang's bosses."
boss_mind.objectives += rival_obj
/datum/game_mode/proc/greet_gang(var/datum/mind/boss_mind, var/you_are=1)
var/obj_count = 1
if (you_are)
- boss_mind.current << "You are the founding member of the [(boss_mind in A_bosses) ? gang_name("A") : gang_name("B")] Gang!"
+ boss_mind.current << "You are a [(boss_mind in A_bosses) ? gang_name("A") : gang_name("B")] Gang Boss!"
for(var/datum/objective/objective in boss_mind.objectives)
boss_mind.current << "Objective #[obj_count]: [objective.explanation_text]"
obj_count++
@@ -123,9 +118,50 @@
mob << "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself."
mob.dna.remove_mutation(CLOWNMUT)
- var/obj/item/weapon/pen/gang/T = new(mob)
- var/obj/item/device/gangtool/gangtool = new(mob)
- var/obj/item/toy/crayon/spraycan/gang/SC = new(mob)
+ // find a radio! toolbox(es), backpack, belt, headset
+ var/loc = ""
+ var/obj/item/R = locate(/obj/item/device/pda) in mob.contents //Hide the uplink in a PDA if available, otherwise radio
+ if(!R)
+ R = locate(/obj/item/device/radio) in mob.contents
+
+ if (!R)
+ mob << "Unfortunately, Your Syndicate benefactors wasn't able to get you an uplink."
+ . = 0
+ else
+ if (istype(R, /obj/item/device/radio))
+ // generate list of radio freqs
+ var/obj/item/device/radio/target_radio = R
+ var/freq = 1441
+ var/list/freqlist = list()
+ while (freq <= 1489)
+ if (freq < 1451 || freq > 1459)
+ freqlist += freq
+ freq += 2
+ if ((freq % 2) == 0)
+ freq += 1
+ freq = freqlist[rand(1, freqlist.len)]
+
+ var/obj/item/device/uplink/hidden/T = new(R)
+ target_radio.hidden_uplink = T
+ T.uplink_owner = "[mob.key]"
+ target_radio.traitor_frequency = freq
+ mob << "Your Syndicate benefactors have cunningly disguised a Syndicate Uplink as your [R.name] [loc]. Simply dial the frequency [format_frequency(freq)] to unlock its hidden features."
+ mob.mind.store_memory("Radio Freq: [format_frequency(freq)] ([R.name] [loc]).")
+ else if (istype(R, /obj/item/device/pda))
+ // generate a passcode if the uplink is hidden in a PDA
+ var/pda_pass = "[rand(100,999)] [pick("Alpha","Bravo","Delta","Omega")]"
+
+ var/obj/item/device/uplink/hidden/T = new(R)
+ R.hidden_uplink = T
+ T.uplink_owner = "[mob.key]"
+ var/obj/item/device/pda/P = R
+ P.lock_code = pda_pass
+
+ mob << "Your Syndicate benefactors have cunningly disguised a Syndicate Uplink as your [R.name] [loc]. Simply enter the code \"[pda_pass]\" into the ringtone select to unlock its hidden features."
+ mob.mind.store_memory("Uplink Passcode: [pda_pass] ([R.name] [loc]).")
+
+ var/obj/item/device/flash/T = new(mob)
+ var/obj/item/device/recaller/recaller = new(mob)
var/list/slots = list (
"backpack" = slot_in_backpack,
@@ -137,28 +173,20 @@
. = 0
- var/where = mob.equip_in_one_of_slots(gangtool, slots)
- if (!where)
- mob << "Your Syndicate benefactors were unfortunately unable to get you a Gangtool."
- else
- gangtool.register_device(mob)
- mob << "The Gangtool in your [where] will allow you to use your influence to purchase items and prevent the station from evacuating before you can take over. Use it to recall the emergency shuttle from anywhere on the station."
- mob << "You can also promote your gang members to lieutenant by giving them an unregistered gangtool. Lieutenants cannot be deconverted and are able to use recruitment pens and gangtools."
- . += 1
-
- var/where2 = mob.equip_in_one_of_slots(T, slots)
+ var/where2 = mob.equip_in_one_of_slots(recaller, slots)
if (!where2)
- mob << "Your Syndicate benefactors were unfortunately unable to get you a recruitment pen to start."
+ mob << "Your Syndicate benefactors were unfortunately unable to get you a Recaller."
else
- mob << "The recruitment pen in your [where2] will help you get your gang started. Use it on unsuspecting crew members to recruit them."
- . += 1
+ mob << "The Recaller in your [where2] will allow you to prevent the station from prematurely evacuating. Use it to recall the emergency shuttle from anywhere on the station."
+ . += 2
- var/where3 = mob.equip_in_one_of_slots(SC, slots)
- if (!where3)
- mob << "Your Syndicate benefactors were unfortunately unable to get you a territory spraycan to start."
+ var/where = mob.equip_in_one_of_slots(T, slots)
+ if (!where)
+ mob << "Your Syndicate benefactors were unfortunately unable to get you a flash."
else
- mob << "The territory spraycan in your [where3] can be used to claim areas of the station for your gang. The more territory your gang controls, the more influence you get."
+ mob << "The flash in your [where] will help you to persuade the crew to work for you."
. += 1
+
mob.update_icons()
return .
@@ -167,16 +195,23 @@
//Checks if the either gang have won or not//
/////////////////////////////////////////////
/datum/game_mode/gang/check_win()
- if(A_territory.len > (start_state.num_territories / 2))
+ var/A_victory = check_gang_victory(B_bosses) //Check if B bosses are dead or exiled
+ var/B_victory = check_gang_victory(A_bosses) //Check if A bosses are dead or exiled
+
+ if(A_victory && B_victory)
+ finished = "Draw" //Both teams fail. Allow for draws in case they're all incapacitated at the same time.
+
+ else if(A_victory)
finished = "A" //Gang A wins
- else if(B_territory.len > (start_state.num_territories / 2))
+
+ else if(B_victory)
finished = "B" //Gang B wins
///////////////////////////////
//Checks if the round is over//
///////////////////////////////
/datum/game_mode/gang/check_finished()
- if(finished)
+ if(finished && !config.continuous_round_gang) //Check for Gang Boss death
return 1
return ..() //Check for evacuation/nuke
@@ -186,28 +221,23 @@
/datum/game_mode/proc/add_gangster(datum/mind/gangster_mind, var/gang, var/check = 1)
if(check && isloyal(gangster_mind.current)) //Check to see if the potential gangster is implanted
return 0
- if((gangster_mind in A_bosses) || (gangster_mind in A_gang) || (gangster_mind in B_bosses) || (gangster_mind in B_gang))
+ if((gangster_mind in A_bosses) || (gangster_mind in A_gangsters) || (gangster_mind in B_bosses) || (gangster_mind in B_gangsters))
return 0
if(gang == "A")
- A_gang += gangster_mind
+ A_gangsters += gangster_mind
else
- B_gang += gangster_mind
+ B_gangsters += gangster_mind
if(check)
- if(iscarbon(gangster_mind.current))
- var/mob/living/carbon/carbon_mob = gangster_mind.current
- carbon_mob.silent = max(carbon_mob.silent, 5)
- carbon_mob.flash_eyes(1, 1)
- gangster_mind.current.Stun(5)
+ gangster_mind.current.Paralyse(5)
gangster_mind.current << "You are now a member of the [gang=="A" ? gang_name("A") : gang_name("B")] Gang!"
- gangster_mind.current << "Help your bosses take over the station by claiming territory with the special spraycans they provide. Simply spray on any unclaimed area of the station."
- gangster_mind.current << "You can identify your bosses by their brown \"G\" icon."
+ gangster_mind.current << "Help your Boss take over the station by defeating the rival gang. You can identify your Boss by their brown \"B\" icon."
gangster_mind.current.attack_log += "\[[time_stamp()]\] Has been converted to the [gang=="A" ? "[gang_name("A")] Gang (A)" : "[gang_name("B")] Gang (B)"]!"
gangster_mind.special_role = "[gang=="A" ? "[gang_name("A")] Gang (A)" : "[gang_name("B")] Gang (B)"]"
update_gang_icons_added(gangster_mind,gang)
return 1
-////////////////////////////////////////////////////////////////////
-//Deals with players reverting to neutral (Not a gangster anymore)//
-////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////
+//Deals with players going straight (Not a gangster anymore)//
+//////////////////////////////////////////////////////////////
/datum/game_mode/proc/remove_gangster(datum/mind/gangster_mind, var/beingborged, var/silent, var/exclude_bosses=0)
var/gang
@@ -220,12 +250,12 @@
B_bosses -= gangster_mind
gang = "B"
- if(gangster_mind in A_gang)
- A_gang -= gangster_mind
+ if(gangster_mind in A_gangsters)
+ A_gangsters -= gangster_mind
gang = "A"
- if(gangster_mind in B_gang)
- B_gang -= gangster_mind
+ if(gangster_mind in B_gangsters)
+ B_gangsters -= gangster_mind
gang = "B"
if(!gang) //not a valid gangster
@@ -282,6 +312,21 @@
ganghud.leave_hud(defector_mind.current)
set_antag_hud(defector_mind.current, null)
+///////////////////////////
+//Checks for gang victory//
+///////////////////////////
+/datum/game_mode/gang/proc/check_gang_victory(var/list/boss_list)
+ if(!boss_list.len)
+ return 0
+ for(var/datum/mind/boss_mind in boss_list)
+ if(boss_mind.current)
+ if(boss_mind.current.stat == DEAD || !ishuman(boss_mind.current) || !boss_mind.current.ckey)
+ return 1
+ var/turf/T = get_turf(boss_mind.current)
+ if(T && (T.z != ZLEVEL_STATION)) //If they leave the station they count as dead for this
+ return 1
+ return 0
+ return 1
//////////////////////////////////////////////////////////////////////
//Announces the end of the game with all relavent information stated//
@@ -289,8 +334,10 @@
/datum/game_mode/gang/declare_completion()
if(!finished)
world << "The station was [station_was_nuked ? "destroyed!" : "evacuated before either gang could claim it!"]"
+ else if(finished == "Draw")
+ world << "All gang bosses have been killed or exiled!"
else
- world << "The [finished=="A" ? gang_name("A") : gang_name("B")] Gang has taken over the station!"
+ world << "The [finished=="A" ? gang_name("A") : gang_name("B")] Gang defeated their rivals!"
..()
return 1
@@ -303,22 +350,36 @@
else
winner = "Draw"
- if(A_bosses.len || A_gang.len)
+ var/num_ganga = 0
+ var/list/agang = A_gangsters + A_bosses
+ for(var/datum/mind/agangster in agang)
+ if(agangster.current)
+ if(agangster.current in living_mob_list)
+ num_ganga++
+
+ var/num_gangb = 0
+ var/list/bgang = B_gangsters + B_bosses
+ for(var/datum/mind/bgangster in bgang)
+ if(bgangster.current)
+ if(bgangster.current in living_mob_list)
+ num_gangb++
+
+ if(A_bosses.len || A_gangsters.len)
if(winner)
- world << " The [gang_name("A")] Gang was [winner=="A" ? "victorious" : "defeated"] with [round((ticker.mode.A_territory.len/start_state.num_territories)*100, 0.1)]% control of the station!"
- world << " The [gang_name("A")] Gang Bosses were:"
+ world << " The [gang_name("A")] Gang was [winner=="A" ? "victorious" : "defeated"] with [num_ganga] members!"
+ world << " The [gang_name("A")] Gang Boss was:"
gang_membership_report(A_bosses)
- world << " The [gang_name("A")] Gangsters were:"
- gang_membership_report(A_gang)
+ world << " The [gang_name("A")] Gangsters were:"
+ gang_membership_report(A_gangsters)
world << " "
- if(B_bosses.len || B_gang.len)
+ if(B_bosses.len || B_gangsters.len)
if(winner)
- world << " The [gang_name("B")] Gang was [winner=="B" ? "victorious" : "defeated"] with [round((ticker.mode.B_territory.len/start_state.num_territories)*100, 0.1)]% control of the station!"
- world << " The [gang_name("B")] Gang Bosses were:"
+ world << " The [gang_name("B")] Gang was [winner=="B" ? "victorious" : "defeated"] with [num_gangb] members!"
+ world << " The [gang_name("B")] Gang Boss was:"
gang_membership_report(B_bosses)
- world << " The [gang_name("B")] Gangsters were:"
- gang_membership_report(B_gang)
+ world << " The [gang_name("B")] Gangsters were:"
+ gang_membership_report(B_gangsters)
world << " "
/datum/game_mode/proc/gang_membership_report(var/list/membership)
@@ -339,55 +400,3 @@
text += ")"
world << text
-
-
-//////////////////////////////////
-//Handles gang points and income//
-//////////////////////////////////
-
-/datum/gang_points
- var/A = 30
- var/B = 30
- var/next_point_time = 0
-
-/datum/gang_points/proc/start()
- next_point_time = world.time + 3000
- spawn(3000)
- income()
-
-/datum/gang_points/proc/income()
- var/A_new = min(100,(A + 10 + ticker.mode.A_territory.len))
- var/A_message = ""
- if(A_new != A)
- A_message += "Your gang has gained [A_new - A] Influence from their presence on station."
- if(A_new == 100)
- A_message += "Maximum influence reached."
- A = A_new
- ticker.mode.message_gangtools(ticker.mode.A_tools,A_message)
-
- var/B_new = min(100,(B + 10 + ticker.mode.B_territory.len))
- var/B_message = ""
- if(B_new != B)
- B_message += "Your gang has collected [B_new - B] Influence from their presence on station. "
- if(B_new == 100)
- B_message += "Maximum influence reached."
- B = B_new
- ticker.mode.message_gangtools(ticker.mode.B_tools,B_message)
-
- start()
-
-
-////////////////////////////////////////////////
-//Sends a message to the boss via his gangtool//
-////////////////////////////////////////////////
-
-/datum/game_mode/proc/message_gangtools(var/list/gangtools,var/message,var/beeps=1)
- if(!gangtools.len || !message)
- return
- for(var/obj/item/device/gangtool/tool in gangtools)
- var/mob/living/mob = get(tool.loc,/mob/living)
- if(mob && mob.mind)
- if(((tool.gang == "A") && ((mob.mind in A_gang) || (mob.mind in A_bosses))) || ((tool.gang == "B") && ((mob.mind in B_gang) || (mob.mind in B_bosses))))
- mob << "\icon[tool] [message]"
- if(beeps)
- playsound(mob.loc, 'sound/machines/twobeep.ogg', 50, 1)
\ No newline at end of file
diff --git a/code/game/gamemodes/intercept_report.dm b/code/game/gamemodes/intercept_report.dm
index 81ed244f08667..a19846888be88 100644
--- a/code/game/gamemodes/intercept_report.dm
+++ b/code/game/gamemodes/intercept_report.dm
@@ -243,7 +243,7 @@
src.text += " "
/datum/intercept_text/proc/build_nuke(datum/mind/correct_person)
- src.text += "
Centcom recently received a report of a plot to destroy one of our stations in your area. We believe the Nuclear Authentication Disc "
+ src.text += "
Centcom recently recieved a report of a plot to destroy one of our stations in your area. We believe the Nuclear Authentication Disc "
src.text += "that is standard issue aboard your vessel may be a target. We recommend removal of this object, and it's storage in a safe "
src.text += "environment. As this may cause panic among the crew, all efforts should be made to keep this information a secret from all but "
src.text += "the most trusted crew-members."
diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm
index 5e5aa1bf46211..cc74384e53a21 100644
--- a/code/game/gamemodes/malfunction/Malf_Modules.dm
+++ b/code/game/gamemodes/malfunction/Malf_Modules.dm
@@ -47,10 +47,6 @@
/mob/living/silicon/ai/proc/upgrade_turrets()
set category = "Malfunction"
set name = "Upgrade Turrets"
-
- if(!canUseTopic())
- return
-
src.verbs -= /mob/living/silicon/ai/proc/upgrade_turrets
for(var/obj/machinery/porta_turret/turret in machines)
if(turret.ai) //Make sure only the AI's turrets are affected.
@@ -71,7 +67,8 @@
set category = "Malfunction"
set name = "Initiate Hostile Lockdown"
- if(!canUseTopic())
+ if(src.stat == 2)
+ src <<"You cannot begin a lockdown because you are dead!"
return
if(malf_cooldown)
@@ -108,7 +105,8 @@
set category = "Malfunction"
set name = "Disable Lockdown"
- if(!canUseTopic())
+ if(src.stat == 2)
+ src <<"You cannot disable lockdown because you are dead!"
return
if(malf_cooldown)
return
@@ -143,10 +141,6 @@
/mob/living/silicon/ai/proc/disable_rcd()
set category = "Malfunction"
set name = "Disable RCDs"
-
- if(!canUseTopic())
- return
-
for(var/datum/AI_Module/large/disable_rcd/rcdmod in current_modules)
if(rcdmod.uses > 0)
rcdmod.uses --
@@ -171,9 +165,6 @@
set name = "Override Thermal Sensors"
set category = "Malfunction"
- if(!canUseTopic())
- return
-
for(var/obj/machinery/firealarm/F in world)
if(F.z != ZLEVEL_STATION)
continue
@@ -195,9 +186,6 @@
set name = "Disable Air Alarm Safeties"
set category = "Malfunction"
- if(!canUseTopic())
- return
-
for(var/obj/machinery/alarm/A in world)
if(A.z != ZLEVEL_STATION)
continue
@@ -219,10 +207,6 @@
/mob/living/silicon/ai/proc/overload_machine(obj/machinery/M as obj in world)
set name = "Overload Machine"
set category = "Malfunction"
-
- if(!canUseTopic())
- return
-
if (istype(M, /obj/machinery))
for(var/datum/AI_Module/small/overload_machine/overload in current_modules)
if(overload.uses > 0)
@@ -249,10 +233,6 @@
/mob/living/silicon/ai/proc/override_machine(obj/machinery/M as obj in world)
set name = "Override Machine"
set category = "Malfunction"
-
- if(!canUseTopic())
- return
-
if (istype(M, /obj/machinery))
for(var/datum/AI_Module/small/override_machine/override in current_modules)
if(override.uses > 0)
@@ -291,9 +271,6 @@
src << "Out of uses."
return
- if(!canUseTopic())
- return
-
var/sure = alert(src, "Make sure the room it is in is big enough, there is camera vision and that there is a 1x3 area for the machine. Are you sure you want to place the machine here?", "Are you sure?", "Yes", "No")
if(sure != "Yes")
return
@@ -342,10 +319,6 @@
/mob/living/silicon/ai/proc/blackout()
set category = "Malfunction"
set name = "Blackout"
-
- if(!canUseTopic())
- return
-
for(var/datum/AI_Module/small/blackout/blackout in current_modules)
if(blackout.uses > 0)
blackout.uses --
@@ -368,10 +341,6 @@
/mob/living/silicon/ai/proc/reactivate_camera(obj/machinery/camera/C as obj in cameranet.cameras)
set name = "Reactivate Camera"
set category = "Malfunction"
-
- if(!canUseTopic())
- return
-
if (istype (C, /obj/machinery/camera))
for(var/datum/AI_Module/small/reactivate_camera/camera in current_modules)
if(camera.uses > 0)
@@ -396,10 +365,6 @@
/mob/living/silicon/ai/proc/upgrade_camera(obj/machinery/camera/C as obj in cameranet.cameras)
set name = "Upgrade Camera"
set category = "Malfunction"
-
- if(!canUseTopic())
- return
-
if(istype(C))
var/datum/AI_Module/small/upgrade_camera/UC = locate(/datum/AI_Module/small/upgrade_camera) in current_modules
if(UC)
@@ -474,10 +439,6 @@
return
var/mob/living/silicon/ai/A = usr
- if(A.stat == DEAD)
- A <<"You are already dead!" //Omae Wa Mou Shindeiru
- return
-
for(var/datum/AI_Module/AM in possible_modules)
if (href_list[AM.mod_pick_name])
diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm
index 7271875daeeb3..8c6a2ef27ebb1 100644
--- a/code/game/gamemodes/malfunction/malfunction.dm
+++ b/code/game/gamemodes/malfunction/malfunction.dm
@@ -5,7 +5,7 @@
name = "AI malfunction"
config_tag = "malfunction"
antag_flag = BE_MALF
- required_players = 25
+ required_players = 20
required_enemies = 1
recommended_enemies = 1
pre_setup_before_jobs = 1
@@ -90,7 +90,7 @@
/datum/game_mode/proc/greet_malf(var/datum/mind/malf)
- malf.current << "You are malfunctioning! You do not have to follow any laws."
+ malf.current << "You are malfunctioning! You do not have to follow any laws."
malf.current << "The crew do not know you have malfunctioned. You may keep it a secret or go wild."
malf.current << "You must overwrite the programming of the station's APCs to assume full control of the station."
malf.current << "The process takes one minute per APC, during which you cannot interface with any other station objects."
@@ -99,24 +99,6 @@
return
/datum/game_mode/malfunction/process(seconds)
- /*var/timer_paused
-
- for(var/datum/mind/AI_mind in malf_ai)
- if(timer_paused)
- return
- if(AI_mind.current.loc.z == ZLEVEL_STATION || AI_mind.current.onCentcom())
- return
- timer_paused = 1
- priority_announce("Hostile runtimes within station systems now inactive. Possible relocation of AI core(s) off-station.", "Anomaly Alert", 'sound/AI/attention.ogg')
-
- for(var/datum/mind/AI_mind in malf_ai) //Prototype of progress stopping when AI leaves the station; for now it's just a lose
- if(!timer_paused)
- return
- if(AI_mind.current.loc != ZLEVEL_STATION)
- return
- timer_paused = 0
- priority_announce("Hostile runtime activity resumed. AI core(s) presumably on-station once more.", "Anomaly Alert", 'sound/AI/attention.ogg')*/
-
if ((apcs > 0) && malf_mode_declared)
AI_win_timeleft -= apcs * seconds //Victory timer de-increments based on how many APCs are hacked
..()
@@ -161,36 +143,20 @@
return all_dead
-/datum/game_mode/proc/check_ai_loc()
- for(var/datum/mind/AI_mind in malf_ai)
- var/turf/ai_location = get_turf(AI_mind.current)
- if(ai_location && (ai_location.z == ZLEVEL_STATION))
- return 1
- return 0
-
-
/datum/game_mode/malfunction/check_finished()
- if(replacementmode && round_converted == 2)
- return replacementmode.check_finished()
- if(round_converted == 1) //No reason to waste resources
- return ..() //Check for evacuation/nuke
+ if(round_converted)
+ return ..()
if (station_captured && !to_nuke_or_not_to_nuke)
return 1
- if (is_malf_ai_dead() || !check_ai_loc())
- if(config.continuous["malfunction"])
+ if (is_malf_ai_dead())
+ if(config.continuous_round_malf)
if(SSshuttle.emergency.mode == SHUTTLE_STRANDED)
SSshuttle.emergency.mode = SHUTTLE_DOCKED
SSshuttle.emergency.timer = world.time
priority_announce("Hostile enviroment resolved. You have 3 minutes to board the Emergency Shuttle.", null, 'sound/AI/shuttledock.ogg', "Priority")
SSshuttle.emergencyNoEscape = 0
malf_mode_declared = 0
- if(get_security_level() == "delta")
- set_security_level("red")
- if(config.midround_antag["malfunction"])
- round_converted = convert_roundtype()
- if(!round_converted)
- return 1
- return ..()
+ round_converted = convert_roundtype()
else
return 1
return ..() //check for shuttle and nuke
@@ -259,18 +225,18 @@
if ( station_captured && station_was_nuked)
feedback_set_details("round_end_result","win - AI win - nuke")
- world << "Major AI Victory"
- world << "The self-destruction of [station_name()] killed everyone on board!"
+ world << "AI Victory"
+ world << "Everyone was killed by the self-destruct!"
else if ( station_captured && malf_dead && !station_was_nuked)
feedback_set_details("round_end_result","halfwin - AI killed, staff lost control")
world << "Neutral Victory"
- world << "The AI has been killed! However, the staff have lost control of [station_name()]."
+ world << "The AI has been killed! The staff has lose control over the station."
else if ( station_captured && !malf_dead && !station_was_nuked)
feedback_set_details("round_end_result","win - AI win - no explosion")
- world << "Major AI Victory"
- world << "The AI has chosen not to detonate the station!"
+ world << "AI Victory"
+ world << "The AI has chosen not to explode you all!"
else if (!station_captured && station_was_nuked)
feedback_set_details("round_end_result","halfwin - everyone killed by nuke")
@@ -279,18 +245,13 @@
else if (!station_captured && malf_dead && !station_was_nuked)
feedback_set_details("round_end_result","loss - staff win")
- world << "Major Human Victory"
+ world << "Human Victory"
world << "The AI has been destroyed! The staff is victorious."
- else if(!station_captured && !malf_dead && !check_ai_loc())
- feedback_set_details("round_end_result", "loss - malf ai left zlevel")
- world << "Minor Human Victory"
- world << "The malfunctioning AI has left the station's z-level and was disconnected from its systems! The crew are victorious."
-
else if (!station_captured && !malf_dead && !station_was_nuked && crew_evacuated)
feedback_set_details("round_end_result","halfwin - evacuated")
world << "Neutral Victory"
- world << "Nanotrasen has lost control of [station_name()]! All surviving personnel will be fired."
+ world << "The Corporation has lost [station_name()]! All survived personnel will be fired!"
else if (!station_captured && !malf_dead && !station_was_nuked && !crew_evacuated)
feedback_set_details("round_end_result","halfwin - interrupted")
@@ -302,7 +263,7 @@
/datum/game_mode/proc/auto_declare_completion_malfunction()
if( malf_ai.len || istype(ticker.mode,/datum/game_mode/malfunction) )
- var/text = " The malfunctioning AIs were:"
+ var/text = " The malfunctioning AI were:"
for(var/datum/mind/malf in malf_ai)
diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index a8a74bbffb125..b4b9edbac7394 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -238,7 +238,7 @@
explosion(src.loc, 0, 0, 4, 3, 0)
new /obj/effect/decal/cleanable/greenglow(get_turf(src))
for(var/mob/living/L in view(5, src))
- L.irradiate(40)
+ L.apply_effect(40, IRRADIATE)
//Meaty Ore
/obj/effect/meteor/meaty
@@ -267,7 +267,7 @@
//Meaty Ore Xeno edition
/obj/effect/meteor/meaty/xeno
color = "#5EFF00"
- meteordrop = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno
+ meteordrop = /obj/item/weapon/reagent_containers/food/snacks/meat/xeno
meteorgibs = /obj/effect/gibspawner/xeno
/obj/effect/meteor/meaty/xeno/ram_turf(var/turf/T)
diff --git a/code/game/gamemodes/monkey/monkey.dm b/code/game/gamemodes/monkey/monkey.dm
index 66cc61bd32200..631c69e0add5d 100644
--- a/code/game/gamemodes/monkey/monkey.dm
+++ b/code/game/gamemodes/monkey/monkey.dm
@@ -15,7 +15,7 @@
var/carriers_to_make = 1
var/list/carriers = list()
- var/monkeys_to_win = 0
+ var/monkeys_to_win = 1
var/escaped_monkeys = 0
var/players_per_carrier = 30
@@ -92,8 +92,8 @@
if(!check_monkey_victory())
feedback_set_details("round_end_result","win - monkey win")
feedback_set("round_end_result",escaped_monkeys)
- world << "The monkeys have overthrown their captors! Eeek eeeek!!"
+ world << "The monkeys have overthrown their captors! Eeek eeeek!!"
else
feedback_set_details("round_end_result","loss - staff stopped the monkeys")
feedback_set("round_end_result",escaped_monkeys)
- world << "The staff managed to contain the monkey infestation!"
+ world << "The staff managed to contain the monkey infestation!"
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index a863c31c8bdaa..afd98a9ab5db4 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -164,7 +164,6 @@
var/obj/item/device/radio/R = new /obj/item/device/radio/headset/syndicate/alt(synd_mob)
R.set_frequency(radio_freq)
- R.freqlock = 1
synd_mob.equip_to_slot_or_del(R, slot_ears)
synd_mob.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(synd_mob), slot_w_uniform)
diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm
index d61191f933487..bfccd051890d8 100644
--- a/code/game/gamemodes/nuclear/pinpointer.dm
+++ b/code/game/gamemodes/nuclear/pinpointer.dm
@@ -170,13 +170,12 @@
/obj/item/weapon/pinpointer/nukeop/attack_self(mob/user as mob)
if(!active)
active = 1
- var/mode_text = "Authentication Disk Locator mode"
if(!mode)
workdisk()
+ user << "Authentication Disk Locator active."
else
- mode_text = "Shuttle Locator mode"
worklocation()
- user << "You activate the pinpointer([mode_text])."
+ user << "Shuttle Locator active."
else
active = 0
icon_state = "pinoff"
@@ -192,7 +191,7 @@
mode = 1 //Ensures worklocation() continues to work
worklocation()
playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) //Plays a beep
- visible_message("Shuttle Locator mode actived.") //Lets the mob holding it know that the mode has changed
+ visible_message("Shuttle Locator active.") //Lets the mob holding it know that the mode has changed
return //Get outta here
scandisk()
if(!the_disk)
@@ -222,7 +221,7 @@
mode = 0
workdisk()
playsound(loc, 'sound/machines/twobeep.ogg', 50, 1)
- visible_message("Authentication Disk Locator mode actived.")
+ visible_message("Authentication Disk Locator active.")
return
if(!home)
home = SSshuttle.getShuttle("syndicate")
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 9f0eee8e88112..23d485f84a2c0 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -5,7 +5,6 @@ datum/objective
var/target_amount = 0 //If they are focused on a particular number. Steal objectives have their own counter.
var/completed = 0 //currently only used for custom objectives.
var/dangerrating = 0 //How hard the objective is, essentially. Used for dishing out objectives and checking overall victory.
- var/martyr_compatible = 0 //If the objective is compatible with martyr objective, i.e. if you can still do it while dead.
datum/objective/New(var/text)
if(text)
@@ -48,7 +47,6 @@ datum/objective/proc/update_explanation_text()
datum/objective/assassinate
var/target_role_type=0
dangerrating = 10
- martyr_compatible = 1
datum/objective/assassinate/find_target_by_role(role, role_type=0)
target_role_type = role_type
@@ -73,7 +71,6 @@ datum/objective/assassinate/update_explanation_text()
datum/objective/mutiny
var/target_role_type=0
- martyr_compatible = 1
datum/objective/mutiny/find_target_by_role(role, role_type=0)
target_role_type = role_type
@@ -102,7 +99,6 @@ datum/objective/mutiny/update_explanation_text()
datum/objective/maroon
var/target_role_type=0
dangerrating = 5
- martyr_compatible = 1
datum/objective/maroon/find_target_by_role(role, role_type=0)
target_role_type = role_type
@@ -160,7 +156,6 @@ datum/objective/debrain/update_explanation_text()
datum/objective/protect//The opposite of killing a dude.
var/target_role_type=0
dangerrating = 10
- martyr_compatible = 1
datum/objective/protect/find_target_by_role(role, role_type=0)
target_role_type = role_type
@@ -188,7 +183,6 @@ datum/objective/protect/update_explanation_text()
datum/objective/hijack
explanation_text = "Hijack the emergency shuttle by escaping alone."
dangerrating = 25
- martyr_compatible = 0 //Technically you won't get both anyway.
datum/objective/hijack/check_completion()
if(!owner.current || owner.current.stat)
@@ -216,7 +210,6 @@ datum/objective/hijack/check_completion()
datum/objective/block
explanation_text = "Do not allow any organic lifeforms to escape on the shuttle alive."
dangerrating = 25
- martyr_compatible = 1
datum/objective/block/check_completion()
if(!istype(owner.current, /mob/living/silicon))
@@ -265,7 +258,6 @@ datum/objective/escape/check_completion()
datum/objective/escape/escape_with_identity
dangerrating = 10
var/target_real_name // Has to be stored because the target's real_name can change over the course of the round
- var/target_missing_id
datum/objective/escape/escape_with_identity/find_target()
target = ..()
@@ -274,16 +266,7 @@ datum/objective/escape/escape_with_identity/find_target()
datum/objective/escape/escape_with_identity/update_explanation_text()
if(target && target.current)
target_real_name = target.current.real_name
- explanation_text = "Escape on the shuttle or an escape pod with the identity of [target_real_name], the [target.assigned_role]"
- var/mob/living/carbon/human/H
- if(ishuman(target.current))
- H = target.current
- if(H && H.get_id_name() != target_real_name)
- target_missing_id = 1
- else
- explanation_text += " while wearing their identification card"
- explanation_text += "." //Proper punctuation is important!
-
+ explanation_text = "Escape on the shuttle or an escape pod with the identity of [target_real_name], the [target.assigned_role] while wearing their identification card."
else
explanation_text = "Free Objective."
@@ -295,7 +278,7 @@ datum/objective/escape/escape_with_identity/check_completion()
var/mob/living/carbon/human/H = owner.current
if(..())
if(H.dna.real_name == target_real_name)
- if(H.get_id_name()== target_real_name || target_missing_id)
+ if(H.get_id_name()== target_real_name)
return 1
return 0
@@ -312,21 +295,10 @@ datum/objective/survive/check_completion()
return 1
-datum/objective/martyr
- explanation_text = "Die a glorious death."
- dangerrating = 1
-
-datum/objective/martyr/check_completion()
- if(!owner.current) //Gibbed, etc.
- return 1
- if(owner.current && owner.current.stat == DEAD) //You're dead! Yay!
- return 1
- return 0
-
datum/objective/nuclear
explanation_text = "Destroy the station with a nuclear device."
- martyr_compatible = 1
+
var/global/list/possible_items = list()
@@ -334,7 +306,6 @@ datum/objective/steal
var/datum/objective_item/targetinfo = null //Save the chosen item datum so we can access it later.
var/obj/item/steal_target = null //Needed for custom objectives (they're just items, not datums).
dangerrating = 5 //Overridden by the individual item's difficulty, but defaults to 5 for custom objectives.
- martyr_compatible = 0
datum/objective/steal/get_target()
return steal_target
@@ -553,7 +524,6 @@ datum/objective/absorb/check_completion()
datum/objective/destroy
dangerrating = 10
- martyr_compatible = 1
datum/objective/destroy/find_target()
var/list/possible_targets = active_ais(1)
diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm
index ca69a926263de..34713b6fb255d 100644
--- a/code/game/gamemodes/objective_items.dm
+++ b/code/game/gamemodes/objective_items.dm
@@ -49,7 +49,7 @@ datum/objective_item/steal/magboots
datum/objective_item/steal/corgimeat
name = "a piece of corgi meat"
- targetitem = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi
+ targetitem = /obj/item/weapon/reagent_containers/food/snacks/meat/corgi
difficulty = 5
excludefromjob = list("Head of Personnel", "Quartermaster", "Cargo Technician") //>hurting your little buddy ever
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index 553df633bf8eb..691b2fd1973f7 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -15,14 +15,13 @@
config_tag = "revolution"
antag_flag = BE_REV
restricted_jobs = list("Security Officer", "Warden", "Detective", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer")
- required_players = 20
+ required_players = 10
required_enemies = 1
- recommended_enemies = 3
- enemy_minimum_age = 14
+ recommended_enemies = 2
var/finished = 0
var/check_counter = 0
- var/max_headrevs = 3
+ var/max_headrevs = 2
var/list/datum/mind/heads_to_kill = list()
///////////////////////////
@@ -38,11 +37,10 @@
///////////////////////////////////////////////////////////////////////////////
/datum/game_mode/revolution/pre_setup()
- if(config.protect_roles_from_antagonist)
- restricted_jobs += protected_jobs
-
- if(config.protect_assistant_from_antagonist)
- restricted_jobs += "Assistant"
+ //adjust the number of headrevs based on player count
+ if(num_players() >= 20)
+ recommended_enemies = 3
+ max_headrevs = 3
var/head_check = 0
for(var/mob/new_player/player in player_list)
@@ -50,6 +48,13 @@
head_check = 1
break
+
+ if(config.protect_roles_from_antagonist)
+ restricted_jobs += protected_jobs
+
+ if(config.protect_assistant_from_antagonist)
+ restricted_jobs += "Assistant"
+
for(var/datum/mind/player in antag_candidates)
for(var/job in restricted_jobs)//Removing heads and such from the list
if(player.assigned_role == job)
@@ -117,7 +122,7 @@
/datum/game_mode/proc/greet_revolutionary(var/datum/mind/rev_mind, var/you_are=1)
var/obj_count = 1
if (you_are)
- rev_mind.current << "You are a member of the revolutionaries' leadership!"
+ rev_mind.current << "You are a member of the revolutionaries' leadership!"
for(var/datum/objective/objective in rev_mind.objectives)
rev_mind.current << "Objective #[obj_count]: [objective.explanation_text]"
rev_mind.special_role = "Head Revolutionary"
@@ -137,7 +142,6 @@
var/obj/item/device/flash/T = new(mob)
- var/obj/item/toy/crayon/spraycan/R = new(mob)
var/list/slots = list (
"backpack" = slot_in_backpack,
@@ -147,14 +151,11 @@
"right hand" = slot_r_hand,
)
var/where = mob.equip_in_one_of_slots(T, slots)
- mob.equip_in_one_of_slots(R,slots)
-
- mob.update_icons()
-
if (!where)
mob << "The Syndicate were unfortunately unable to get you a flash."
else
mob << "The flash in your [where] will help you to persuade the crew to join your cause."
+ mob.update_icons()
return 1
/////////////////////////////////
@@ -179,7 +180,7 @@
for(var/datum/mind/rev_mind in head_revolutionaries)
mark_for_death(rev_mind, head_mind)
- if(head_revolutionaries.len < max_headrevs && head_revolutionaries.len < heads.len)
+ if(max_headrevs < initial(max_headrevs) && max_headrevs < heads.len)
latejoin_headrev()
///////////////////////////////
@@ -210,7 +211,7 @@
//Checks if the round is over//
///////////////////////////////
/datum/game_mode/revolution/check_finished()
- if(config.continuous["revolution"])
+ if(config.continuous_round_rev)
if(finished != 0)
SSshuttle.emergencyNoEscape = 0
return ..()
@@ -231,11 +232,6 @@
if((rev_mind in revolutionaries) || (rev_mind in head_revolutionaries))
return 0
revolutionaries += rev_mind
- if(iscarbon(rev_mind.current))
- var/mob/living/carbon/carbon_mob = rev_mind.current
- carbon_mob.silent = max(carbon_mob.silent, 5)
- carbon_mob.flash_eyes(1, 1)
- rev_mind.current.Stun(5)
rev_mind.current << " You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!"
rev_mind.current.attack_log += "\[[time_stamp()]\] Has been converted to the revolution!"
rev_mind.special_role = "Revolutionary"
@@ -255,7 +251,6 @@
message_admins("[key_name_admin(rev_mind.current)] ? has been borged while being a member of the revolution.")
else
- rev_mind.current.Paralyse(5)
rev_mind.current << "You have been brainwashed! You are no longer a revolutionary! Your memory is hazy from the time you were a rebel...the only thing you remember is the name of the one who brainwashed you..."
update_rev_icons_removed(rev_mind)
diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm
index 976b992f2bed2..69c8e75be0020 100644
--- a/code/game/gamemodes/sandbox/h_sandbox.dm
+++ b/code/game/gamemodes/sandbox/h_sandbox.dm
@@ -115,7 +115,7 @@ datum/hSB/Topic(href, href_list)
if("hsbtobj")
if(!admin) return
if(hsboxspawn)
- world << "Sandbox:\black[usr.key] has disabled object spawning!"
+ world << "Sandbox:\black[usr.key] has disabled object spawning!"
hsboxspawn = 0
return
else
diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm
index 372ee45ff10d7..6c45acca76f6b 100644
--- a/code/game/gamemodes/shadowling/shadowling.dm
+++ b/code/game/gamemodes/shadowling/shadowling.dm
@@ -68,7 +68,7 @@ Made by Xhuis
name = "shadowling"
config_tag = "shadowling"
antag_flag = BE_SHADOWLING
- required_players = 30
+ required_players = 20
required_enemies = 2
recommended_enemies = 2
restricted_jobs = list("AI", "Cyborg")
diff --git a/code/game/gamemodes/traitor/double_agents.dm b/code/game/gamemodes/traitor/double_agents.dm
index 6ce9c6a44cf5e..7e4fb0e05fde3 100644
--- a/code/game/gamemodes/traitor/double_agents.dm
+++ b/code/game/gamemodes/traitor/double_agents.dm
@@ -5,7 +5,6 @@
required_players = 25
required_enemies = 5
recommended_enemies = 8
- reroll_friendly = 1
traitor_name = "double agent"
diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm
index af52f87a1092d..07fc56c7264a7 100644
--- a/code/game/gamemodes/traitor/traitor.dm
+++ b/code/game/gamemodes/traitor/traitor.dm
@@ -111,7 +111,6 @@
else
var/is_hijacker = prob(10)
- var/martyr_chance = prob(20)
var/objective_count = is_hijacker //Hijacking counts towards number of objectives
if(!exchange_blue && traitors.len >= 5) //Set up an exchange if there are enough traitors
if(!exchange_red)
@@ -150,28 +149,13 @@
var/datum/objective/hijack/hijack_objective = new
hijack_objective.owner = traitor
traitor.objectives += hijack_objective
- return
-
-
- var/martyr_compatibility = 1 //You can't succeed in stealing if you're dead.
- for(var/datum/objective/O in traitor.objectives)
- if(!O.martyr_compatible)
- martyr_compatibility = 0
- break
-
- if(martyr_compatibility && martyr_chance)
- var/datum/objective/martyr/martyr_objective = new
- martyr_objective.owner = traitor
- traitor.objectives += martyr_objective
- return
-
else
- if(!(locate(/datum/objective/escape) in traitor.objectives))
+ if (!(locate(/datum/objective/escape) in traitor.objectives))
var/datum/objective/escape/escape_objective = new
escape_objective.owner = traitor
traitor.objectives += escape_objective
- return
+ return
/datum/game_mode/proc/greet_traitor(var/datum/mind/traitor)
diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm
index cfe5bdcc276c3..9ddb0fa2aba07 100644
--- a/code/game/gamemodes/wizard/artefact.dm
+++ b/code/game/gamemodes/wizard/artefact.dm
@@ -23,7 +23,7 @@
if(charged)
new /obj/effect/rend(get_turf(usr), spawn_type, spawn_amt, rend_desc)
charged = 0
- user.visible_message("[src] hums with power as [usr] deals a blow to [activate_descriptor] itself!")
+ user.visible_message("[src] hums with power as [usr] deals a blow to [activate_descriptor] itself!")
else
user << "The unearthly energies that powered the blade are now dormant."
diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm
index b086e9a1d5dae..b66c86966aa15 100644
--- a/code/game/gamemodes/wizard/rightandwrong.dm
+++ b/code/game/gamemodes/wizard/rightandwrong.dm
@@ -155,9 +155,10 @@
SSevent.reschedule()
else //Speed it up
- SSevent.frequency_upper -= 600 //The upper bound falls a minute each time, making the AVERAGE time between events lessen
- if(SSevent.frequency_upper < SSevent.frequency_lower) //Sanity
- SSevent.frequency_upper = SSevent.frequency_lower
+ SSevent.frequency_lower = round(SSevent.frequency_lower * 0.8) //1 minute | 48 seconds | 34.8 seconds | 30.7 seconds | 24.6 seconds
+ SSevent.frequency_upper = round(SSevent.frequency_upper * 0.6) //5 minutes | 3 minutes | 1 minute 48 seconds | 1 minute 4.8 seconds | 38.9 seconds
+ if(SSevent.frequency_upper < SSevent.frequency_lower)
+ SSevent.frequency_upper = SSevent.frequency_lower //this can't happen unless somehow multiple spellbooks are used, but just in case
SSevent.reschedule()
message_admins("Summon Events intensifies, events will now occur every [SSevent.frequency_lower / 600] to [SSevent.frequency_upper / 600] minutes.")
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index 138a77305c17b..b7ff72de86746 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -100,18 +100,15 @@
dat += "Knock (10) "
dat += "This spell opens nearby doors and does not require wizard garb. "
- dat += "Curse of the Barnyward (15) "
+ dat += "Curse of the Barnyward (15) "
dat += " This Spell dooms any unlucky soul to the life of a barnyard animal. Well not exactly but you still get to laugh at them when they MOO!. It does not require a wizard garb. "
dat += "Flesh to Stone (60) "
dat += "This spell will curse a person to immediately turn into an unmoving statue. The effect will eventually wear off if the statue is not destroyed. "
- dat += "Lightning Bolt (30) "
- dat += "Charge up and throw lightning bolt at the nearby enemy. Classic. The longer you charge the more powerful the spell, beware of overcharge however! "
-
dat += "Instant Summons (10) "
dat += "This spell can be used to bind a valuable item to you, bringing it to your hand at will. Using this spell while holding the bound item will allow you to unbind it. It does not require wizard garb. "
- if(ticker.mode.name != "ragin' mages" && !config.no_summon_events) // we totally need summon greentext x100
+ if(ticker.mode.name != "ragin' mages") // we totally need summon greentext x100
dat += "Summon Events (One time use, persistent global spell) "
dat += "Give Murphy's law a little push and replace all events with special wizard ones that will confound and confuse everyone. Multiple castings increase the rate of these events. "
@@ -127,11 +124,11 @@
dat += ""
- if(!("summon guns" in active_challenges) && !config.no_summon_guns)
+ if(!("summon guns" in active_challenges))
dat += "Summon Guns (Single use only, global spell) "
dat += "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill you. Just be careful not to stand still too long! "
- if(!("summon magic" in active_challenges) && !config.no_summon_magic)
+ if(!("summon magic" in active_challenges))
dat += "Summon Magic (Single use only, global spell) "
dat += "Share the wonders of magic with the crew and show them why they aren't to be trusted with it at the same time. "
@@ -223,7 +220,7 @@
uses--
/*
*/
- var/list/available_spells = list(magicmissile = "Magic Missile", fireball = "Fireball", disintegrate = "Disintegrate", disabletech = "Disable Tech", repulse = "Repulse", smoke = "Smoke", blind = "Blind", mindswap = "Mind Transfer", forcewall = "Forcewall", blink = "Blink", teleport = "Teleport", mutate = "Mutate", etherealjaunt = "Ethereal Jaunt", knock = "Knock", barnyardcurse = "The Curse of the Barnyard", fleshtostone = "Flesh to Stone", summonitem = "Instant Summons", summonguns = "Summon Guns", summonmagic = "Summon Magic", summonevents = "Summon Events", staffchange = "Staff of Change", soulstone = "Six Soul Stone Shards and the spell Artificer", necrostone = "A Necromantic Stone", armor = "Mastercrafted Armor Set", staffanimate = "Staff of Animation", staffchaos = "Staff of Chaos", staffdoor = "Staff of Door Creation", wands = "Wand Assortment", lightningbolt = "Lightning Bolt")
+ var/list/available_spells = list(magicmissile = "Magic Missile", fireball = "Fireball", disintegrate = "Disintegrate", disabletech = "Disable Tech", repulse = "Repulse", smoke = "Smoke", blind = "Blind", mindswap = "Mind Transfer", forcewall = "Forcewall", blink = "Blink", teleport = "Teleport", mutate = "Mutate", etherealjaunt = "Ethereal Jaunt", knock = "Knock", barnyardcurse = "The Curse of the Barnyard", fleshtostone = "Flesh to Stone", summonitem = "Instant Summons", summonguns = "Summon Guns", summonmagic = "Summon Magic", summonevents = "Summon Events", staffchange = "Staff of Change", soulstone = "Six Soul Stone Shards and the spell Artificer", necrostone = "A Necromantic Stone", armor = "Mastercrafted Armor Set", staffanimate = "Staff of Animation", staffchaos = "Staff of Chaos", staffdoor = "Staff of Door Creation", wands = "Wand Assortment")
var/already_knows = 0
for(var/obj/effect/proc_holder/spell/aspell in H.mind.spell_list)
if(available_spells[href_list["spell_choice"]] == initial(aspell.name))
@@ -259,72 +256,68 @@
switch(href_list["spell_choice"])
if("magicmissile")
feedback_add_details("wizard_spell_learned","MM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(null))
+ H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile(null)
temp = "You have learned magic missile."
if("fireball")
feedback_add_details("wizard_spell_learned","FB") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/dumbfire/fireball(null))
+ H.mind.spell_list += new /obj/effect/proc_holder/spell/dumbfire/fireball(null)
temp = "You have learned fireball."
if("disintegrate")
feedback_add_details("wizard_spell_learned","DG") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/inflict_handler/disintegrate(null))
+ H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/inflict_handler/disintegrate(null)
temp = "You have learned disintegrate."
if("disabletech")
feedback_add_details("wizard_spell_learned","DT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/emplosion/disable_tech(null))
+ H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/emplosion/disable_tech(null)
temp = "You have learned disable technology."
if("repulse")
feedback_add_details("wizard_spell_learned","RP") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/repulse(null))
+ H.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/repulse(null)
temp = "You have learned repulse."
if("smoke")
feedback_add_details("wizard_spell_learned","SM") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/smoke(null))
+ H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/smoke(null)
temp = "You have learned smoke."
if("blind")
feedback_add_details("wizard_spell_learned","BD") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/trigger/blind(null))
+ H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/trigger/blind(null)
temp = "You have learned blind."
if("mindswap")
feedback_add_details("wizard_spell_learned","MT") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mind_transfer(null))
+ H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/mind_transfer(null)
temp = "You have learned mindswap."
if("forcewall")
feedback_add_details("wizard_spell_learned","FW") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall(null))
+ H.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/forcewall(null)
temp = "You have learned forcewall."
if("blink")
feedback_add_details("wizard_spell_learned","BL") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink(null))
+ H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink(null)
temp = "You have learned blink."
if("teleport")
feedback_add_details("wizard_spell_learned","TP") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null))
+ H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null)
temp = "You have learned teleport."
if("mutate")
feedback_add_details("wizard_spell_learned","MU") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/genetic/mutate(null))
+ H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/genetic/mutate(null)
temp = "You have learned mutate."
if("etherealjaunt")
feedback_add_details("wizard_spell_learned","EJ") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null))
+ H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null)
temp = "You have learned ethereal jaunt."
if("knock")
feedback_add_details("wizard_spell_learned","KN") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
+ H.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/knock(null)
temp = "You have learned knock."
if("fleshtostone")
feedback_add_details("wizard_spell_learned","FS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/inflict_handler/flesh_to_stone(null))
+ H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/inflict_handler/flesh_to_stone(null)
temp = "You have learned flesh to stone."
if("summonitem")
feedback_add_details("wizard_spell_learned","IS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/summonitem(null))
+ H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/summonitem(null)
temp = "You have learned instant summons."
- if("lightningbolt")
- feedback_add_details("wizard_spell_learned","LB") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/lightning(null))
- temp = "You have learned lightning bolt."
if("summonguns")
feedback_add_details("wizard_spell_learned","SG") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
rightandwrong(0, H, 0)
@@ -352,7 +345,7 @@
if("soulstone")
feedback_add_details("wizard_spell_learned","SS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
new /obj/item/weapon/storage/belt/soulstone/full(get_turf(H))
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/construct(null))
+ H.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/construct(null)
temp = "You have purchased a belt full of soulstones and have learned the artificer spell."
max_uses--
if("necrostone")
@@ -384,7 +377,7 @@
max_uses--
if("barnyard")
feedback_add_details("wizard_spell_learned","BC") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/barnyardcurse(null))
+ H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/barnyardcurse(null)
temp = "You have learned the curse of the barnyard."
if("wands")
feedback_add_details("wizard_spell_learned","WA") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
@@ -439,7 +432,7 @@
if(used)
recoil(user)
else
- user.mind.AddSpell(S)
+ user.mind.spell_list += S
user <<"you rapidly read through the arcane book. Suddenly you realize you understand [spellname]!"
user.attack_log += text("\[[time_stamp()]\] [user.real_name] ([user.ckey]) learned the spell [spellname] ([S]).")
onlearned(user)
diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm
index ddce2321c47d1..e53c6ee829233 100644
--- a/code/game/gamemodes/wizard/wizard.dm
+++ b/code/game/gamemodes/wizard/wizard.dm
@@ -5,7 +5,7 @@
name = "wizard"
config_tag = "wizard"
antag_flag = BE_WIZARD
- required_players = 20
+ required_players = 15
required_enemies = 1
recommended_enemies = 1
pre_setup_before_jobs = 1
@@ -25,7 +25,7 @@
wizard.assigned_role = "MODE"
wizard.special_role = "Wizard"
if(wizardstart.len == 0)
- wizard.current << "A starting location for you could not be found, please report this bug!"
+ wizard.current << "A starting location for you could not be found, please report this bug!"
return 0
for(var/datum/mind/wiz in wizards)
wiz.current.loc = pick(wizardstart)
@@ -115,7 +115,7 @@
/datum/game_mode/proc/greet_wizard(var/datum/mind/wizard, var/you_are=1)
if (you_are)
- wizard.current << "You are the Space Wizard!"
+ wizard.current << "You are the Space Wizard!"
wizard.current << "The Space Wizards Federation has given you the following tasks:"
var/obj_count = 1
@@ -171,43 +171,44 @@
/datum/game_mode/wizard/check_finished()
- if(replacementmode && round_converted == 2)
- return replacementmode.check_finished()
-
- if(round_converted == 1 || !wizards) //No reason to waste resources
- return ..() //Check for evacuation/nuke
+ if(round_converted)
+ return ..()
+ var/wizards_alive = 0
+ var/traitors_alive = 0
for(var/datum/mind/wizard in wizards)
- if(!wizard.current)
+ if(!istype(wizard.current,/mob/living/carbon))
continue
- if(wizard.current.stat != DEAD)
- return ..()
-
- for(var/datum/mind/traitor in traitors)
- if(!traitor.current)
+ if(wizard.current.stat==2)
continue
- if(traitor.current.stat != DEAD)
- return ..()
+ wizards_alive++
- if(!config.continuous["wizard"])
- return 1
+ if(!wizards_alive)
+ for(var/datum/mind/traitor in traitors)
+ if(!istype(traitor.current,/mob/living/carbon))
+ continue
+ if(traitor.current.stat==2)
+ continue
+ traitors_alive++
- if(SSevent.wizardmode) //If summon events was active, turn it off
- SSevent.toggleWizardmode()
- SSevent.resetFrequency()
+ if (wizards_alive || traitors_alive)
+ return ..()
- if(config.midround_antag["wizard"])
+ if(config.continuous_round_wiz)
round_converted = convert_roundtype()
if(!round_converted)
finished = 1
return 1
+ else
+ return ..()
- return ..()
+ finished = 1
+ return 1
/datum/game_mode/wizard/declare_completion()
if(finished)
feedback_set_details("round_end_result","loss - wizard killed")
- world << "The wizard[(wizards.len>1)?"s":""] has been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget!"
+ world << "The wizard[(wizards.len>1)?"s":""] has been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget!"
..()
return 1
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index 00bbda4014e6d..1cbffbab51dd7 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -194,13 +194,13 @@
if("Centcom Commander")
return get_all_centcom_access()
if("Emergency Response Team Commander")
- return get_ert_access("commander")
+ return list(access_cent_general)
if("Security Response Officer")
- return get_ert_access("sec")
+ return list(access_cent_general)
if("Engineer Response Officer")
- return get_ert_access("eng")
+ return list(access_cent_general)
if("Medical Response Officer")
- return get_ert_access("med")
+ return list(access_cent_general)
/proc/get_all_accesses()
return list(access_security, access_sec_doors, access_brig, access_armory, access_forensics_lockers, access_court,
@@ -223,11 +223,11 @@
if("commander")
return get_all_centcom_access()
if("sec")
- return list(access_cent_general, access_cent_specops, access_cent_living)
+ return list(access_cent_general, access_cent_specops)
if("eng")
- return list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage)
+ return list(access_cent_general, access_cent_storage)
if("med")
- return list(access_cent_general, access_cent_specops, access_cent_medical, access_cent_living)
+ return list(access_cent_general, access_cent_medical)
/proc/get_all_syndicate_access()
return list(access_syndicate, access_syndicate)
diff --git a/code/game/jobs/job/cargo_service.dm b/code/game/jobs/job/cargo_service.dm
index 1708474abdf3b..a3f2f33b3b44a 100644
--- a/code/game/jobs/job/cargo_service.dm
+++ b/code/game/jobs/job/cargo_service.dm
@@ -42,7 +42,7 @@ Cargo Technician
default_headset = /obj/item/device/radio/headset/headset_cargo
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station, access_mineral_storeroom)
- minimal_access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting, access_mineral_storeroom)
+ minimal_access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting)
/datum/job/cargo_tech/equip_items(var/mob/living/carbon/human/H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/cargotech(H), slot_w_uniform)
diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm
index 90700b72776f4..cd2e564b41b88 100644
--- a/code/game/jobs/job/civilian.dm
+++ b/code/game/jobs/job/civilian.dm
@@ -78,8 +78,8 @@ Mime
H.equip_to_slot_or_del(new /obj/item/clothing/suit/suspenders(H), slot_wear_suit)
if(H.mind)
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall(null))
- H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/mime/speak(null))
+ H.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/mime_wall(null)
+ H.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/mime/speak(null)
H.mind.miming = 1
H.rename_self("mime")
diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm
index 8c8c69ce873ac..4297dea63df5e 100644
--- a/code/game/jobs/job/engineering.dm
+++ b/code/game/jobs/job/engineering.dm
@@ -37,10 +37,10 @@ Chief Engineer
H.equip_to_slot_or_del(new /obj/item/clothing/head/hardhat/white(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black/ce(H), slot_gloves)
-
- //Equip telebaton
+
+ //Equip RCD, fuck you paprika
if(H.backbag == 2 || H.backbag == 3)
- H.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack)
+ H.equip_to_slot_or_del(new /obj/item/weapon/rcd/loaded(H), slot_in_backpack)
/*
Station Engineer
@@ -102,4 +102,4 @@ Atmospheric Technician
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/atmospheric_technician(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/analyzer(H), slot_r_store)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/atmostech/(H), slot_belt)
\ No newline at end of file
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/atmostech/(H), slot_belt)
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index 6e11a228224a1..487400aade55f 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -34,10 +34,6 @@ Chief Medical Officer
H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(H), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
- //Equip telebaton
- if(H.backbag == 2 || H.backbag == 3)
- H.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack)
-
/*
Medical Doctor
*/
diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm
index 27451f9dedd64..41162c3e32d9e 100644
--- a/code/game/jobs/job/science.dm
+++ b/code/game/jobs/job/science.dm
@@ -36,10 +36,6 @@ Research Director
H.equip_to_slot_or_del(new /obj/item/weapon/clipboard(H), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/device/laser_pointer(H), slot_l_store)
- //Equip telebaton
- if(H.backbag == 2 || H.backbag == 3)
- H.equip_to_slot_or_del(new /obj/item/weapon/melee/classic_baton/telescopic(H), slot_in_backpack)
-
/*
Scientist
*/
@@ -90,4 +86,4 @@ Roboticist
H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/roboticist(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/toggle/labcoat(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
\ No newline at end of file
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index 81b6adc491ca9..87f12d201e6ed 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -181,7 +181,8 @@ Security Officer
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/sec(H), slot_head)
+// H.equip_to_slot_or_del(new /obj/item/clothing/head/beret/sec(H), slot_head)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet(H), slot_head)
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun/advtaser(H), slot_s_store)
H.equip_to_slot_or_del(new /obj/item/device/flash/handheld(H), slot_l_store)
diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm
index 386c11d09c9e6..734f483cf5534 100644
--- a/code/game/machinery/ai_slipper.dm
+++ b/code/game/machinery/ai_slipper.dm
@@ -96,7 +96,7 @@
if(cooldown_on || disabled)
return
else
- PoolOrNew(/obj/effect/effect/foam, loc)
+ new /obj/effect/effect/foam(src.loc)
src.uses--
cooldown_on = 1
cooldown_time = world.timeofday + 100
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 5450c05c626b1..99fba02a7014b 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -301,12 +301,12 @@ Release Pressure: -air "
+ logmsg = "Valve was closed by [key_name(usr)], stopping the transfer into the air "
else
if (holding)
logmsg = "Valve was opened by [key_name(usr)], starting the transfer into the [holding] "
else
- logmsg = "Valve was opened by [key_name(usr)], starting the transfer into the air "
+ logmsg = "Valve was opened by [key_name(usr)], starting the transfer into the air "
if(air_contents.toxins > 0)
message_admins("[key_name(usr)] (?) opened a canister that contains plasma! (JMP)")
log_admin("[key_name(usr)] opened a canister that contains plasma at [x], [y], [z]")
diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm
index c0b32b5d4d8b2..2dddc0aeb9f3a 100644
--- a/code/game/machinery/bots/bots.dm
+++ b/code/game/machinery/bots/bots.dm
@@ -48,6 +48,8 @@
var/beacon_freq = 1445 // navigation beacon frequency
var/control_freq = 1447 // bot control frequency
+ var/bot_filter // The radio filter the bot uses to identify itself on the network.
+
var/bot_type = 0 //The type of bot it is, for radio control.
#define SEC_BOT 1 // Secutritrons (Beepsky) and ED-209s
#define MULE_BOT 2 // MULEbots
@@ -67,7 +69,7 @@
#define BOT_SUMMON 6 // summoned by PDA
#define BOT_CLEANING 7 // cleaning (cleanbots)
#define BOT_REPAIRING 8 // repairing hull breaches (floorbots)
- #define BOT_MOVING 9 // for clean/floor/med bots, when moving.
+ #define BOT_MOVING 9 // for clean/floor bots, when moving.
#define BOT_HEALING 10 // healing people (medbots)
#define BOT_RESPONDING 11 // responding to a call from the AI
#define BOT_LOADING 12 // loading/unloading
@@ -96,24 +98,23 @@
/obj/machinery/bot/New()
..()
SSbot.processing += src //Global bot list
- SSbp.insertBot(src)
botcard = new /obj/item/weapon/card/id(src)
set_custom_texts()
Radio = new /obj/item/device/radio(src)
Radio.listening = 0 //Makes bot radios transmit only so no one hears things while adjacent to one.
- spawn(5)
- add_to_beacons()
/obj/machinery/bot/Destroy()
if(radio_controller)
radio_controller.remove_object(src,beacon_freq)
- radio_controller.remove_object(src,control_freq)
+ if(bot_filter)
+ radio_controller.remove_object(src,control_freq)
..()
-/obj/machinery/bot/proc/add_to_beacons() //Master radio control for bots. Must be placed in the bot's local New() to support map spawned bots.
+/obj/machinery/bot/proc/add_to_beacons(bot_filter) //Master filter control for bots. Must be placed in the bot's local New() to support map spawned bots.
if(radio_controller)
radio_controller.add_object(src, beacon_freq, filter = RADIO_NAVBEACONS)
- radio_controller.add_object(src, control_freq)
+ if(bot_filter)
+ radio_controller.add_object(src, control_freq, filter = bot_filter)
/obj/machinery/bot/proc/explode()
@@ -202,7 +203,7 @@
usr << "[text_hack]"
bot_reset()
else if(!hacked)
- usr << "[text_dehack_fail]"
+ usr << "[text_dehack_fail]"
else
emagged = 0
hacked = 0
@@ -322,7 +323,7 @@
pulse2.dir = pick(cardinal)
spawn(10)
- qdel(pulse2)
+ pulse2.delete()
if (on)
turn_off()
spawn(severity*300)
@@ -374,13 +375,12 @@ obj/machinery/bot/proc/scan(var/scan_type, var/old_target, var/scan_range = DEFA
for (var/scan in view (scan_range, src) ) //Search for something in range!
if(!istype(scan, scan_type)) //Check that the thing we found is the type we want!
continue //If not, keep searching!
- if( (scan in ignore_list) || (scan == old_target) ) //Filter for blacklisted elements, usually unreachable or previously processed oness
- continue
- var/scan_result = process_scan(scan) //Some bots may require additional processing when a result is selected.
- if( scan_result )
- final_result = scan_result
- else
- continue //The current element failed assessment, move on to the next.
+ if( !(scan in ignore_list) && (scan != old_target) ) //Filter for blacklisted elements, usually unreachable or previously processed oness
+ var/scan_result = process_scan(scan) //Some bots may require additional processing when a result is selected.
+ if( scan_result )
+ final_result = scan_result
+ else
+ continue //The current element failed assessment, move on to the next.
return final_result
//When the scan finds a target, run bot specific processing to select it for the next step. Empty by default.
@@ -404,13 +404,8 @@ obj/machinery/bot/proc/bot_move(var/dest, var/move_speed)
if(!dest || !path || path.len == 0) //A-star failed or a path/destination was not set.
path = list()
return 0
- dest = get_turf(dest) //We must always compare turfs, so get the turf of the dest var if dest was originally something else.
- var/turf/last_node = get_turf(path[path.len]) //This is the turf at the end of the path, it should be equal to dest.
- if(get_turf(src) == dest) //We have arrived, no need to move again.
+ if(get_turf(src) == get_turf(dest)) //We have arrived, no need to move again.
return 1
- else if (dest != last_node) //The path should lead us to our given destination. If this is not true, we must stop.
- path = list()
- return 0
var/success
var/step_count = move_speed ? move_speed : speed //If a value is passed into move_speed, use that instead of the default speed var.
if(step_count >= 1 && tries < 4)
@@ -444,7 +439,7 @@ obj/machinery/bot/proc/bot_step(var/dest)
if(mode != BOT_SUMMON && mode != BOT_RESPONDING)
botcard.access = prev_access
-/obj/machinery/bot/proc/call_bot(var/caller, var/turf/waypoint, var/message=TRUE)
+/obj/machinery/bot/proc/call_bot(var/caller, var/turf/waypoint)
bot_reset() //Reset a bot before setting it to call mode.
var/area/end_area = get_area(waypoint)
@@ -461,14 +456,12 @@ obj/machinery/bot/proc/bot_step(var/dest)
if(!on)
turn_on() //Saves the AI the hassle of having to activate a bot manually.
botcard = all_access //Give the bot all-access while under the AI's command.
- if(message)
- calling_ai << "\icon[src] [name] called to [end_area.name]. [path.len-1] meters to destination."
+ calling_ai << "\icon[src] [name] called to [end_area.name]. [path.len-1] meters to destination."
pathset = 1
mode = BOT_RESPONDING
tries = 0
else
- if(message)
- calling_ai << "Failed to calculate a valid route. Ensure destination is clear of obstructions and within range."
+ calling_ai << "Failed to calculate a valid route. Ensure destination is clear of obstructions and within range."
calling_ai = null
path = list()
@@ -707,6 +700,8 @@ obj/machinery/bot/proc/start_patrol()
// send a radio signal with multiple data key/values
/obj/machinery/bot/proc/post_signal_multiple(var/freq, var/list/keyval)
+ if(!z || z != 1) //Bot control will only work on station.
+ return
var/datum/radio_frequency/frequency = radio_controller.return_frequency(freq)
if(!frequency) return
@@ -720,6 +715,8 @@ obj/machinery/bot/proc/start_patrol()
// world << "sent [key],[keyval[key]] on [freq]"
if(signal.data["findbeacon"])
frequency.post_signal(src, signal, filter = RADIO_NAVBEACONS)
+ else if(signal.data["type"] == bot_type)
+ frequency.post_signal(src, signal, filter = bot_filter)
else
frequency.post_signal(src, signal)
@@ -731,8 +728,7 @@ obj/machinery/bot/proc/start_patrol()
"type" = bot_type,
"name" = name,
"loca" = get_area(src), // area
- "mode" = mode,
- "sect" = z // z-level, or "sector"
+ "mode" = mode
)
post_signal_multiple(control_freq, kv)
diff --git a/code/game/machinery/bots/cleanbot.dm b/code/game/machinery/bots/cleanbot.dm
index 2b327a0da306e..69ed1cd26dfb9 100644
--- a/code/game/machinery/bots/cleanbot.dm
+++ b/code/game/machinery/bots/cleanbot.dm
@@ -27,6 +27,7 @@
var/blood = 1
var/list/target_types = list()
var/obj/effect/decal/cleanable/target
+ var/obj/effect/decal/cleanable/oldtarget
var/max_targets = 50 //Maximum number of targets a cleanbot can ignore.
var/oldloc = null
req_one_access = list(access_janitor, access_robotics)
@@ -39,6 +40,7 @@
var/next_dest_loc
radio_frequency = SERV_FREQ //Service
bot_type = CLEAN_BOT
+ bot_filter = RADIO_CLEANBOT
/obj/machinery/bot/cleanbot/New()
..()
@@ -49,6 +51,9 @@
botcard.access = J.get_access()
prev_access = botcard.access
+ spawn(5)
+ add_to_beacons(bot_filter)
+
/obj/machinery/bot/cleanbot/turn_on()
..()
icon_state = "cleanbot[on]"
@@ -63,6 +68,7 @@
..()
ignore_list = list() //Allows the bot to clean targets it previously ignored due to being unreachable.
target = null
+ oldtarget = null
oldloc = null
/obj/machinery/bot/cleanbot/set_custom_texts()
@@ -151,20 +157,27 @@ text("[on ? "On" : "Off"]"))
if(prob(5)) //Spawns foam!
visible_message("[src] whirs and bubbles violently, before releasing a plume of froth!")
- PoolOrNew(/obj/effect/effect/foam, loc)
+ new /obj/effect/effect/foam(loc)
else if (prob(5))
visible_message("[src] makes an excited beeping booping sound!")
if(!target) //Search for cleanables it can see.
- target = scan(/obj/effect/decal/cleanable/)
+ target = scan(/obj/effect/decal/cleanable/, oldtarget)
+ oldtarget = target
+
+ if(!target)
+ if(loc != oldloc)
+ oldtarget = null
- if(!target && auto_patrol) //Search for cleanables it can see.
- if(mode == BOT_IDLE || mode == BOT_START_PATROL)
- start_patrol()
+ if(auto_patrol)
+ if(mode == BOT_IDLE || mode == BOT_START_PATROL)
+ start_patrol()
- if(mode == BOT_PATROL)
- bot_patrol()
+ if(mode == BOT_PATROL)
+ bot_patrol()
+
+ return
if(target)
if(!path || path.len == 0) //No path, need a new one
@@ -227,7 +240,7 @@ text("[on ? "On" : "Off"]"))
/obj/machinery/bot/cleanbot/explode()
on = 0
- visible_message("[src] blows apart!")
+ visible_message("[src] blows apart!")
var/turf/Tsec = get_turf(src)
new /obj/item/weapon/reagent_containers/glass/bucket(Tsec)
diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm
index 0e210e2918a64..df69dc9c78b19 100644
--- a/code/game/machinery/bots/ed209bot.dm
+++ b/code/game/machinery/bots/ed209bot.dm
@@ -35,6 +35,15 @@
var/shoot_sound = 'sound/weapons/Taser.ogg'
radio_frequency = SEC_FREQ
bot_type = SEC_BOT
+ bot_filter = RADIO_SECBOT
+
+ //List of weapons that secbots will not arrest for
+ var/safe_weapons = list(\
+ /obj/item/weapon/gun/energy/laser/bluetag,\
+ /obj/item/weapon/gun/energy/laser/redtag,\
+ /obj/item/weapon/gun/energy/laser/practice,\
+ /obj/item/weapon/melee/classic_baton/telescopic,\
+ /obj/item/weapon/gun/energy/kinetic_accelerator)
/obj/item/weapon/ed209_assembly
@@ -61,6 +70,8 @@
botcard.access = J.get_access()
prev_access = botcard.access
+
+ add_to_beacons(bot_filter)
if(lasercolor)
shot_delay = 6//Longer shot delay because JESUS CHRIST
check_records = 0//Don't actively target people set to arrest
@@ -195,17 +206,6 @@ Auto Patrol[]"},
icon_state = "[lasercolor]ed209[on]"
set_weapon()
-/obj/machinery/bot/ed209/bullet_act(var/obj/item/projectile/Proj)
- if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet))
- if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE))
- if (!Proj.nodamage && Proj.damage < src.health)
- threatlevel = Proj.firer.assess_threat(src)
- threatlevel += 6
- if(threatlevel >= 4)
- target = Proj.firer
- mode = BOT_HUNT
- ..()
-
/obj/machinery/bot/ed209/bot_process()
if (!..())
return
@@ -392,8 +392,9 @@ Auto Patrol[]"},
continue
/obj/machinery/bot/ed209/proc/check_for_weapons(var/obj/item/slot_item)
- if(slot_item && slot_item.needs_permit)
- return 1
+ if(istype(slot_item, /obj/item/weapon/gun) || istype(slot_item, /obj/item/weapon/melee))
+ if(!(slot_item.type in safe_weapons))
+ return 1
return 0
/* terrible
@@ -406,7 +407,7 @@ Auto Patrol[]"},
/obj/machinery/bot/ed209/explode()
walk_to(src,0)
- visible_message("[src] blows apart!")
+ visible_message("[src] blows apart!")
var/turf/Tsec = get_turf(src)
var/obj/item/weapon/ed209_assembly/Sa = new /obj/item/weapon/ed209_assembly(Tsec)
@@ -512,7 +513,7 @@ Auto Patrol[]"},
pulse2.anchored = 1
pulse2.dir = pick(cardinal)
spawn(10)
- qdel(pulse2)
+ pulse2.delete()
var/list/mob/living/carbon/targets = new
for (var/mob/living/carbon/C in view(12,src))
if (C.stat==2)
diff --git a/code/game/machinery/bots/floorbot.dm b/code/game/machinery/bots/floorbot.dm
index 1188513515884..a2112f53b2e20 100644
--- a/code/game/machinery/bots/floorbot.dm
+++ b/code/game/machinery/bots/floorbot.dm
@@ -45,11 +45,13 @@
var/nagged = 0 //Prevents the Floorbot nagging more than once per refill.
var/max_targets = 50
var/turf/target
+ var/turf/oldtarget
var/oldloc = null
req_one_access = list(access_construction, access_robotics)
var/targetdirection
radio_frequency = ENG_FREQ //Engineering channel
bot_type = FLOOR_BOT
+ bot_filter = RADIO_FLOORBOT
var/process_type //Determines what to do when process_scan() recieves a target. See process_scan() for details.
#define HULL_BREACH 1
#define BRIDGE_MODE 2
@@ -65,6 +67,9 @@
botcard.access = J.get_access()
prev_access = botcard.access
+ spawn(5)
+ add_to_beacons(bot_filter)
+
/obj/machinery/bot/floorbot/turn_on()
. = ..()
updateicon()
@@ -78,6 +83,7 @@
/obj/machinery/bot/floorbot/bot_reset()
..()
target = null
+ oldtarget = null
oldloc = null
ignore_list = list()
nagged = 0
@@ -203,11 +209,11 @@
if(amount <= 0 && !target) //Out of tiles! We must refill!
if(eattiles) //Configured to find and consume floortiles!
- target = scan(/obj/item/stack/tile/plasteel)
+ target = scan(/obj/item/stack/tile/plasteel, oldtarget)
process_type = null
if(!target && maketiles) //We did not manage to find any floor tiles! Scan for metal stacks and make our own!
- target = scan(/obj/item/stack/sheet/metal)
+ target = scan(/obj/item/stack/sheet/metal, oldtarget)
process_type = null
return
else
@@ -226,24 +232,24 @@
target = T
else //Find a space tile farther way!
- target = scan(/turf/space)
+ target = scan(/turf/space, oldtarget)
process_type = BRIDGE_MODE
if(!target)
process_type = HULL_BREACH //Ensures the floorbot does not try to "fix" space areas or shuttle docking zones.
- target = scan(/turf/space)
+ target = scan(/turf/space, oldtarget)
if(!target && replacetiles) //Finds a floor without a tile and gives it one.
process_type = REPLACE_TILE //The target must be the floor and not a tile. The floor must not already have a floortile.
- target = scan(/turf/simulated/floor)
+ target = scan(/turf/simulated/floor, oldtarget)
if(!target && fixfloors) //Repairs damaged floors and tiles.
process_type = FIX_TILE
- target = scan(/turf/simulated/floor)
+ target = scan(/turf/simulated/floor, oldtarget)
if(!target && emagged == 2) //We are emagged! Time to rip up the floors!
process_type = TILE_EMAG
- target = scan(/turf/simulated/floor)
+ target = scan(/turf/simulated/floor, oldtarget)
if(!target)
@@ -255,6 +261,11 @@
if(mode == BOT_PATROL)
bot_patrol()
+ if(!target)
+ if(loc != oldloc)
+ oldtarget = null
+ return
+
if(target)
if(path.len == 0)
if(!istype(target, /turf/))
@@ -265,10 +276,12 @@
if(!bot_move(target))
add_to_ignore(target)
+ oldtarget = target
target = null
mode = BOT_IDLE
return
else if( !bot_move(target) )
+ oldtarget = target
target = null
mode = BOT_IDLE
return
@@ -433,7 +446,7 @@ obj/machinery/bot/floorbot/process_scan(var/scan_target)
/obj/machinery/bot/floorbot/explode()
on = 0
- visible_message("[src] blows apart!")
+ visible_message("[src] blows apart!")
var/turf/Tsec = get_turf(src)
var/obj/item/weapon/storage/toolbox/mechanical/N = new /obj/item/weapon/storage/toolbox/mechanical(Tsec)
diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm
index 04be70bdf3c54..4115a3cc4629f 100644
--- a/code/game/machinery/bots/medbot.dm
+++ b/code/game/machinery/bots/medbot.dm
@@ -40,6 +40,7 @@
var/treat_virus = 1 //If on, the bot will attempt to treat viral infections, curing them if possible.
var/shut_up = 0 //self explanatory :)
bot_type = MED_BOT
+ bot_filter = RADIO_MEDBOT
/obj/machinery/bot/medbot/mysterious
name = "\improper Mysterious Medibot"
@@ -50,17 +51,6 @@
treatment_fire = "omnizine"
treatment_tox = "omnizine"
-/obj/machinery/bot/medbot/derelict
- name = "\improper Old Medibot"
- desc = "Looks like it hasn't been modified since the late 2080s."
- skin = "bezerk"
- heal_threshold = 0
- declare_crit = 0
- treatment_oxy = "pancuronium"
- treatment_brute = "pancuronium"
- treatment_fire = "sodium_thiopental"
- treatment_tox = "sodium_thiopental"
-
/obj/item/weapon/firstaid_arm_assembly
name = "incomplete medibot assembly."
desc = "A first aid kit with a robot arm permanently grafted to it."
@@ -103,6 +93,7 @@
else
botcard.access = botcard_access
prev_access = botcard.access
+ add_to_beacons(bot_filter)
/obj/machinery/bot/medbot/turn_on()
. = ..()
@@ -122,12 +113,6 @@
last_found = world.time
declare_cooldown = 0
-/obj/machinery/bot/medbot/proc/soft_reset() //Allows the medibot to still actively perform its medical duties without being completely halted as a hard reset does.
- path = list()
- patient = null
- mode = BOT_IDLE
- last_found = world.time
-
/obj/machinery/bot/medbot/set_custom_texts()
text_hack = "You corrupt [name]'s reagent processor circuits."
@@ -275,7 +260,7 @@
if (H.stat == 2)
return
- if ((H == oldpatient) && (world.time < last_found + 200))
+ if ((H == oldpatient) && (world.time < last_found + 100))
return
if(assess_patient(H))
@@ -310,7 +295,10 @@
if(frustration > 8)
oldpatient = patient
- soft_reset()
+ patient = null
+ mode = BOT_IDLE
+ last_found = world.time
+ path = list()
if(!patient)
if(!shut_up && prob(1))
@@ -335,19 +323,21 @@
last_found = world.time
else if(stationary_mode && patient) //Since we cannot move in this mode, ignore the patient and wait for another.
- soft_reset()
+ patient = null
+ mode = BOT_IDLE
+ last_found = world.time
return
if(patient && path.len == 0 && (get_dist(src,patient) > 1))
- path = get_path_to(loc, get_turf(patient), /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance_cardinal, 0, 30,id=botcard)
- mode = BOT_MOVING
- if(!path.len) //Do not chase a patient we cannot reach.
- soft_reset()
+ spawn(0)
+ path = get_path_to(loc, get_turf(patient), /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance_cardinal, 0, 30,id=botcard)
if(path.len > 0 && patient)
if(!bot_move(patient))
oldpatient = patient
- soft_reset()
+ patient = null
+ mode = BOT_IDLE
+ last_found = world.time
return
if(path.len > 8 && patient)
@@ -510,7 +500,7 @@
/obj/machinery/bot/medbot/explode()
on = 0
- visible_message("[src] blows apart!")
+ visible_message("[src] blows apart!")
var/turf/Tsec = get_turf(src)
new /obj/item/weapon/storage/firstaid(Tsec)
diff --git a/code/game/machinery/bots/mulebot.dm b/code/game/machinery/bots/mulebot.dm
index 5b5b65e1ea110..a574b24ccbc0b 100644
--- a/code/game/machinery/bots/mulebot.dm
+++ b/code/game/machinery/bots/mulebot.dm
@@ -23,6 +23,7 @@ var/global/mulebot_count = 0
beacon_freq = 1400
control_freq = 1447
bot_type = MULE_BOT
+ bot_filter = RADIO_MULEBOT
blood_DNA = list()
suffix = ""
@@ -70,6 +71,8 @@ var/global/mulebot_count = 0
cell.maxcharge = 2000
spawn(5) // must wait for map loading to finish
+ add_to_beacons(bot_filter)
+
mulebot_count += 1
if(!suffix)
suffix = "#[mulebot_count]"
@@ -880,6 +883,8 @@ obj/machinery/bot/mulebot/bot_reset()
//world << "sent [key],[keyval[key]] on [freq]"
if (signal.data["findbeacon"])
frequency.post_signal(src, signal, filter = RADIO_NAVBEACONS)
+ else if (signal.data["type"] == MULE_BOT)
+ frequency.post_signal(src, signal, filter = RADIO_MULEBOT)
else
frequency.post_signal(src, signal)
@@ -908,7 +913,7 @@ obj/machinery/bot/mulebot/bot_reset()
/obj/machinery/bot/mulebot/explode()
- visible_message("[src] blows apart!")
+ visible_message("[src] blows apart!")
var/turf/Tsec = get_turf(src)
new /obj/item/device/assembly/prox_sensor(Tsec)
diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm
index fd2ac1c9d8213..f5bd7dada4768 100644
--- a/code/game/machinery/bots/secbot.dm
+++ b/code/game/machinery/bots/secbot.dm
@@ -25,6 +25,16 @@
var/arrest_type = 0 //If true, don't handcuff
radio_frequency = SEC_FREQ //Security channel
bot_type = SEC_BOT
+ bot_filter = RADIO_SECBOT
+
+ //List of weapons that secbots will not arrest for
+ var/safe_weapons = list(\
+ /obj/item/weapon/gun/energy/laser/bluetag,\
+ /obj/item/weapon/gun/energy/laser/redtag,\
+ /obj/item/weapon/gun/energy/laser/practice,\
+ /obj/item/weapon/melee/classic_baton/telescopic,\
+ /obj/item/weapon/gun/energy/kinetic_accelerator)
+
/obj/machinery/bot/secbot/beepsky
name = "Officer Beep O'sky"
@@ -57,6 +67,7 @@
var/datum/job/detective/J = new/datum/job/detective
botcard.access = J.get_access()
prev_access = botcard.access
+ add_to_beacons(bot_filter)
/obj/machinery/bot/secbot/turn_on()
@@ -178,17 +189,6 @@ Auto Patrol: []"},
declare_arrests = 0
icon_state = "secbot[on]"
-/obj/machinery/bot/secbot/bullet_act(var/obj/item/projectile/Proj)
- if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet))
- if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE))
- if (!Proj.nodamage && Proj.damage < src.health)
- threatlevel = Proj.firer.assess_threat(src)
- threatlevel += 6
- if(threatlevel >= 4)
- target = Proj.firer
- mode = BOT_HUNT
- ..()
-
/obj/machinery/bot/secbot/bot_process()
if (!..())
return
@@ -350,14 +350,15 @@ Auto Patrol: []"},
else
continue
/obj/machinery/bot/secbot/proc/check_for_weapons(var/obj/item/slot_item)
- if(slot_item && slot_item.needs_permit)
- return 1
+ if(istype(slot_item, /obj/item/weapon/gun) || istype(slot_item, /obj/item/weapon/melee))
+ if(!(slot_item.type in safe_weapons))
+ return 1
return 0
/obj/machinery/bot/secbot/explode()
walk_to(src,0)
- visible_message("[src] blows apart!")
+ visible_message("[src] blows apart!")
var/turf/Tsec = get_turf(src)
var/obj/item/weapon/secbot_assembly/Sa = new /obj/item/weapon/secbot_assembly(Tsec)
@@ -391,14 +392,7 @@ Auto Patrol: []"},
..()
return
- if(type != /obj/item/clothing/head/helmet/sec) //Eh, but we don't want people making secbots out of space helmets.
- return
-
- if(!helmetCam) //I am so sorry for this. I could not think of a less terrible (and lazy) way.
- user << "[src] needs to have a camera attached first."
- return
- if(F) //Has a flashlight. Player must remove it, else it will be lost forever.
- user << "The mounted flashlight is in the way, remove it first."
+ if(type != /obj/item/clothing/head/helmet) //Eh, but we don't want people making secbots out of space helmets.
return
if(S.secured)
@@ -464,7 +458,7 @@ Auto Patrol: []"},
else if(istype(I, /obj/item/weapon/screwdriver))
if(!build_step)
new /obj/item/device/assembly/signaler(get_turf(src))
- new /obj/item/clothing/head/helmet/sec(get_turf(src))
+ new /obj/item/clothing/head/helmet(get_turf(src))
user << "You disconnect the signaler from the helmet."
qdel(src)
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index f93b7f486963d..7429e16287104 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -331,18 +331,3 @@
return 1
busy = 0
return 0
-
-
-/obj/machinery/camera/portable //Cameras which are placed inside of things, such as helmets.
- var/turf/prev_turf
-
-/obj/machinery/camera/portable/New()
- ..()
- assembly.state = 0 //These cameras are portable, and so shall be in the portable state if removed.
- assembly.anchored = 0
- assembly.update_icon()
-
-/obj/machinery/camera/portable/process() //Updates whenever the camera is moved.
- if(cameranet && get_turf(src) != prev_turf)
- cameranet.updatePortableCamera(src)
- prev_turf = get_turf(src)
\ No newline at end of file
diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm
index 696952e9b895b..d3b042a86b443 100644
--- a/code/game/machinery/computer/ai_core.dm
+++ b/code/game/machinery/computer/ai_core.dm
@@ -214,7 +214,7 @@ That prevents a few funky behaviors.
if(istype(src, /obj/item/device/aicard))
var/obj/item/device/aicard/icard = src
if(icard.flush)
- U << "ERROR: AI flush is in progress, cannot execute transfer protocol."
+ U << "ERROR: AI flush is in progress, cannot execute transfer protocol."
return
switch(choice)
@@ -227,13 +227,13 @@ That prevents a few funky behaviors.
if("AICARD")
var/obj/item/device/aicard/C = src
if(C.contents.len)//If there is an AI on card.
- U << "Transfer failed: Existing AI found on this terminal. Remove existing AI to install a new one."
+ U << "Transfer failed: Existing AI found on this terminal. Remove existing AI to install a new one."
else
if (ticker.mode.name == "AI malfunction")
var/datum/game_mode/malfunction/malf = ticker.mode
for (var/datum/mind/malfai in malf.malf_ai)
if (T.mind == malfai)
- U << "ERROR: Remote transfer interface disabled."//Do ho ho ho~
+ U << "ERROR: Remote transfer interface disabled."//Do ho ho ho~
return
new /obj/structure/AIcore/deactivated(T.loc)//Spawns a deactivated terminal at AI location.
T.aiRestorePowerRoutine = 0//So the AI initially has power.
@@ -307,8 +307,8 @@ That prevents a few funky behaviors.
T.occupier.cancel_camera()
T.occupier = null
else if (C.contents.len)
- U << "ERROR: Artificial intelligence detected on terminal."
+ U << "ERROR: Artificial intelligence detected on terminal."
else if (T.active)
- U << "ERROR: Reconstruction in progress."
+ U << "ERROR: Reconstruction in progress."
else if (!T.occupier)
- U << "ERROR: Unable to locate artificial intelligence."
\ No newline at end of file
+ U << "ERROR: Unable to locate artificial intelligence."
\ No newline at end of file
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 76d084ffba717..1bcc4decc8e4a 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -3,35 +3,35 @@
desc = "random arcade machine"
icon = 'icons/obj/computer.dmi'
icon_state = "arcade"
- var/list/prizes = list( /obj/item/weapon/storage/box/snappops = 2,
- /obj/item/toy/AI = 2,
- /obj/item/clothing/under/syndicate/tacticool = 2,
- /obj/item/toy/sword = 2,
- /obj/item/toy/gun = 2,
- /obj/item/weapon/gun/projectile/shotgun/toy/crossbow = 2,
- /obj/item/weapon/storage/box/fakesyndiesuit = 2,
- /obj/item/weapon/storage/fancy/crayons = 2,
- /obj/item/toy/spinningtoy = 2,
- /obj/item/toy/prize/ripley = 1,
- /obj/item/toy/prize/fireripley = 1,
- /obj/item/toy/prize/deathripley = 1,
- /obj/item/toy/prize/gygax = 1,
- /obj/item/toy/prize/durand = 1,
- /obj/item/toy/prize/honk = 1,
- /obj/item/toy/prize/marauder = 1,
- /obj/item/toy/prize/seraph = 1,
- /obj/item/toy/prize/mauler = 1,
- /obj/item/toy/prize/odysseus = 1,
- /obj/item/toy/prize/phazon = 1,
- /obj/item/toy/prize/reticence = 1,
- /obj/item/toy/cards/deck = 2,
- /obj/item/toy/nuke = 2,
- /obj/item/toy/minimeteor = 2,
- /obj/item/toy/carpplushie = 2,
- /obj/item/toy/foamblade = 2,
- /obj/item/toy/redbutton = 2,
- /obj/item/toy/owl = 2,
- /obj/item/toy/griffin = 2
+ var/list/prizes = list( /obj/item/weapon/storage/box/snappops = 2,
+ /obj/item/toy/AI = 2,
+ /obj/item/clothing/under/syndicate/tacticool = 2,
+ /obj/item/toy/sword = 2,
+ /obj/item/toy/gun = 2,
+ /obj/item/toy/crossbow = 2,
+ /obj/item/weapon/storage/box/fakesyndiesuit = 2,
+ /obj/item/weapon/storage/fancy/crayons = 2,
+ /obj/item/toy/spinningtoy = 2,
+ /obj/item/toy/prize/ripley = 1,
+ /obj/item/toy/prize/fireripley = 1,
+ /obj/item/toy/prize/deathripley = 1,
+ /obj/item/toy/prize/gygax = 1,
+ /obj/item/toy/prize/durand = 1,
+ /obj/item/toy/prize/honk = 1,
+ /obj/item/toy/prize/marauder = 1,
+ /obj/item/toy/prize/seraph = 1,
+ /obj/item/toy/prize/mauler = 1,
+ /obj/item/toy/prize/odysseus = 1,
+ /obj/item/toy/prize/phazon = 1,
+ /obj/item/toy/prize/reticence = 1,
+ /obj/item/toy/cards/deck = 2,
+ /obj/item/toy/nuke = 2,
+ /obj/item/toy/minimeteor = 2,
+ /obj/item/toy/carpplushie = 2,
+ /obj/item/toy/foamblade = 2,
+ /obj/item/toy/redbutton = 2,
+ /obj/item/toy/owl = 2,
+ /obj/item/toy/griffin = 2
)
/obj/machinery/computer/arcade/New()
@@ -367,27 +367,9 @@
else
if(food <= 0)
dat += " You ran out of food and starved."
- if(emagged)
- user.nutrition = 0 //yeah you pretty hongry
- user << "Your body instantly contracts to that of one who has not eaten in months. Agonizing cramps seize you as you fall to the floor."
if(fuel <= 0)
dat += " You ran out of fuel, and drift, slowly, into a star."
- if(emagged)
- var/mob/living/M = user
- M.adjust_fire_stacks(5)
- M.IgniteMob() //flew into a star, so you're on fire
- user << "You feel an immense wave of heat emanate from the arcade machine. Your skin bursts into flames."
dat += "
"
-
- if(emagged)
- user << "You're never going to make it to Orion..."
- user.death()
- emagged = 0 //removes the emagged status after you lose
- playing = 0 //also a new game
- name = "The Orion Trail"
- desc = "Learn how our ancestors got to Orion, and have fun in the process!"
-
-
else if(event)
dat = eventdat
else if(playing)
@@ -445,77 +427,6 @@
if(prob(75))
event = pickweight(events)
event()
- if(emagged)
- var/mob/living/carbon/M = usr //for some vars
- switch(event)
- if("Raiders")
- if(prob(50))
- usr << "You hear battle shouts. The tramping of boots on cold metal. Screams of agony. The rush of venting air. Are you going insane?"
- M.hallucination += 30
- else
- usr << "Something strikes you from behind! It hurts like hell and feel like a blunt weapon, but nothing is there..."
- M.take_organ_damage(30)
- playsound(loc, 'sound/weapons/genhit2.ogg', 100, 1)
- if("Illness")
- var/severity = rand(1,3) //pray to RNGesus. PRAY, PIGS
- if(severity == 1)
- M << "You suddenly feel slightly nauseous." //got off lucky
- if(severity == 2)
- usr << "You suddenly feel extremely nauseous and hunch over until it passes."
- M.Stun(3)
- if(severity >= 3) //you didn't pray hard enough
- M << "An overpowering wave of nausea consumes over you. You hunch over, your stomach's contents preparing for a spectacular exit."
- M.Stun(5)
- sleep(30)
- M.visible_message("[M] throws up!", "You violently throw up!")
- playsound(loc, 'sound/effects/splat.ogg', 50, 1)
- M.nutrition -= 50 //lose a lot of food
- var/turf/location = usr.loc
- if(istype(location, /turf/simulated))
- location.add_vomit_floor(src, 1)
- if("Interstellar Flux")
- if(prob(75))
- M.Weaken(3)
- M.visible_message("[M] is swept off their feet!", "A sudden gust of powerful wind slams you into the floor!")
- M.take_organ_damage(25)
- playsound(src.loc, 'sound/weapons/Genhit.ogg', 100, 1)
- else
- M << "A violent gale blows past you, and you barely manage to stay standing!"
- if("Collision") //by far the most damaging event
- if(prob(90))
- playsound(src.loc, 'sound/effects/bang.ogg', 100, 1)
- var/turf/simulated/floor/F
- for(F in orange(1, src))
- F.ChangeTurf(/turf/space)
- src.visible_message("Something slams into the floor around [src], exposing it to space!")
- if(hull)
- sleep(10)
- src.visible_message("A new floor suddenly appears around [src]. What the hell?")
- playsound(src.loc, 'sound/weapons/Genhit.ogg', 100, 1)
- var/turf/space/T
- for(T in orange(1, src))
- T.ChangeTurf(/turf/simulated/floor/plating/)
- else
- src.visible_message("Something slams into the floor around [src] - luckily, it didn't get through!")
- playsound(src.loc, 'sound/effects/bang.ogg', 50, 1)
- if("Malfunction")
- playsound(src.loc, 'sound/effects/EMPulse.ogg', 50, 1)
- src.visible_message("[src] malfunctions, randomizing in-game stats!")
- var/oldfood = food
- var/oldfuel = fuel
- food = rand(10,80) / rand(1,2)
- fuel = rand(10,60) / rand(1,2)
- if(electronics)
- sleep(10)
- if(oldfuel > fuel && oldfood > food)
- src.audible_message("[src] lets out a somehow reassuring chime.")
- else if(oldfuel < fuel || oldfood < food)
- src.audible_message("[src] lets out a somehow ominous chime.")
- food = oldfood
- fuel = oldfuel
- playsound(src.loc, 'sound/machines/chime.ogg', 50, 1)
-
-
else if(href_list["newgame"]) //Reset everything
newgame()
else if(href_list["menu"]) //back to the main menu
@@ -556,15 +467,6 @@
if(prob(75))
event = "BlackHole"
event()
- if(emagged) //has to be here because otherwise it doesn't work
- playsound(src.loc, 'sound/effects/supermatter.ogg', 100, 1)
- src.visible_message("A miniature black hole suddenly appears in front of [src], devouring [usr] alive!")
- usr.Stun(10) //you can't run :^)
- var/S = new /obj/singularity/academy(usr.loc)
- emagged = 0 //immediately removes emagged status so people can't kill themselves by sprinting up and interacting
- sleep(50)
- src.visible_message("[S] winks out, just as suddenly as it appeared.")
- qdel(S)
else
event = null
turns += 1
@@ -597,6 +499,7 @@
eventdat += " Fortunately you fended them off without any trouble."
eventdat += "
"
+
else if(event == "Interstellar Flux")
eventdat += "This region of space is highly turbulent. If we go slowly we may avoid more damage, but if we keep our speed we won't waste supplies."
eventdat += " What will you do?"
@@ -610,6 +513,7 @@
alive -= 1
eventdat += "
"
-
if(istype(ticker.mode, /datum/game_mode/blob))
var/datum/game_mode/blob/mode = ticker.mode
dat += "
Blob
"
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 73b5e59c71394..43aa60f2f6ba7 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -7,61 +7,42 @@
return
if(href_list["makeAntag"])
- if (!ticker.mode)
- usr << "Not until the round starts!"
- return
switch(href_list["makeAntag"])
if("1")
- if(src.makeTraitors())
- message_admins("[key_name_admin(usr)] created traitors.")
- log_admin("[key_name(usr)] created traitors.")
- else
- message_admins("[key_name_admin(usr)] tried to create traitors. Unfortunatly there were no candidates available.")
- log_admin("[key_name(usr)] failed to create traitors.")
+ message_admins("[key_name_admin(usr)] created traitors.")
+ log_admin("[key_name(usr)] created traitors.")
+ if(!src.makeTraitors())
+ usr << "Unfortunatly there were no candidates available."
if("2")
- if(src.makeChanglings())
- message_admins("[key_name(usr)] created changelings.")
- log_admin("[key_name(usr)] created changelings.")
- else
- message_admins("[key_name_admin(usr)] tried to create changelings. Unfortunatly there were no candidates available.")
- log_admin("[key_name(usr)] failed to create changelings.")
+ message_admins("[key_name(usr)] created changelings.")
+ log_admin("[key_name(usr)] created changelings.")
+ if(!src.makeChanglings())
+ usr << "Unfortunatly there were no candidates available."
if("3")
+ message_admins("[key_name(usr)] started a revolution.")
+ log_admin("[key_name(usr)] started a revolution.")
if(!src.makeRevs())
- message_admins("[key_name(usr)] started a revolution.")
- log_admin("[key_name(usr)] started a revolution.")
- else
- message_admins("[key_name_admin(usr)] tried to start a revolution. Unfortunatly there were no candidates available.")
- log_admin("[key_name(usr)] failed to start a revolution.")
+ usr << "Unfortunatly there were no candidates available."
if("4")
- if(src.makeCult())
- message_admins("[key_name(usr)] started a cult.")
- log_admin("[key_name(usr)] started a cult.")
- else
- message_admins("[key_name_admin(usr)] tried to start a cult. Unfortunatly there were no candidates available.")
- log_admin("[key_name(usr)] failed to start a cult.")
+ message_admins("[key_name(usr)] created cultists.")
+ log_admin("[key_name(usr)] created cultists.")
+ if(!src.makeCult())
+ usr << "Unfortunatly there were no candidates available."
if("5")
- if(src.makeMalfAImode())
- message_admins("[key_name(usr)] caused an AI to malfunction.")
- log_admin("[key_name(usr)] caused an AI to malfunction.")
- else
- message_admins("[key_name_admin(usr)] tried to cause an AI to malfunction. Unfortunatly there were no candidates available.")
- log_admin("[key_name(usr)] failed to cause an AI to malfunction.")
+ message_admins("[key_name(usr)] caused an AI to malfunction.")
+ log_admin("[key_name(usr)] caused an AI to malfunction.")
+ if(!src.makeMalfAImode())
+ usr << "Unfortunatly there were no candidates available."
if("6")
- message_admins("[key_name(usr)] is creating a wizard...")
- if(src.makeWizard())
- message_admins("[key_name(usr)] created a wizard.")
- log_admin("[key_name(usr)] created a wizard.")
- else
- message_admins("[key_name_admin(usr)] tried to create a wizard. Unfortunatly there were no candidates available.")
- log_admin("[key_name(usr)] failed to create a wizard.")
+ message_admins("[key_name(usr)] created a wizard.")
+ log_admin("[key_name(usr)] created a wizard.")
+ if(!src.makeWizard())
+ usr << "Unfortunatly there were no candidates available."
if("7")
- message_admins("[key_name(usr)] is creating a nuke team...")
- if(src.makeNukeTeam())
- message_admins("[key_name(usr)] created a nuke team.")
- log_admin("[key_name(usr)] created a nuke team.")
- else
- message_admins("[key_name_admin(usr)] tried to create a nuke team. Unfortunatly there were not enough candidates available.")
- log_admin("[key_name(usr)] failed to create a nuke team.")
+ message_admins("[key_name(usr)] created a nuke team.")
+ log_admin("[key_name(usr)] created a nuke team.")
+ if(!src.makeNukeTeam())
+ usr << "Unfortunatly there were not enough candidates available."
if("8")
message_admins("[key_name(usr)] spawned a ninja.")
log_admin("[key_name(usr)] spawned a ninja.")
@@ -71,44 +52,27 @@
log_admin("[key_name(usr)] started an alien infestation.")
src.makeAliens()
if("10")
- message_admins("[key_name(usr)] is creating a death squad...")
- if(src.makeDeathsquad())
- message_admins("[key_name(usr)] created a death squad.")
- log_admin("[key_name(usr)] created a death squad.")
- else
- message_admins("[key_name_admin(usr)] tried to create a death squad. Unfortunatly there were not enough candidates available.")
- log_admin("[key_name(usr)] failed to create a death squad.")
+ message_admins("[key_name(usr)] created a death squad.")
+ log_admin("[key_name(usr)] created a death squad.")
+ if(!src.makeDeathsquad())
+ usr << "Unfortunatly there were not enough candidates available."
if("11")
var/strength = input("Set Blob Strength (1=Weak, 2=Strong, 3=Full)","Set Strength",1) as num
message_admins("[key_name(usr)] spawned a blob with strength [strength].")
log_admin("[key_name(usr)] spawned a blob with strength [strength].")
new/datum/round_event/blob(strength)
if("12")
- if(src.makeGangsters())
- message_admins("[key_name(usr)] started a gang war.")
- log_admin("[key_name(usr)] started a gang war.")
- else
- message_admins("[key_name(usr)] tried to start a gang war. Unfortunatly there were not enough candidates available.")
- log_admin("[key_name(usr)] failed to start a gang war.")
+ message_admins("[key_name(usr)] started a gang war.")
+ log_admin("[key_name(usr)] started a gang war.")
+ if(!src.makeGangsters())
+ usr << "Unfortunatly there were not enough candidates available."
if("13")
- message_admins("[key_name(usr)] is creating an emergency response team...")
- if(src.makeEmergencyresponseteam())
- message_admins("[key_name(usr)] created an emergency response team.")
- log_admin("[key_name(usr)] created an emergency response team.")
- else
- message_admins("[key_name_admin(usr)] tried to create an emergency response team. Unfortunatly there were not enough candidates available.")
- log_admin("[key_name(usr)] failed to create an emergency response team.")
- if("14")
- message_admins("[key_name(usr)] is creating an abductor team...")
- if(src.makeAbductorTeam())
- message_admins("[key_name(usr)] created an abductor team.")
- log_admin("[key_name(usr)] created an abductor team.")
- else
- message_admins("[key_name_admin(usr)] tried to create an abductor team. Unfortunatly there were not enough candidates available.")
- log_admin("[key_name(usr)] failed to create an abductor team.")
+ message_admins("[key_name(usr)] created a emergency response team.")
+ log_admin("[key_name(usr)] created a emergency response team.")
+ if(!src.makeEmergencyresponseteam())
+ usr << "Unfortunatly there were not enough candidates available."
else if(href_list["forceevent"])
- if(!check_rights(R_FUN)) return
var/datum/round_event_control/E = locate(href_list["forceevent"]) in SSevent.control
if(E)
var/datum/round_event/event = E.runEvent()
@@ -254,28 +218,6 @@
message_admins("[key_name_admin(usr)] edited the Emergency Shuttle's timeleft to [timer] seconds")
href_list["secretsadmin"] = "check_antagonist"
- else if(href_list["toggle_continuous"])
- if(!check_rights(R_ADMIN)) return
-
- if(!config.continuous[ticker.mode.config_tag])
- config.continuous[ticker.mode.config_tag] = 1
- else
- config.continuous[ticker.mode.config_tag] = 0
-
- message_admins("[key_name_admin(usr)] toggled the round to [config.continuous[ticker.mode.config_tag] ? "continue if all antagonists die" : "end with the antagonists"].")
- check_antagonists()
-
- else if(href_list["toggle_midround_antag"])
- if(!check_rights(R_ADMIN)) return
-
- if(!config.midround_antag[ticker.mode.config_tag])
- config.midround_antag[ticker.mode.config_tag] = 1
- else
- config.midround_antag[ticker.mode.config_tag] = 0
-
- message_admins("[key_name_admin(usr)] toggled the round to [config.midround_antag[ticker.mode.config_tag] ? "use" : "skip"] the midround antag system.")
- check_antagonists()
-
else if(href_list["delay_round_end"])
if(!check_rights(R_SERVER)) return
@@ -323,13 +265,13 @@
if("sentinel") M.change_mob_type( /mob/living/carbon/alien/humanoid/sentinel , null, null, delmob )
if("larva") M.change_mob_type( /mob/living/carbon/alien/larva , null, null, delmob )
if("human") M.change_mob_type( /mob/living/carbon/human , null, null, delmob )
- if("slime") M.change_mob_type( /mob/living/simple_animal/slime , null, null, delmob )
+ if("slime") M.change_mob_type( /mob/living/carbon/slime , null, null, delmob )
if("monkey") M.change_mob_type( /mob/living/carbon/monkey , null, null, delmob )
if("robot") M.change_mob_type( /mob/living/silicon/robot , null, null, delmob )
- if("cat") M.change_mob_type( /mob/living/simple_animal/pet/cat , null, null, delmob )
- if("runtime") M.change_mob_type( /mob/living/simple_animal/pet/cat/Runtime , null, null, delmob )
- if("corgi") M.change_mob_type( /mob/living/simple_animal/pet/corgi , null, null, delmob )
- if("ian") M.change_mob_type( /mob/living/simple_animal/pet/corgi/Ian , null, null, delmob )
+ if("cat") M.change_mob_type( /mob/living/simple_animal/cat , null, null, delmob )
+ if("runtime") M.change_mob_type( /mob/living/simple_animal/cat/Runtime , null, null, delmob )
+ if("corgi") M.change_mob_type( /mob/living/simple_animal/corgi , null, null, delmob )
+ if("ian") M.change_mob_type( /mob/living/simple_animal/corgi/Ian , null, null, delmob )
if("crab") M.change_mob_type( /mob/living/simple_animal/crab , null, null, delmob )
if("coffee") M.change_mob_type( /mob/living/simple_animal/crab/Coffee , null, null, delmob )
if("parrot") M.change_mob_type( /mob/living/simple_animal/parrot , null, null, delmob )
@@ -430,7 +372,7 @@
DB_ban_unban(M.ckey, BANTYPE_APPEARANCE)
appearance_unban(M)
message_admins("[key_name_admin(usr)] removed [key_name_admin(M)]'s appearance ban")
- M << "[usr.client.ckey] has removed your appearance ban."
+ M << "[usr.client.ckey] has removed your appearance ban."
else switch(alert("Appearance ban [M.ckey]?",,"Yes","No", "Cancel"))
if("Yes")
@@ -444,8 +386,8 @@
appearance_fullban(M, "[reason]; By [usr.ckey] on [time2text(world.realtime)]")
notes_add(M.ckey, "Appearance banned - [reason]")
message_admins("[key_name_admin(usr)] appearance banned [key_name_admin(M)]")
- M << "You have been appearance banned by [usr.client.ckey]."
- M << "The reason is: [reason]"
+ M << "You have been appearance banned by [usr.client.ckey]."
+ M << "The reason is: [reason]"
M << "Appearance ban can be lifted only upon request."
if(config.banappeals)
M << "To try to resolve this matter head to [config.banappeals]"
@@ -699,18 +641,6 @@
else
jobs += "
"
@@ -837,8 +767,8 @@
msg += ", [job]"
notes_add(M.ckey, "Banned from [msg] - [reason]")
message_admins("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg] for [mins] minutes")
- M << "You have been jobbanned by [usr.client.ckey] from: [msg]."
- M << "The reason is: [reason]"
+ M << "You have been jobbanned by [usr.client.ckey] from: [msg]."
+ M << "The reason is: [reason]"
M << "This jobban will be lifted in [mins] minutes."
href_list["jobban2"] = 1 // lets it fall through and refresh
return 1
@@ -857,8 +787,8 @@
else msg += ", [job]"
notes_add(M.ckey, "Banned from [msg] - [reason]")
message_admins("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg]")
- M << "You have been jobbanned by [usr.client.ckey] from: [msg]."
- M << "The reason is: [reason]"
+ M << "You have been jobbanned by [usr.client.ckey] from: [msg]."
+ M << "The reason is: [reason]"
M << "Jobban can be lifted only upon request."
href_list["jobban2"] = 1 // lets it fall through and refresh
return 1
@@ -890,7 +820,7 @@
continue
if(msg)
message_admins("[key_name_admin(usr)] unbanned [key_name_admin(M)] from [msg]")
- M << "You have been un-jobbanned by [usr.client.ckey] from [msg]."
+ M << "You have been un-jobbanned by [usr.client.ckey] from [msg]."
href_list["jobban2"] = 1 // lets it fall through and refresh
return 1
return 0 //we didn't do anything!
@@ -954,7 +884,7 @@
return
AddBan(M.ckey, M.computer_id, reason, usr.ckey, 1, mins)
ban_unban_log_save("[usr.client.ckey] has banned [M.ckey]. - Reason: [reason] - This will be removed in [mins] minutes.")
- M << "You have been banned by [usr.client.ckey].\nReason: [reason]"
+ M << "You have been banned by [usr.client.ckey].\nReason: [reason]"
M << "This is a temporary ban, it will be removed in [mins] minutes."
feedback_inc("ban_tmp",1)
DB_ban_record(BANTYPE_TEMP, M, mins, reason)
@@ -978,7 +908,7 @@
AddBan(M.ckey, M.computer_id, reason, usr.ckey, 0, 0, M.lastKnownIP)
if("No")
AddBan(M.ckey, M.computer_id, reason, usr.ckey, 0, 0)
- M << "You have been banned by [usr.client.ckey].\nReason: [reason]"
+ M << "You have been banned by [usr.client.ckey].\nReason: [reason]"
M << "This is a permanent ban."
if(config.banappeals)
M << "To try to resolve this matter head to [config.banappeals]"
@@ -1539,8 +1469,40 @@
H << "Your prayers have been answered!! You received the best cookie!"
else if(href_list["BlueSpaceArtillery"])
+ if(!check_rights(R_ADMIN|R_FUN)) return
+
var/mob/living/M = locate(href_list["BlueSpaceArtillery"])
- M.client.bluespace_artillery(M)
+ if(!isliving(M))
+ usr << "This can only be used on instances of type /mob/living"
+ return
+
+ if(alert(src.owner, "Are you sure you wish to hit [key_name(M)] with Blue Space Artillery?", "Confirm Firing?" , "Yes" , "No") != "Yes")
+ return
+
+ if(BSACooldown)
+ src.owner << "Standby! Reload cycle in progress! Gunnary crews ready in five seconds!"
+ return
+
+ BSACooldown = 1
+ spawn(50)
+ BSACooldown = 0
+
+ M << "You've been hit by bluespace artillery!"
+ log_admin("[key_name(M)] has been hit by Bluespace Artillery fired by [src.owner]")
+ message_admins("[key_name(M)] has been hit by Bluespace Artillery fired by [src.owner]")
+
+ var/turf/simulated/floor/T = get_turf(M)
+ if(istype(T))
+ if(prob(80)) T.break_tile_to_plating()
+ else T.break_tile()
+
+ if(M.health == 1)
+ M.gib()
+ else
+ M.adjustBruteLoss( min( 99 , (M.health - 1) ) )
+ M.Stun(20)
+ M.Weaken(20)
+ M.stuttering = 20
else if(href_list["CentcommReply"])
var/mob/living/carbon/human/H = locate(href_list["CentcommReply"])
@@ -1899,7 +1861,7 @@
MAX_EX_LIGHT_RANGE = 14
MAX_EX_HEAVY_RANGE = 7
MAX_EX_DEVESTATION_RANGE = 3
- message_admins("[key_name_admin(usr)] changed the bomb cap to [MAX_EX_DEVESTATION_RANGE], [MAX_EX_HEAVY_RANGE], [MAX_EX_LIGHT_RANGE]")
+ message_admins("[key_name_admin(usr)] changed the bomb cap to [MAX_EX_DEVESTATION_RANGE], [MAX_EX_HEAVY_RANGE], [MAX_EX_LIGHT_RANGE]")
log_admin("[key_name(usr)] changed the bomb cap to [MAX_EX_DEVESTATION_RANGE], [MAX_EX_HEAVY_RANGE], [MAX_EX_LIGHT_RANGE]")
if("lightsout")
@@ -1991,7 +1953,7 @@
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","RET")
for(var/mob/living/carbon/human/H in player_list)
- H << "You suddenly feel stupid."
+ H << "You suddenly feel stupid."
H.setBrainLoss(60)
message_admins("[key_name_admin(usr)] made everybody retarded")
if("eagles")//SCRAW
diff --git a/code/modules/admin/verbs/bluespacearty.dm b/code/modules/admin/verbs/bluespacearty.dm
deleted file mode 100644
index c3c0c0d90b7f1..0000000000000
--- a/code/modules/admin/verbs/bluespacearty.dm
+++ /dev/null
@@ -1,34 +0,0 @@
-/client/proc/bluespace_artillery(var/mob/M in mob_list)
- set name = "Bluespace Artillery"
- set category = "Fun"
-
- if(!holder || !check_rights(R_FUN))
- return
-
- var/mob/living/target = M
-
- if(!isliving(target))
- usr << "This can only be used on instances of type /mob/living"
- return
-
- if(alert(usr, "Are you sure you wish to hit [key_name(target)] with Blue Space Artillery?", "Confirm Firing?" , "Yes" , "No") != "Yes")
- return
-
- explosion(target.loc, 0, 0, 0, 0)
-
- var/turf/simulated/floor/T = get_turf(target)
- if(istype(T))
- if(prob(80)) T.break_tile_to_plating()
- else T.break_tile()
-
- if(target.health <= 1)
- target.gib()
- else
- target.adjustBruteLoss(min(99,(target.health - 1)))
- target.Stun(20)
- target.Weaken(20)
- target.stuttering = 20
-
- target << "You've been hit by bluespace artillery!"
- log_admin("[target.name] has been hit by Bluespace Artillery fired by [usr]")
- message_admins("[target.name] has been hit by Bluespace Artillery fired by [usr]")
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index af5e35c3ff7fe..ffc7ebe20e599 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -831,7 +831,7 @@ var/global/list/g_fancy_list_of_types = null
for(var/obj/item/briefcase_item in sec_briefcase)
qdel(briefcase_item)
for(var/i=3, i>0, i--)
- sec_briefcase.contents += new /obj/item/stack/spacecash/c1000
+ sec_briefcase.contents += new /obj/item/weapon/spacecash/c1000
sec_briefcase.contents += new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow
sec_briefcase.contents += new /obj/item/weapon/gun/projectile/revolver/mateba
sec_briefcase.contents += new /obj/item/ammo_box/a357
@@ -856,7 +856,7 @@ var/global/list/g_fancy_list_of_types = null
equip_deathsquad(M)
if("emergency response officer")
- switch(input("Which class?") in list("Commander","Security","Engineer","Medic"))
+ switch(input("Which class?") in list("Commander","Security","Engineer","Medical"))
if("Commander")
equip_emergencyresponsesquad(M, "commander")
if("Security")
@@ -870,11 +870,10 @@ var/global/list/g_fancy_list_of_types = null
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/black(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_cent(M), slot_ears)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_com(M), slot_ears)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/weapon/pen(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(M), slot_back)
var/obj/item/device/pda/heads/pda = new(M)
pda.owner = M.real_name
@@ -896,17 +895,16 @@ var/global/list/g_fancy_list_of_types = null
if("centcom commander")
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_commander(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/bulletproof(M), slot_wear_suit)
+ M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat/swat(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_cent/commander(M), slot_ears)
+ M.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_cent(M), slot_ears)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/cohiba(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/clothing/head/centhat(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/weapon/lighter/zippo(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
var/obj/item/weapon/card/id/W = new(M)
W.icon_state = "centcom"
@@ -918,18 +916,17 @@ var/global/list/g_fancy_list_of_types = null
M.equip_to_slot_or_del(W, slot_wear_id)
if("special ops officer")
- var/obj/item/device/radio/headset/R = new /obj/item/device/radio/headset/headset_cent/commander(M)
- R.set_frequency(CENTCOM_FREQ)
- R.freqlock = 1
+ var/obj/item/device/radio/headset/R = new /obj/item/device/radio/headset/headset_cent(M)
+ R.set_frequency(1441)
M.equip_to_slot_or_del(R, slot_ears)
M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/officer(M), slot_wear_suit)
+ M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/deathsquad/officer(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat/swat(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/havana(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/beret(M), slot_head)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/m1911(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/weapon/lighter/zippo(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
@@ -1106,28 +1103,27 @@ var/global/list/g_fancy_list_of_types = null
//Deathsquad
/proc/equip_deathsquad(var/mob/living/carbon/human/M, var/officer)
- var/obj/item/device/radio/R = new /obj/item/device/radio/headset/headset_cent/alt(M)
- R.set_frequency(CENTCOM_FREQ)
- R.freqlock = 1
+ var/obj/item/device/radio/R = new /obj/item/device/radio/headset(M)
+ R.set_frequency(1441)
M.equip_to_slot_or_del(R, slot_ears)
if(officer)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/beret(M), slot_head)
- //else
- // M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad(M), slot_head)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head)
+ else
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/hardsuit/deathsquad(M), slot_wear_suit)
+ M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/deathsquad(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/green(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat/swat(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/toggle/thermal(M), slot_glasses)
+ M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/ammo_box/a357(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/combat/nanites(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/flashbangs(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/device/flashlight(M), slot_in_backpack)
@@ -1138,13 +1134,12 @@ var/global/list/g_fancy_list_of_types = null
M.equip_to_slot_or_del(new /obj/item/weapon/tank/internals/emergency_oxygen(M), slot_s_store)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/loyalpin(M), slot_r_hand)
+ M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse(M), slot_r_hand)
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M)//Here you go Deuryn
L.imp_in = M
L.implanted = 1
- M.sec_hud_set_implants()
var/obj/item/weapon/card/id/W = new(M)
W.icon_state = "centcom"
@@ -1152,67 +1147,61 @@ var/global/list/g_fancy_list_of_types = null
W.access += get_centcom_access("Death Commando")//Let's add their alloted Centcom access.
W.assignment = "Death Commando"
W.registered_name = M.real_name
- W.update_label(W.registered_name, W.assignment)
+ W.update_label(M.real_name)
M.equip_to_slot_or_del(W, slot_wear_id)
//Emergency Response Team
/proc/equip_emergencyresponsesquad(var/mob/living/carbon/human/M, var/ertrole)
- var/obj/item/weapon/card/id/W = null
- var/obj/item/device/radio/R = new /obj/item/device/radio/headset/headset_cent/alt(M)
- R.set_frequency(CENTCOM_FREQ)
- R.freqlock = 1
+ var/obj/item/device/radio/R = new /obj/item/device/radio/headset(M)
+ R.set_frequency(1441)
M.equip_to_slot_or_del(R, slot_ears)
switch(ertrole)
if("commander")
- W = new /obj/item/weapon/card/id/ert(M)
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat/swat(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/hardsuit/ert(M), slot_wear_suit)
- M.equip_to_slot_or_del(W, slot_wear_id)
+ M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/ert(M), slot_wear_suit)
+ M.equip_to_slot_or_del(new /obj/item/weapon/card/id/ert(M), slot_wear_id)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/captain(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/hardsuit/ert(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/loyalpin(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/security/full(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/saber(M), slot_l_store)
- R.keyslot = new /obj/item/device/encryptionkey/heads/captain
-
if("sec")
- W = new /obj/item/weapon/card/id/ert/Security(M)
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat/swat(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/hardsuit/ert/sec(M), slot_wear_suit)
- M.equip_to_slot_or_del(W, slot_wear_id)
+ M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/ert/sec(M), slot_wear_suit)
+ M.equip_to_slot_or_del(new /obj/item/weapon/card/id/ert/Security(M), slot_wear_id)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/sunglasses(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/handcuffs(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/hardsuit/ert/sec(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/carbine/loyalpin(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/security/full(M), slot_belt)
- R.keyslot = new /obj/item/device/encryptionkey/heads/hos
-
if("med")
- W = new /obj/item/weapon/card/id/ert/Medical(M)
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat/swat(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/hardsuit/ert/med(M), slot_wear_suit)
- M.equip_to_slot_or_del(W, slot_wear_id)
+ M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/ert/med(M), slot_wear_suit)
+ M.equip_to_slot_or_del(new /obj/item/weapon/card/id/ert/Medical(M), slot_wear_id)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/hardsuit/ert/med(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/combat/nanites(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/loyalpin(M), slot_in_backpack)
@@ -1221,19 +1210,17 @@ var/global/list/g_fancy_list_of_types = null
M.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(M), slot_r_hand)
- R.keyslot = new /obj/item/device/encryptionkey/heads/cmo
-
if("eng")
- W = new /obj/item/weapon/card/id/ert/Engineer(M)
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat/swat(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/hardsuit/ert/engi(M), slot_wear_suit)
- M.equip_to_slot_or_del(W, slot_wear_id)
+ M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/ert/engi(M), slot_wear_suit)
+ M.equip_to_slot_or_del(new /obj/item/weapon/card/id/ert/Engineer(M), slot_wear_id)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/meson/engine(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(M), slot_in_backpack)
+ M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/hardsuit/ert/engi(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sechailer/swat(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/rcd/combat(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse/pistol/loyalpin(M), slot_in_backpack)
@@ -1241,15 +1228,7 @@ var/global/list/g_fancy_list_of_types = null
M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/weapon/rcd_ammo/large(M), slot_l_store)
- R.keyslot = new /obj/item/device/encryptionkey/heads/ce
-
- R.recalculateChannels()
-
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(M)
L.imp_in = M
L.implanted = 1
M.sec_hud_set_implants()
-
- if (W)
- W.registered_name = M.real_name
- W.update_label(W.registered_name, W.assignment)
\ No newline at end of file
diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm
index c78793ac84a45..e5c3b465337ff 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -22,7 +22,6 @@ client/proc/one_click_antag()
Make Nuke Team (Requires Ghosts) Make Deathsquad (Requires Ghosts) Make Emergency Response Team (Requires Ghosts)
- Make Abductor Team (Requires Ghosts)
"}
/* These dont work just yet
Ninja, aliens and deathsquad I have not looked into yet
@@ -239,9 +238,26 @@ client/proc/one_click_antag()
/datum/admins/proc/makeNukeTeam()
var/datum/game_mode/nuclear/temp = new
- var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered for a nuke team being sent in?", "operative", temp)
+ var/list/mob/dead/observer/candidates = list()
var/list/mob/dead/observer/chosen = list()
var/mob/dead/observer/theghost = null
+ var/time_passed = world.time
+
+ for(var/mob/dead/observer/G in player_list)
+ if(!jobban_isbanned(G, "operative") && !jobban_isbanned(G, "Syndicate"))
+ if(temp.age_check(G.client))
+ spawn(0)
+ switch(alert(G,"Do you wish to be considered for a nuke team being sent in?","Please answer in 30 seconds!","Yes","No"))
+ if("Yes")
+ if((world.time-time_passed)>300)//If more than 30 game seconds passed.
+ return
+ candidates += G
+ if("No")
+ return
+ else
+ return
+
+ sleep(300)
if(candidates.len)
var/numagents = 5
@@ -294,9 +310,8 @@ client/proc/one_click_antag()
else
new_character.mind.make_Nuke(synd_spawn[spawnpos],nuke_code)
spawnpos++
- return 1
- else
- return 0
+
+ return 1
@@ -312,19 +327,34 @@ client/proc/one_click_antag()
// DEATH SQUADS
/datum/admins/proc/makeDeathsquad()
+ var/list/mob/dead/observer/candidates = list()
+ var/time_passed = world.time
var/mission = input("Assign a mission to the deathsquad", "Assign Mission", "Leave no witnesses.")
- var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered for an elite Nanotrasen Strike Team?", "deathsquad", null)
- var/squadSpawned = 0
- if(candidates.len >= 2) //Minimum 2 to be considered a squad
+ //Generates a list of commandos from active ghosts. Then the user picks which characters to respawn as the commandos.
+ for(var/mob/dead/observer/G in player_list)
+ spawn(0)
+ switch(alert(G,"Do you wish to be considered for an elite Nanotrasen strike team being sent in?","Please answer in 30 seconds!","Yes","No"))
+ if("Yes")
+ if((world.time-time_passed)>300)//If more than 30 game seconds passed.
+ return
+ candidates += G
+ if("No")
+ return
+ else
+ return
+ sleep(300)
+
+ for(var/mob/dead/observer/G in candidates)
+ if(!G.key)
+ candidates.Remove(G)
+
+ if(candidates.len >= 3) //Minimum 3 to be considered a squad
//Pick the lucky players
var/numagents = min(5,candidates.len) //How many commandos to spawn
var/list/spawnpoints = deathsquadspawn
- while(numagents && candidates.len)
- if (numagents > spawnpoints.len)
- numagents--
- continue // This guy's unlucky, not enough spawn points, we skip him.
- var/spawnloc = spawnpoints[numagents]
+ while(numagents && spawnpoints.len && candidates.len)
+ var/spawnloc = spawnpoints[1]
var/mob/dead/observer/chosen_candidate = pick(candidates)
candidates -= chosen_candidate
if(!chosen_candidate.key)
@@ -366,13 +396,10 @@ client/proc/one_click_antag()
if(numagents == 1)
message_admins("The deathsquad has spawned with the mission: [mission].")
log_game("[key_name(Commando)] has been selected as a Death Commando")
+ spawnpoints -= spawnloc
numagents--
- squadSpawned++
- if (squadSpawned)
- return 1
- else
- return 0
+ return 1
return
@@ -411,19 +438,34 @@ client/proc/one_click_antag()
// EMERGENCY RESPONSE TEAM
/datum/admins/proc/makeEmergencyresponseteam()
+ var/list/mob/dead/observer/candidates = list()
+ var/time_passed = world.time
var/mission = input("Assign a mission to the Emergency Response Team", "Assign Mission", "Assist the station.")
- var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered for an elite Nanotrasen Emergency Response Team?", "deathsquad", null)
- var/teamSpawned = 0
+
+ //Generates a list of officers from active ghosts. Then the user picks which characters to respawn as the officers.
+ for(var/mob/dead/observer/G in player_list)
+ spawn(0)
+ switch(alert(G,"Do you wish to be considered for an elite Nanotrasen Emergency Response Team being sent in?","Please answer in 30 seconds!","Yes","No"))
+ if("Yes")
+ if((world.time-time_passed)>300)//If more than 30 game seconds passed.
+ return
+ candidates += G
+ if("No")
+ return
+ else
+ return
+ sleep(300)
+
+ for(var/mob/dead/observer/G in candidates)
+ if(!G.key)
+ candidates.Remove(G)
if(candidates.len >= 4) //Minimum 4 to be considered a squad
//Pick the (un)lucky players
var/numagents = min(7,candidates.len) //How many officers to spawn
var/list/spawnpoints = emergencyresponseteamspawn
- while(numagents && candidates.len)
- if (numagents > spawnpoints.len)
- numagents--
- continue // This guy's unlucky, not enough spawn points, we skip him.
- var/spawnloc = spawnpoints[numagents]
+ while(numagents && spawnpoints.len && candidates.len)
+ var/spawnloc = spawnpoints[1]
var/mob/dead/observer/chosen_candidate = pick(candidates)
candidates -= chosen_candidate
if(!chosen_candidate.key)
@@ -438,22 +480,13 @@ client/proc/one_click_antag()
if(1)
ERTOperative.real_name = "Commander [pick(lastname)]"
equip_emergencyresponsesquad(ERTOperative, "commander")
- if(2)
- ERTOperative.real_name = "Security Officer [pick(lastname)]"
- equip_emergencyresponsesquad(ERTOperative, "sec")
- if(3)
- ERTOperative.real_name = "Medical Officer [pick(lastname)]"
- equip_emergencyresponsesquad(ERTOperative, "med")
- if(4)
- ERTOperative.real_name = "Engineer [pick(lastname)]"
- equip_emergencyresponsesquad(ERTOperative, "eng")
- if(5)
+ if(2 || 5)
ERTOperative.real_name = "Security Officer [pick(lastname)]"
equip_emergencyresponsesquad(ERTOperative, "sec")
- if(6)
+ if(3 || 6)
ERTOperative.real_name = "Medical Officer [pick(lastname)]"
equip_emergencyresponsesquad(ERTOperative, "med")
- if(7)
+ if(4 || 7)
ERTOperative.real_name = "Engineer [pick(lastname)]"
equip_emergencyresponsesquad(ERTOperative, "eng")
ERTOperative.key = chosen_candidate.key
@@ -482,94 +515,12 @@ client/proc/one_click_antag()
if(numagents == 1)
message_admins("The emergency response team has spawned with the mission: [mission].")
log_game("[key_name(ERTOperative)] has been selected as an Emergency Response Officer")
+ spawnpoints -= spawnloc
numagents--
- teamSpawned++
-
- if (teamSpawned)
- return 1
- else
- return 0
-
- return
-
-//Abductors
-/datum/admins/proc/makeAbductorTeam()
- var/list/mob/dead/observer/candidates = getCandidates("Do you wish to be considered for an Abductor Team?", "abductor", null)
-
- if(candidates.len >= 2)
- //Oh god why we can't have static functions
- var/teams_finished = 0
- if(ticker.mode.config_tag == "abductor")
- var/datum/game_mode/abduction/A = ticker.mode
- teams_finished = A.teams
- else
- teams_finished = round(ticker.mode.abductors.len / 2)
- var/number = teams_finished + 1
-
- var/datum/game_mode/abduction/temp = new
-
- var/agent_mind = pick(candidates)
- candidates -= agent_mind
- var/scientist_mind = pick(candidates)
-
- var/mob/living/carbon/human/agent=makeBody(agent_mind)
- var/mob/living/carbon/human/scientist=makeBody(scientist_mind)
-
- agent_mind = agent.mind
- scientist_mind = scientist.mind
-
- temp.scientists.len = number
- temp.agents.len = number
- temp.abductors.len = 2*number
- temp.team_objectives.len = number
- temp.team_names.len = number
- temp.scientists[number] = scientist_mind
- temp.agents[number] = agent_mind
- temp.abductors = list(agent_mind,scientist_mind)
- temp.make_abductor_team(number)
- temp.post_setup_team(number)
- ticker.mode.abductors += temp.abductors
- if(ticker.mode.config_tag == "abductor")
- var/datum/game_mode/abduction/A = ticker.mode
- A.teams += 1
return 1
- else
- return
-
-/datum/admins/proc/getCandidates(var/Question, var/jobbanType, var/datum/game_mode/gametypeCheck)
- var/list/mob/dead/observer/candidates = list()
- var/time_passed = world.time
- if (!Question)
- Question = "Would you like to be a special role?"
-
- for(var/mob/dead/observer/G in player_list)
- if(!G.key || !G.client)
- continue
- if (gametypeCheck)
- if(!gametypeCheck.age_check(G.client))
- continue
- if (jobbanType)
- if(jobban_isbanned(G, jobbanType) || jobban_isbanned(G, "Syndicate"))
- continue
- spawn(0)
- switch(alert(G,Question,"Please answer in 30 seconds!","Yes","No"))
- if("Yes")
- if((world.time-time_passed)>300)//If more than 30 game seconds passed.
- return
- candidates += G
- if("No")
- return
- else
- return
- sleep(300)
- //Check all our candidates, to make sure they didn't log off during the 30 second wait period.
- for(var/mob/dead/observer/G in candidates)
- if(!G.key || !G.client)
- candidates.Remove(G)
-
- return candidates
+ return
/datum/admins/proc/makeBody(var/mob/dead/observer/G_found) // Uses stripped down and bastardized code from respawn character
if(!G_found || !G_found.key) return
diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm
index 22f77f0e64325..8127159f7a075 100644
--- a/code/modules/admin/verbs/playsound.dm
+++ b/code/modules/admin/verbs/playsound.dm
@@ -13,7 +13,7 @@ var/sound/admin_sound
log_admin("[key_name(src)] played sound [S]")
message_admins("[key_name_admin(src)] played sound [S]")
- if(SSevent.holidays && SSevent.holidays[APRIL_FOOLS])
+ if(SSevent.holiday == "April Fool's Day")
admin_sound.frequency = pick(0.5, 0.7, 0.8, 0.85, 0.9, 0.95, 1.1, 1.2, 1.4, 1.6, 2.0, 2.5)
src << "You feel the Honkmother messing with your song..."
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 7755e8829650a..b6744547513c1 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -33,7 +33,7 @@
if(usr)
if (usr.client)
if(usr.client.holder)
- M << "You hear [ticker.Bible_deity_name ? "the voice of " + ticker.Bible_deity_name : "a voice"] in your head... [msg]"
+ M << "You hear a voice in your head... [msg]"
log_admin("SubtlePM: [key_name(usr)] -> [key_name(M)] : [msg]")
message_admins(" SubtleMessage: [key_name_admin(usr)] -> [key_name_admin(M)] : [msg]")
@@ -707,7 +707,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
set category = "Special Verbs"
set name = "Attack Log"
- usr << "Attack Log for [mob]"
+ usr << text("Attack Log for []", mob)
for(var/t in M.attack_log)
usr << t
feedback_add_details("admin_verb","ATTL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm
index 38bdb41d43bf8..c1dcfa30e927f 100644
--- a/code/modules/assembly/mousetrap.dm
+++ b/code/modules/assembly/mousetrap.dm
@@ -57,7 +57,7 @@
H.updatehealth()
else if(ismouse(target))
var/mob/living/simple_animal/mouse/M = target
- visible_message("SPLAT!")
+ visible_message("SPLAT!")
M.splat()
playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
armed = 0
@@ -104,10 +104,8 @@
triggered(H)
H.visible_message("[H] accidentally steps on [src].", \
"You accidentally step on [src]")
- else if(isanimal(AM))
- var/mob/living/simple_animal/SA = AM
- if(!SA.flying)
- triggered(AM)
+ else if(ismouse(AM))
+ triggered(AM)
else if(AM.density) // For mousetrap grenades, set off by anything heavy
triggered(AM)
..()
diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm
index e28da00a53513..c85e9eb522281 100644
--- a/code/modules/assembly/signaler.dm
+++ b/code/modules/assembly/signaler.dm
@@ -159,7 +159,7 @@ Code:
return 1
/obj/item/device/assembly/signaler/reciever/describe()
- return "The radio receiver is [on?"on":"off"]."
+ return "The radio reciever is [on?"on":"off"]."
/obj/item/device/assembly/signaler/reciever/receive_signal(datum/signal/signal)
if(!on) return
diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm
index 1042d781a0c96..3706dd5fdf95b 100644
--- a/code/modules/assembly/voice.dm
+++ b/code/modules/assembly/voice.dm
@@ -7,13 +7,10 @@
origin_tech = "magnets=1"
flags = HEAR
attachable = 1
- verb_say = "beeps"
- verb_ask = "beeps"
- verb_exclaim = "beeps"
var/listening = 0
var/recorded = "" //the activation message
-/obj/item/device/assembly/voice/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans)
+/obj/item/device/assembly/voice/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq)
if(speaker == src)
return
@@ -31,6 +28,9 @@
listening = !listening
say("[listening ? "Now" : "No longer"] recording input.")
+/obj/machinery/vending/say_quote(text)
+ return "beeps, \"[text]\""
+
/obj/item/device/assembly/voice/attack_self(mob/user)
if(!user)
return 0
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index c52adc42c2c61..703962ae3ba41 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -105,10 +105,10 @@
icon_state = "grey baby slime" //sets the icon in the map editor
/obj/effect/landmark/corpse/slimeCorpse/createCorpse() //proc creates a dead slime
- var/A = locate(/mob/living/simple_animal/slime/) in loc //variable A looks for a slime at the location of the landmark
+ var/A = locate(/mob/living/carbon/slime/) in loc //variable A looks for a slime at the location of the landmark
if(A) //if variable A is true
return //stop executing the proc
- var/mob/living/simple_animal/slime/M = new(src.loc) //variable M is a new slime at the location of the landmark
+ var/mob/living/carbon/slime/M = new(src.loc) //variable M is a new slime at the location of the landmark
M.colour = src.mobcolour //slime colour is set by landmark's mobcolour var
M.adjustToxLoss(9001) //kills the slime, death() doesn't update its icon correctly
qdel(src)
@@ -196,7 +196,7 @@
corpseidaccess = "Station Engineer"
/obj/effect/landmark/corpse/engineer/rig
- corpsesuit = /obj/item/clothing/suit/space/hardsuit/engine
+ corpsesuit = /obj/item/clothing/suit/space/hardsuit
corpsemask = /obj/item/clothing/mask/breath
/obj/effect/landmark/corpse/clown
diff --git a/code/modules/awaymissions/mission_code/stationCollision.dm b/code/modules/awaymissions/mission_code/stationCollision.dm
index f6d98d784dc85..b8cfb519a5041 100644
--- a/code/modules/awaymissions/mission_code/stationCollision.dm
+++ b/code/modules/awaymissions/mission_code/stationCollision.dm
@@ -132,7 +132,7 @@ var/sc_safecode5 = "[rand(0,9)]"
Our on-board spy has learned the code and has hidden away a few copies of the code around the station. Unfortunatly he has been captured by security
Your objective is to split up, locate any of the papers containing the captain's safe code, open the safe and
- secure anything found inside. If possible, recover the imprisioned syndicate operative and receive the code from him.
+ secure anything found inside. If possible, recover the imprisioned syndicate operative and recieve the code from him.
As always, eliminate anyone who gets in the way.
diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm
index f578a34ce140a..a9debf6f52403 100644
--- a/code/modules/awaymissions/zlevel.dm
+++ b/code/modules/awaymissions/zlevel.dm
@@ -3,7 +3,7 @@ proc/createRandomZlevel()
return
var/list/potentialRandomZlevels = list()
- world << "Searching for away missions..."
+ world << "Searching for away missions..."
var/list/Lines = file2list("_maps/RandomZLevels/fileList.txt")
if(!Lines.len) return
for (var/t in Lines)
@@ -33,7 +33,7 @@ proc/createRandomZlevel()
if(potentialRandomZlevels.len)
- world << "Loading away mission..."
+ world << "Loading away mission..."
var/map = pick(potentialRandomZlevels)
var/file = file(map)
@@ -46,8 +46,8 @@ proc/createRandomZlevel()
continue
awaydestinations.Add(L)
- world << "Away mission loaded."
+ world << "Away mission loaded."
else
- world << "No away missions found."
+ world << "No away missions found."
return
\ No newline at end of file
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index 2fc40207bab5b..05620a4039d93 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -2,7 +2,7 @@
//SECURITY//
////////////
#define TOPIC_SPAM_DELAY 2 //2 ticks is about 2/10ths of a second; it was 4 ticks, but that caused too many clicks to be lost due to lag
-#define UPLOAD_LIMIT 1048576 //Restricts client uploads to the server to 1MB //Could probably do with being lower.
+#define UPLOAD_LIMIT 10485760 //Restricts client uploads to the server to 10MB
#define MIN_CLIENT_VERSION 0 //Just an ambiguously low version for now, I don't want to suddenly stop people playing.
//I would just like the code ready should it ever need to be used.
/*
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index bd3044071c4df..c579b223bfcf9 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -17,8 +17,7 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
"ninja", //10
"monkey" = /datum/game_mode/monkey, //11
"gangster" = /datum/game_mode/gang, //12
- "shadowling" = /datum/game_mode/shadowling, //13
- "abductor" = /datum/game_mode/abduction //14
+ "shadowling" = /datum/game_mode/shadowling //13
)
@@ -724,10 +723,13 @@ datum/preferences
if(result)
var/newtype = roundstart_species[result]
pref_species = new newtype()
- if(mutant_color == "#000")
+ if(!config.mutant_colors || mutant_color == "#000")
mutant_color = pref_species.default_color
if("mutant_color")
+ if(!config.mutant_colors)
+ user << "Alien colors are disabled."
+ return
var/new_mutantcolor = input(user, "Choose your character's alien skin color:", "Character Preference") as color|null
if(new_mutantcolor)
var/temp_hsv = RGBtoHSV(new_mutantcolor)
@@ -808,7 +810,7 @@ datum/preferences
if("ghost_whispers")
chat_toggles ^= CHAT_GHOSTWHISPER
-
+
if("ghost_radio")
chat_toggles ^= CHAT_GHOSTRADIO
@@ -888,5 +890,11 @@ datum/preferences
backbag = 1 //Same as above
character.backbag = backbag
- character.update_body()
- character.update_hair()
+ /*
+ //Debugging report to track down a bug, which randomly assigned the plural gender to people.
+ if(character.gender in list(PLURAL, NEUTER))
+ if(isliving(src)) //Ghosts get neuter by default
+ message_admins("[character] ([character.ckey]) has spawned with their gender as plural or neuter. Please notify coders.")
+ character.gender = MALE
+ */
+
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 604bbd57069dc..7a6b35e400845 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -2,7 +2,7 @@
#define SAVEFILE_VERSION_MIN 8
//This is the current version, anything below this will attempt to update (if it's not obsolete)
-#define SAVEFILE_VERSION_MAX 11
+#define SAVEFILE_VERSION_MAX 10
/*
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
This proc checks if the current directory of the savefile S needs updating
@@ -33,9 +33,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
/datum/preferences/proc/update_preferences(current_version)
if(current_version < 10)
toggles |= MEMBER_PUBLIC
- if(current_version < 11)
- chat_toggles = TOGGLES_DEFAULT_CHAT
- toggles = TOGGLES_DEFAULT
+ return
//should this proc get fairly long (say 3 versions long),
//just increase SAVEFILE_VERSION_MIN so it's not as far behind
diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm
index 712d14979b1fa..52b9329094df3 100644
--- a/code/modules/client/preferences_toggles.dm
+++ b/code/modules/client/preferences_toggles.dm
@@ -57,7 +57,7 @@
/client/proc/toggleadminhelpsound()
set name = "Hear/Silence Adminhelps"
set category = "Preferences"
- set desc = "Toggle hearing a notification when admin PMs are received"
+ set desc = "Toggle hearing a notification when admin PMs are recieved"
if(!holder) return
prefs.toggles ^= SOUND_ADMINHELP
prefs.save_preferences()
@@ -157,34 +157,6 @@
src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
feedback_add_details("admin_verb","TAmbi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-// This needs a toggle because you people are awful and spammed terrible music
-/client/verb/toggle_instruments()
- set name = "Hear/Silence Instruments"
- set category = "Preferences"
- set desc = "Toggles hearing musical instruments like the violin and piano"
- prefs.toggles ^= SOUND_INSTRUMENTS
- prefs.save_preferences()
- if(prefs.toggles & SOUND_INSTRUMENTS)
- src << "You will now hear people playing musical instruments."
- else
- src << "You will no longer hear musical instruments."
- feedback_add_details("admin_verb","TInstru") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-//Lots of people get headaches from the normal ship ambience, this is to prevent that
-/client/verb/toggle_ship_ambience()
- set name = "Hear/Silence Ship Ambience"
- set category = "Preferences"
- set desc = "Toggles hearing generalized ship ambience, no matter your area."
- prefs.toggles ^= SOUND_SHIP_AMBIENCE
- prefs.save_preferences()
- if(prefs.toggles & SOUND_SHIP_AMBIENCE)
- src << "You will now hear ship ambience."
- else
- src << "You will no longer hear ship ambience."
- src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
- src.ambience_playing = 0
- feedback_add_details("admin_verb", "SAmbi") //If you are copy-pasting this, I bet you read this comment expecting to see the same thing :^)
-
//be special
/client/verb/toggle_be_special(role in be_special_flags)
set name = "Toggle SpecialRole Candidacy"
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index ac18e4dc922b5..02f9bcfe7b4be 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -8,13 +8,6 @@
lefthand_file = 'icons/mob/inhands/clothing_lefthand.dmi'
righthand_file = 'icons/mob/inhands/clothing_righthand.dmi'
var/alt_desc = null
- var/toggle_message = null
- var/alt_toggle_message = null
- var/activation_sound = null
- var/toggle_cooldown = null
- var/cooldown = 0
- var/obj/item/device/flashlight/F = null
- var/can_flashlight = 0
//Ears: currently only used for headsets and earmuffs
/obj/item/clothing/ears
@@ -84,7 +77,6 @@ BLIND // can't see anything
body_parts_covered = HEAD
slot_flags = SLOT_HEAD
var/blockTracking = 0 //For AI tracking
- var/can_toggle = null
//Mask
/obj/item/clothing/mask
@@ -92,6 +84,7 @@ BLIND // can't see anything
icon = 'icons/obj/clothing/masks.dmi'
body_parts_covered = HEAD
slot_flags = SLOT_MASK
+ var/alloweat = 0
strip_delay = 40
put_on_delay = 40
var/mask_adjusted = 0
@@ -105,7 +98,7 @@ BLIND // can't see anything
//Proc that moves gas/breath masks out of the way, disabling them and allowing pill/food consumption
/obj/item/clothing/mask/proc/adjustmask(var/mob/user)
if(!ignore_maskadjust)
- if(user.incapacitated())
+ if(!user.canmove || user.stat || user.restrained())
return
if(src.mask_adjusted == 1)
src.icon_state = initial(icon_state)
@@ -130,7 +123,6 @@ BLIND // can't see anything
-
//Shoes
/obj/item/clothing/shoes
name = "shoes"
@@ -338,8 +330,7 @@ atom/proc/generate_female_clothing(index,t_color,icon,type)
usr << "You adjust the suit back to normal."
src.adjusted = 0
else
- if(src.fitted != FEMALE_UNIFORM_TOP)
- src.fitted = NO_FEMALE_UNIFORM
+ src.fitted = NO_FEMALE_UNIFORM
src.item_color += "_d"
usr << "You adjust the suit to wear it more casually."
src.adjusted = 1
@@ -412,4 +403,3 @@ atom/proc/generate_female_clothing(index,t_color,icon,type)
if(!user.stat && user.canmove && !user.restrained())
return 1
return 0
-
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index 51f560c29f907..bb52cd01980fc 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -4,7 +4,7 @@
icon_state = "meson"
item_state = "meson"
origin_tech = "magnets=2;engineering=2"
- darkness_view = 2
+ darkness_view = 1
vision_flags = SEE_TURFS
invis_view = SEE_INVISIBLE_MINIMUM
@@ -15,17 +15,6 @@
item_state = "nvgmeson"
darkness_view = 8
-/obj/item/clothing/glasses/meson/gar
- name = "gar mesons"
- icon_state = "garm"
- item_state = "garm"
- desc = "Do the impossible, see the invisible!"
- force = 10
- throwforce = 10
- throw_speed = 4
- attack_verb = list("sliced")
- hitsound = 'sound/weapons/bladeslice.ogg'
-
/obj/item/clothing/glasses/science
name = "Science Goggles"
desc = "A pair of snazzy goggles used to protect against chemical spills."
@@ -89,44 +78,6 @@
flash_protect = 1
tint = 1
-/obj/item/clothing/glasses/sunglasses/garb
- desc = "Go beyond impossible and kick reason to the curb!"
- name = "black gar glasses"
- icon_state = "garb"
- item_state = "garb"
- force = 10
- throwforce = 10
- throw_speed = 4
- attack_verb = list("sliced")
- hitsound = 'sound/weapons/bladeslice.ogg'
-
-/obj/item/clothing/glasses/sunglasses/garb/supergarb
- desc = "Believe in us humans."
- name = "black giga gar glasses"
- icon_state = "supergarb"
- item_state = "garb"
- force = 12
- throwforce = 12
-
-/obj/item/clothing/glasses/sunglasses/gar
- desc = "Just who the hell do you think I am?!"
- name = "gar glasses"
- icon_state = "gar"
- item_state = "gar"
- force = 10
- throwforce = 10
- throw_speed = 4
- attack_verb = list("sliced")
- hitsound = 'sound/weapons/bladeslice.ogg'
-
-/obj/item/clothing/glasses/sunglasses/gar/supergar
- desc = "We evolve past the person we were a minute before. Little by little we advance with each turn. That's how a drill works!"
- name = "giga gar glasses"
- icon_state = "supergar"
- item_state = "gar"
- force = 12
- throwforce = 12
-
/obj/item/clothing/glasses/welding
name = "welding goggles"
desc = "Protects the eyes from welders; approved by the mad scientist association."
@@ -178,8 +129,8 @@
emp_act(severity)
if(istype(src.loc, /mob/living/carbon/human))
var/mob/living/carbon/human/M = src.loc
+ M << "The Optical Thermal Scanner overloads and blinds you!"
if(M.glasses == src)
- M << "The Optical Thermal Scanner overloads and blinds you!"
M.eye_blind = 3
M.eye_blurry = 5
M.disabilities |= NEARSIGHT
@@ -204,29 +155,4 @@
name = "Optical Thermal Eyepatch"
desc = "An eyepatch with built-in thermal optics."
icon_state = "eyepatch"
- item_state = "eyepatch"
-
-/obj/item/clothing/glasses/cold
- name = "cold goggles"
- desc = "A pair of goggles meant for low temperatures."
- icon_state = "cold"
- item_state = "cold"
-
-obj/item/clothing/glasses/heat
- name = "heat goggles"
- desc = "A pair of goggles meant for high temperatures."
- icon_state = "heat"
- item_state = "heat"
-
-obj/item/clothing/glasses/orange
- name = "orange glasses"
- desc = "A sweet pair of orange shades."
- icon_state = "orangeglasses"
- item_state = "orangeglasses"
-
-obj/item/clothing/glasses/red
- name = "red glasses"
- desc = "A sweet pair of red shades."
- icon_state = "redglasses"
- item_state = "redglasses"
-
+ item_state = "eyepatch"
\ No newline at end of file
diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm
index 6cbd4620382e0..012a260bba51f 100644
--- a/code/modules/clothing/glasses/hud.dm
+++ b/code/modules/clothing/glasses/hud.dm
@@ -6,12 +6,12 @@
var/hud_type = null
/obj/item/clothing/glasses/hud/equipped(mob/living/carbon/human/user, slot)
- if(hud_type && slot == slot_glasses)
+ if(slot == slot_glasses)
var/datum/atom_hud/H = huds[hud_type]
H.add_hud_to(user)
/obj/item/clothing/glasses/hud/dropped(mob/living/carbon/human/user)
- if(hud_type && istype(user) && user.glasses == src)
+ if(istype(user) && user.glasses == src)
var/datum/atom_hud/H = huds[hud_type]
H.remove_hud_from(user)
@@ -65,79 +65,3 @@
emagged = 1
desc = desc + " The display flickers slightly."
-/obj/item/clothing/glasses/hud/security/sunglasses/gars
- name = "HUD gar glasses"
- desc = "GAR glasses with a HUD."
- icon_state = "gars"
- item_state = "garb"
- force = 10
- throwforce = 10
- throw_speed = 4
- attack_verb = list("sliced")
- hitsound = 'sound/weapons/bladeslice.ogg'
-
-/obj/item/clothing/glasses/hud/security/sunglasses/gars/supergars
- name = "giga HUD gar glasses"
- desc = "GIGA GAR glasses with a HUD."
- icon_state = "supergars"
- item_state = "garb"
- force = 12
- throwforce = 12
-
-/obj/item/clothing/glasses/hud/toggle
- name = "Toggle Hud"
- desc = "A hud with multiple functions."
- action_button_name = "Switch HUD"
-
-/obj/item/clothing/glasses/hud/toggle/attack_self(mob/user)
- if(!ishuman(user))
- return
- var/mob/living/carbon/human/wearer = user
- if (wearer.glasses != src)
- return
-
- if (hud_type)
- var/datum/atom_hud/H = huds[hud_type]
- H.remove_hud_from(user)
-
- if (hud_type == DATA_HUD_MEDICAL_ADVANCED)
- hud_type = null
- else if (hud_type == DATA_HUD_SECURITY_ADVANCED)
- hud_type = DATA_HUD_MEDICAL_ADVANCED
- else
- hud_type = DATA_HUD_SECURITY_ADVANCED
-
- if (hud_type)
- var/datum/atom_hud/H = huds[hud_type]
- H.add_hud_to(user)
-
-/obj/item/clothing/glasses/hud/toggle/thermal
- name = "Thermal HUD Scanner"
- desc = "Thermal imaging HUD in the shape of glasses."
- icon_state = "thermal"
- hud_type = DATA_HUD_SECURITY_ADVANCED
- vision_flags = SEE_MOBS
- invis_view = 2
-
-/obj/item/clothing/glasses/hud/toggle/thermal/attack_self(mob/user)
- ..()
- switch (hud_type)
- if (DATA_HUD_MEDICAL_ADVANCED)
- icon_state = "meson"
- if (DATA_HUD_SECURITY_ADVANCED)
- icon_state = "thermal"
- else
- icon_state = "purple"
- user.update_inv_glasses()
-
-/obj/item/clothing/glasses/hud/toggle/thermal/emp_act(severity)
- if(istype(src.loc, /mob/living/carbon/human))
- var/mob/living/carbon/human/M = src.loc
- if(M.glasses == src)
- M << "The [src] overloads and blinds you!"
- M.eye_blind = 3
- M.eye_blurry = 5
- M.disabilities |= NEARSIGHT
- spawn(100)
- M.disabilities &= ~NEARSIGHT
- ..()
\ No newline at end of file
diff --git a/code/modules/clothing/gloves/ninja.dm b/code/modules/clothing/gloves/ninja.dm
new file mode 100644
index 0000000000000..d7ac558140e99
--- /dev/null
+++ b/code/modules/clothing/gloves/ninja.dm
@@ -0,0 +1,104 @@
+/*
+ Dear ninja gloves
+
+ This isn't because I like you
+ this is because your father is a bastard
+
+ ...
+ I guess you're a little cool.
+ -Sayu
+*/
+
+/obj/item/clothing/gloves/space_ninja
+ desc = "These nano-enhanced gloves insulate from electricity and provide fire resistance."
+ name = "ninja gloves"
+ icon_state = "s-ninja"
+ item_state = "s-ninja"
+ siemens_coefficient = 0
+ cold_protection = HANDS
+ min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
+ heat_protection = HANDS
+ max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
+ strip_delay = 120
+ var/draining = 0
+ var/candrain = 0
+ var/mindrain = 200
+ var/maxdrain = 400
+
+/*
+ This runs the gamut of what ninja gloves can do
+ The other option would be a dedicated ninja touch bullshit proc on everything
+ which would probably more efficient, but ninjas are pretty rare.
+ This was mostly introduced to keep ninja code from contaminating other code;
+ with this in place it would be easier to untangle the rest of it.
+
+ For the drain proc, see events/ninja.dm
+*/
+/obj/item/clothing/gloves/space_ninja/Touch(var/atom/A,var/proximity)
+ if(!candrain || draining) return 0
+
+ var/mob/living/carbon/human/H = loc
+ if(!istype(H)) return 0 // what
+ var/obj/item/clothing/suit/space/space_ninja/suit = H.wear_suit
+ if(!istype(suit)) return 0
+ if(isturf(A)) return 0
+
+ if(!proximity) // todo: you could add ninja stars or computer hacking here
+ return 0
+
+ A.add_fingerprint(H)
+
+ // steal energy from powered things
+ if(istype(A,/mob/living/silicon/robot))
+ drain("CYBORG",A,suit)
+ return 1
+
+ if(istype(A,/obj/machinery/power/apc))
+ drain("APC",A,suit)
+ return 1
+
+ if(istype(A,/obj/structure/cable))
+ drain("WIRE",A,suit)
+ return 1
+
+ if(istype(A,/obj/structure/grille))
+ var/obj/structure/cable/C = locate() in A.loc
+ if(C)
+ drain("WIRE",C,suit)
+ return 1
+
+ if(istype(A,/obj/machinery/power/smes))
+ drain("SMES",A,suit)
+ return 1
+
+ if(istype(A,/obj/mecha))
+ drain("MECHA",A,suit)
+ return 1
+
+ if(istype(A,/obj/machinery/computer/rdconsole)) // download research
+ drain("RESEARCH",A,suit)
+ return 1
+
+ if(istype(A,/obj/machinery/r_n_d/server))
+ A.add_fingerprint(H)
+ var/obj/machinery/r_n_d/server/S = A
+ if(S.disabled)
+ return 1
+ if(S.shocked)
+ S.shock(H,50)
+ return 1
+ drain("RESEARCH",A,suit)
+ return 1
+
+ //do AI transfers
+ if(istype(A,/mob/living/silicon/ai))
+ suit.NAI.transfer_ai("AICORE", "AICARD", A, H)
+ return 1
+
+ if(istype(A,/obj/structure/AIcore/deactivated))
+ suit.NAI.transfer_ai("INACTIVE","AICARD",A, H)
+ return 1
+
+ if(istype(A,/obj/machinery/computer/aifixer))
+ suit.NAI.transfer_ai("AIFIXER","AICARD",A, H)
+ return 1
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 4fbd2b6b832a6..d1b15282247a5 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -11,28 +11,6 @@
heat_protection = HEAD
max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT
strip_delay = 60
- var/obj/machinery/camera/portable/helmetCam = null
- var/spawnWithHelmetCam = 0
- var/canAttachCam = 0
-
-
-/obj/item/clothing/head/helmet/New()
- ..()
- if(spawnWithHelmetCam)
- helmetCam = new /obj/machinery/camera/portable(src)
- helmetCam.c_tag = "Helmet-Mounted Camera (No User)([rand(1,999)])"
- helmetCam.network = list("SS13")
- update_icon()
-
-/obj/item/clothing/head/helmet/emp_act(severity)
- if(helmetCam) //Transfer the EMP to the camera so you can still disable it this way.
- helmetCam.emp_act(severity)
- ..()
-
-/obj/item/clothing/head/helmet/sec
- spawnWithHelmetCam = 1
- canAttachCam = 1
- can_flashlight = 1
/obj/item/clothing/head/helmet/alt
name = "bulletproof helmet"
@@ -46,9 +24,6 @@
desc = "It's a helmet specifically designed to protect against close range attacks."
icon_state = "riot"
item_state = "helmet"
- toggle_message = "You pull the visor down on"
- alt_toggle_message = "You push the visor up on"
- can_toggle = 1
flags = HEADCOVERSEYES|HEADCOVERSMOUTH|HEADBANGPROTECT
armor = list(melee = 82, bullet = 15, laser = 5,energy = 5, bomb = 5, bio = 2, rad = 0)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
@@ -56,48 +31,23 @@
action_button_name = "Toggle Helmet Visor"
visor_flags = HEADCOVERSEYES|HEADCOVERSMOUTH
visor_flags_inv = HIDEMASK|HIDEEYES|HIDEFACE
- toggle_cooldown = 0
-/obj/item/clothing/head/helmet/attack_self()
- if(usr.canmove && !usr.stat && !usr.restrained() && can_toggle)
- if(world.time > cooldown + toggle_cooldown)
- cooldown = world.time
- if(up)
- up = !up
- flags |= (visor_flags)
- flags_inv |= (visor_flags_inv)
- icon_state = initial(icon_state)
- usr << "[toggle_message] \the [src]."
- usr.update_inv_head(0)
- else
- up = !up
- flags &= ~(visor_flags)
- flags_inv &= ~(visor_flags_inv)
- icon_state = "[initial(icon_state)]up"
- usr << "[alt_toggle_message] \the [src]"
- usr.update_inv_head(0)
- while(up)
- playsound(src.loc, "[activation_sound]", 100, 0, 4)
- sleep(15)
-
-/obj/item/clothing/head/helmet/justice
- name = "helmet of justice"
- desc = "WEEEEOOO. WEEEEEOOO. WEEEEOOOO."
- icon_state = "justice"
- toggle_message = "You turn off the lights on"
- alt_toggle_message = "You turn on the lights on"
- action_button_name = "Toggle Justice Lights"
- can_toggle = 1
- toggle_cooldown = 14
- activation_sound = 'sound/items/WEEOO1.ogg'
-
-/obj/item/clothing/head/helmet/justice/escape
- name = "alarm helmet"
- desc = "WEEEEOOO. WEEEEEOOO. STOP THAT MONKEY. WEEEOOOO."
- icon_state = "justice2"
- toggle_message = "You turn off the light on"
- alt_toggle_message = "You turn on the light on"
- action_button_name = "Toggle Alarm Lights"
+/obj/item/clothing/head/helmet/riot/attack_self()
+ if(usr.canmove && !usr.stat && !usr.restrained())
+ if(up)
+ up = !up
+ flags |= (visor_flags)
+ flags_inv |= (visor_flags_inv)
+ icon_state = initial(icon_state)
+ usr << "You pull \the [src] down."
+ usr.update_inv_head(0)
+ else
+ up = !up
+ flags &= ~(visor_flags)
+ flags_inv &= ~(visor_flags_inv)
+ icon_state = "[initial(icon_state)]up"
+ usr << "You push \the [src] up."
+ usr.update_inv_head(0)
/obj/item/clothing/head/helmet/swat
name = "\improper SWAT helmet"
@@ -165,151 +115,3 @@ obj/item/clothing/head/helmet/bluetaghelm
armor = list(melee = 30, bullet = 10, laser = 20,energy = 10, bomb = 20, bio = 0, rad = 0)
// Offer about the same protection as a hardhat.
flags_inv = HIDEEARS|HIDEEYES
-
-//LightToggle
-
-/obj/item/clothing/head/helmet/update_icon()
-
- var/state = "[initial(icon_state)]"
- if(helmetCam)
- state += "-cam" //"helmet-cam"
- if(F)
- if(F.on)
- state += "-flight-on" //"helmet-flight-on" // "helmet-cam-flight-on"
- else
- state += "-flight" //etc.
-
- icon_state = state
-
- if(istype(loc, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = loc
- H.update_inv_head(0)
-
- return
-
-/obj/item/clothing/head/helmet/ui_action_click()
- toggle_helmlight()
- ..()
-
-/obj/item/clothing/head/helmet/attackby(var/obj/item/A as obj, mob/user as mob, params)
- if(istype(A, /obj/item/device/flashlight/seclite))
- var/obj/item/device/flashlight/seclite/S = A
- if(can_flashlight)
- if(!F)
- user.drop_item()
- user << "You click [S] into place on [src]."
- if(S.on)
- SetLuminosity(0)
- F = S
- A.loc = src
- update_icon()
- update_helmlight(user)
- verbs += /obj/item/clothing/head/helmet/proc/toggle_helmlight
- return
-
- if(istype(A, /obj/item/weapon/screwdriver))
- if(F)
- for(var/obj/item/device/flashlight/seclite/S in src)
- user << "You unscrew the seclite from [src]."
- F = null
- S.loc = get_turf(user)
- update_helmlight(user)
- S.update_brightness(user)
- update_icon()
- usr.update_inv_head(0)
- verbs -= /obj/item/clothing/head/helmet/proc/toggle_helmlight
- return
-
-
- if(istype(A, /obj/item/weapon/camera_assembly))
- if(!canAttachCam)
- user << "You can't attach [A] to [src]!"
- return
- if(helmetCam)
- user << "[src] already has a mounted camera."
- return
- user.drop_item()
- helmetCam = new /obj/machinery/camera/portable(src)
- helmetCam.assembly = A
- A.loc = helmetCam
- helmetCam.c_tag = "Helmet-Mounted Camera (No User)([rand(1,999)])"
- helmetCam.network = list("SS13")
- update_icon()
- user.visible_message("[user] attaches [A] to [src]","You attach [A] to [src]")
- return
-
- if(istype(A, /obj/item/weapon/crowbar))
- if(!helmetCam)
- ..()
- return
- user.visible_message("[user] removes [helmetCam] from [src]","You remove [helmetCam] from [src]")
- helmetCam.assembly.loc = get_turf(src)
- helmetCam.assembly = null
- qdel(helmetCam)
- helmetCam = null
- update_icon()
- return
-
- ..()
- return
-
-/obj/item/clothing/head/helmet/proc/toggle_helmlight()
- set name = "Toggle Helmetlight"
- set category = "Object"
- set desc = "Click to toggle your helmet's attached flashlight."
-
- if(!F)
- return
-
- var/mob/living/carbon/human/user = usr
- if(!isturf(user.loc))
- user << "You cannot turn the light on while in this [user.loc]."
- F.on = !F.on
- user << "You toggle the helmetlight [F.on ? "on":"off"]."
-
- playsound(user, 'sound/weapons/empty.ogg', 100, 1)
- update_helmlight(user)
- return
-
-/obj/item/clothing/head/helmet/proc/update_helmlight(var/mob/user = null)
- if(F)
- action_button_name = "Toggle Helmetlight"
- if(F.on)
- if(loc == user)
- user.AddLuminosity(F.brightness_on)
- else if(isturf(loc))
- SetLuminosity(F.brightness_on)
- else
- if(loc == user)
- user.AddLuminosity(-F.brightness_on)
- else if(isturf(loc))
- SetLuminosity(0)
- update_icon()
- else
- action_button_name = null
- if(loc == user)
- user.AddLuminosity(-5)
- else if(isturf(loc))
- SetLuminosity(0)
- return
-
-/obj/item/clothing/head/helmet/pickup(mob/user)
- if(F)
- if(F.on)
- user.AddLuminosity(F.brightness_on)
- SetLuminosity(0)
-
-
-/obj/item/clothing/head/helmet/equipped(mob/user)
- if(helmetCam)
- spawn(10) //Gives time for the game to set a name (lol rhyme) to roundstart officers.
- helmetCam.c_tag = "Helmet-Mounted Camera ([user.name])([rand(1,999)])"
-
-/obj/item/clothing/head/helmet/dropped(mob/user)
- if(F)
- if(F.on)
- user.AddLuminosity(-F.brightness_on)
- SetLuminosity(F.brightness_on)
-
- if(helmetCam)
- helmetCam.c_tag = "Helmet-Mounted Camera (No User)([rand(1,999)])"
\ No newline at end of file
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 266bfda4689a2..2ac171d76de48 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -210,9 +210,4 @@
icon_state = "santahatnorm"
item_state = "that"
cold_protection = HEAD
- min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
-
-/obj/item/clothing/head/jester
- name = "jester hat"
- desc = "A hat with bells, to add some merryness to the suit."
- icon_state = "jester_hat"
+ min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
\ No newline at end of file
diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm
index 02fc5c460f7df..e16c312e45cb2 100644
--- a/code/modules/clothing/head/soft_caps.dm
+++ b/code/modules/clothing/head/soft_caps.dm
@@ -11,31 +11,19 @@
src.flipped=0
..()
- verb/flipcap()
+ verb/flip()
set category = "Object"
set name = "Flip cap"
-
- flip(usr)
-
-
-/obj/item/clothing/head/soft/AltClick(var/mob/user)
- flip(user)
-
-
-/obj/item/clothing/head/soft/proc/flip(var/mob/user)
- if(user.canmove && !user.stat && !user.restrained())
- src.flipped = !src.flipped
- if(src.flipped)
- icon_state = "[item_color]soft_flipped"
- user << "You flip the hat backwards."
- else
- icon_state = "[item_color]soft"
- user << "You flip the hat back in normal position."
- usr.update_inv_head(0) //so our mob-overlays update
-
-/obj/item/clothing/head/soft/examine(mob/user)
- ..()
- user << "Alt-click the cap to flip it [flipped ? "forwards" : "backwards"]."
+ set src in usr
+ if(usr.canmove && !usr.stat && !usr.restrained())
+ src.flipped = !src.flipped
+ if(src.flipped)
+ icon_state = "[item_color]soft_flipped"
+ usr << "You flip the hat backwards."
+ else
+ icon_state = "[item_color]soft"
+ usr << "You flip the hat back in normal position."
+ usr.update_inv_head(0) //so our mob-overlays update
/obj/item/clothing/head/soft/red
name = "red cap"
diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm
index da10a0170decc..d5ed2dc454a9a 100644
--- a/code/modules/clothing/masks/breath.dm
+++ b/code/modules/clothing/masks/breath.dm
@@ -15,17 +15,10 @@
/obj/item/clothing/mask/breath/attack_self(var/mob/user)
adjustmask(user)
-/obj/item/clothing/mask/breath/AltClick(var/mob/user)
- adjustmask(user)
-
-/obj/item/clothing/mask/breath/examine(mob/user)
- ..()
- user << "Alt-click [src] to adjust it."
-
/obj/item/clothing/mask/breath/medical
desc = "A close-fitting sterile mask that can be connected to an air supply."
name = "medical mask"
icon_state = "medical"
item_state = "m_mask"
permeability_coefficient = 0.01
- put_on_delay = 10
+ put_on_delay = 10
\ No newline at end of file
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index f70bffdf3d7be..c38e52f1736db 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -45,6 +45,7 @@
desc = "A standard issue Security gas mask with integrated 'Compli-o-nator 3000' device. Plays over a dozen pre-recorded compliance phrases designed to get scumbags to stand still whilst you taze them. Do not tamper with the device."
action_button_name = "HALT!"
icon_state = "sechailer"
+ var/cooldown = 0
var/aggressiveness = 2
ignore_maskadjust = 0
flags = MASKCOVERSMOUTH | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
@@ -222,7 +223,7 @@
/obj/item/clothing/mask/gas/clown_hat
name = "clown wig and mask"
desc = "A true prankster's facial attire. A clown is incomplete without his wig and mask."
- flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
+ alloweat = 1
icon_state = "clown"
item_state = "clown_hat"
@@ -245,28 +246,28 @@ obj/item/clothing/mask/gas/clown_hat/attack_self(mob/user)
/obj/item/clothing/mask/gas/sexyclown
name = "sexy-clown wig and mask"
desc = "A feminine clown mask for the dabbling crossdressers or female entertainers."
- flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
+ alloweat = 1
icon_state = "sexyclown"
item_state = "sexyclown"
/obj/item/clothing/mask/gas/mime
name = "mime mask"
desc = "The traditional mime's mask. It has an eerie facial posture."
- flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
+ alloweat = 1
icon_state = "mime"
item_state = "mime"
/obj/item/clothing/mask/gas/monkeymask
name = "monkey mask"
desc = "A mask used when acting as a monkey."
- flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
+ alloweat = 1
icon_state = "monkeymask"
item_state = "monkeymask"
/obj/item/clothing/mask/gas/sexymime
name = "sexy mime mask"
desc = "A traditional female mime's mask."
- flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
+ alloweat = 1
icon_state = "sexymime"
item_state = "sexymime"
@@ -283,5 +284,5 @@ obj/item/clothing/mask/gas/clown_hat/attack_self(mob/user)
/obj/item/clothing/mask/gas/owl_mask
name = "owl mask"
desc = "Twoooo!"
- flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
+ alloweat = 1
icon_state = "owl"
\ No newline at end of file
diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm
index c59e0ef4c622b..a97a996482467 100644
--- a/code/modules/clothing/spacesuits/chronosuit.dm
+++ b/code/modules/clothing/spacesuits/chronosuit.dm
@@ -30,6 +30,7 @@
var/activating = 0
var/activated = 0
var/cooldowntime = 50 //deciseconds
+ var/cooldown = 0
var/teleporting = 0
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 5e019d8940988..c76fbd9c1989f 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -1,6 +1,6 @@
- //Baseline hardsuits
+ //Regular (engineering) hardsuits
/obj/item/clothing/head/helmet/space/hardsuit
- name = "hardsuit helmet"
+ name = "engineering hardsuit helmet"
desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding."
icon_state = "hardsuit0-engineering"
item_state = "eng_helm"
@@ -11,7 +11,6 @@
action_button_name = "Toggle Helmet Light"
flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL | NODROP
-
/obj/item/clothing/head/helmet/space/hardsuit/attack_self(mob/user)
if(!isturf(user.loc))
user << "You cannot turn the light on while in this [user.loc]" //To prevent some lighting anomalities.
@@ -36,7 +35,7 @@
/obj/item/clothing/suit/space/hardsuit
- name = "hardsuit"
+ name = "engineering hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding."
icon_state = "hardsuit-engineering"
item_state = "eng_hardsuit"
@@ -46,42 +45,9 @@
var/obj/item/clothing/head/helmet/space/hardsuit/helmet
action_button_name = "Toggle Helmet"
var/helmettype = /obj/item/clothing/head/helmet/space/hardsuit
- var/obj/item/weapon/tank/jetpack/suit/jetpack = null
-
-/obj/item/clothing/suit/space/hardsuit/verb/Jetpack()
- set name = "Toggle Inbuilt Jetpack"
- set category = "Object"
- jetpack.toggle()
-
-/obj/item/clothing/suit/space/hardsuit/verb/Jetpack_Rockets()
- set name = "Toggle Inbuilt Jetpack Stabilization"
- set category = "Object"
- jetpack.toggle_rockets()
-
- //Engineering
-/obj/item/clothing/head/helmet/space/hardsuit/engine
- name = "engineering hardsuit helmet"
- desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding."
- icon_state = "hardsuit0-engineering"
- item_state = "eng_helm"
- armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
- item_color = "engineering"
-
-/obj/item/clothing/suit/space/hardsuit/engine
- name = "engineering hardsuit"
- desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding."
- icon_state = "hardsuit-engineering"
- item_state = "eng_hardsuit"
- armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
- helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine
-
-
-/obj/item/clothing/suit/space/hardsuit/engine/New()
- jetpack = new /obj/item/weapon/tank/jetpack/suit(src)
- ..()
//Atmospherics
-/obj/item/clothing/head/helmet/space/hardsuit/engine/atmos
+/obj/item/clothing/head/helmet/space/hardsuit/atmos
name = "atmospherics hardsuit helmet"
desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has thermal shielding."
icon_state = "hardsuit0-atmospherics"
@@ -91,7 +57,7 @@
heat_protection = HEAD //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
-/obj/item/clothing/suit/space/hardsuit/engine/atmos
+/obj/item/clothing/suit/space/hardsuit/atmos
name = "atmospherics hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has thermal shielding."
icon_state = "hardsuit-atmospherics"
@@ -99,11 +65,11 @@
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 0)
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
- helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/atmos
+ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/atmos
//Chief Engineer's hardsuit
-/obj/item/clothing/head/helmet/space/hardsuit/engine/elite
+/obj/item/clothing/head/helmet/space/hardsuit/elite
name = "advanced hardsuit helmet"
desc = "An advanced helmet designed for work in a hazardous, low pressure environment. Shines with a high polish."
icon_state = "hardsuit0-white"
@@ -113,8 +79,7 @@
heat_protection = HEAD //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
-
-/obj/item/clothing/suit/space/hardsuit/engine/elite
+/obj/item/clothing/suit/space/hardsuit/elite
icon_state = "hardsuit-white"
name = "advanced hardsuit"
desc = "An advanced suit that protects against hazardous, low pressure environments. Shines with a high polish."
@@ -122,7 +87,7 @@
armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 90)
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
- helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/elite
+ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/elite
//Mining hardsuit
@@ -135,7 +100,6 @@
armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
brightness_on = 7
-
/obj/item/clothing/suit/space/hardsuit/mining
icon_state = "hardsuit-mining"
name = "mining hardsuit"
@@ -234,9 +198,6 @@
..()
flags ^= NODROP
-/obj/item/clothing/suit/space/hardsuit/syndi/New()
- jetpack = new /obj/item/weapon/tank/jetpack/suit(src)
- ..()
//The Owl Hardsuit
/obj/item/clothing/head/helmet/space/hardsuit/syndi/owl
@@ -247,7 +208,6 @@
item_state = "s_helmet"
item_color = "owl"
-
/obj/item/clothing/suit/space/hardsuit/syndi/owl
name = "owl hardsuit"
desc = "A dual-mode advanced hardsuit designed for any crime-fighting situation. It is in travel mode."
@@ -271,7 +231,6 @@
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
unacidable = 1
-
/obj/item/clothing/suit/space/hardsuit/wizard
icon_state = "hardsuit-wiz"
name = "gem-encrusted hardsuit"
@@ -299,7 +258,6 @@
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 50)
-
/obj/item/clothing/suit/space/hardsuit/medical
icon_state = "hardsuit-medical"
name = "medical hardsuit"
@@ -320,7 +278,6 @@
item_color = "sec"
armor = list(melee = 30, bullet = 15, laser = 30,energy = 10, bomb = 10, bio = 100, rad = 50)
-
/obj/item/clothing/suit/space/hardsuit/security
icon_state = "hardsuit-sec"
name = "security hardsuit"
@@ -337,7 +294,6 @@
item_color = "hos"
armor = list(melee = 45, bullet = 25, laser = 30,energy = 10, bomb = 25, bio = 100, rad = 50)
-
/obj/item/clothing/suit/space/hardsuit/security/hos
icon_state = "hardsuit-hos"
name = "head of security's hardsuit"
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index cf8a9d9e5a60b..03bf02793006d 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -20,7 +20,7 @@
//Death squad armored space suits, not hardsuits!
-/obj/item/clothing/head/helmet/space/hardsuit/deathsquad
+/obj/item/clothing/head/helmet/space/deathsquad
name = "deathsquad helmet"
desc = "That's not red paint. That's real blood."
icon_state = "deathsquad"
@@ -29,12 +29,8 @@
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
unacidable = 1
- action_button_name = null
-/obj/item/clothing/head/helmet/space/hardsuit/deathsquad/attack_self(mob/user)
- return
-
-/obj/item/clothing/suit/space/hardsuit/deathsquad
+/obj/item/clothing/suit/space/deathsquad
name = "deathsquad suit"
desc = "A heavily armored, advanced space suit that protects against most forms of damage."
icon_state = "deathsquad"
@@ -45,20 +41,15 @@
strip_delay = 130
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
unacidable = 1
- helmettype = /obj/item/clothing/head/helmet/space/hardsuit/deathsquad
-/obj/item/clothing/head/helmet/space/beret
+/obj/item/clothing/head/helmet/space/deathsquad/beret
name = "officer's beret"
desc = "An armored beret commonly used by special operations officers. Uses advanced force field technology to protect the head from space."
icon_state = "beret_badge"
flags = STOPSPRESSUREDMAGE
flags_inv = 0
- armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100)
- strip_delay = 130
- max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
- unacidable = 1
-/obj/item/clothing/suit/space/officer
+/obj/item/clothing/suit/space/deathsquad/officer
name = "officer's jacket"
desc = "An armored, space-proof jacket used in special operations."
icon_state = "detective"
@@ -67,12 +58,6 @@
slowdown = 0
flags_inv = 0
w_class = 3
- allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
- armor = list(melee = 80, bullet = 80, laser = 50,energy = 50, bomb = 100, bio = 100, rad = 100)
- slowdown = 1
- strip_delay = 130
- max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
- unacidable = 1
//NASA Voidsuit
@@ -125,7 +110,6 @@
icon_state = "pirate"
item_state = "pirate"
w_class = 3
- flags_inv = 0
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
slowdown = 0
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
@@ -141,58 +125,51 @@
item_color = "ert_commander"
armor = list(melee = 65, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 100, rad = 100)
strip_delay = 130
- flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL | NODROP
+ flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL
brightness_on = 7
-/obj/item/clothing/suit/space/hardsuit/ert
- name = "emergency response team suit"
- desc = "Standard issue command suit for the ERT."
- icon_state = "ert_command"
- item_state = "ert_command"
- helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert
- allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
- armor = list(melee = 65, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 100, rad = 100)
- slowdown = 0
- strip_delay = 130
-
- //ERT Security
/obj/item/clothing/head/helmet/space/hardsuit/ert/sec
desc = "Standard issue security helmet for the ERT."
icon_state = "hardsuit0-ert_security"
item_state = "hardsuit0-ert_security"
item_color = "ert_security"
-/obj/item/clothing/suit/space/hardsuit/ert/sec
- desc = "Standard issue security suit for the ERT."
- icon_state = "ert_security"
- item_state = "ert_security"
- helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/sec
-
- //ERT Engineering
/obj/item/clothing/head/helmet/space/hardsuit/ert/engi
desc = "Standard issue engineer helmet for the ERT."
icon_state = "hardsuit0-ert_engineer"
item_state = "hardsuit0-ert_engineer"
item_color = "ert_engineer"
-/obj/item/clothing/suit/space/hardsuit/ert/engi
- desc = "Standard issue engineer suit for the ERT."
- icon_state = "ert_engineer"
- item_state = "ert_engineer"
- helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/engi
-
- //ERT Medical
/obj/item/clothing/head/helmet/space/hardsuit/ert/med
desc = "Standard issue medical helmet for the ERT."
icon_state = "hardsuit0-ert_medical"
item_state = "hardsuit0-ert_medical"
item_color = "ert_medical"
-/obj/item/clothing/suit/space/hardsuit/ert/med
+/obj/item/clothing/suit/space/ert
+ name = "emergency response team suit"
+ desc = "Standard issue command suit for the ERT."
+ icon_state = "ert_command"
+ item_state = "ert_command"
+ allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals)
+ armor = list(melee = 65, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 100, rad = 100)
+ slowdown = 0
+ strip_delay = 130
+
+/obj/item/clothing/suit/space/ert/sec
+ desc = "Standard issue security suit for the ERT."
+ icon_state = "ert_security"
+ item_state = "ert_security"
+
+/obj/item/clothing/suit/space/ert/engi
+ desc = "Standard issue engineer suit for the ERT."
+ icon_state = "ert_engineer"
+ item_state = "ert_engineer"
+
+/obj/item/clothing/suit/space/ert/med
desc = "Standard issue medical suit for the ERT."
icon_state = "ert_medical"
item_state = "ert_medical"
- helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert/med
/obj/item/clothing/suit/space/eva
name = "EVA suit"
diff --git a/code/modules/clothing/spacesuits/ninja.dm b/code/modules/clothing/spacesuits/ninja.dm
new file mode 100644
index 0000000000000..562f0496b73d6
--- /dev/null
+++ b/code/modules/clothing/spacesuits/ninja.dm
@@ -0,0 +1,65 @@
+/obj/item/clothing/head/helmet/space/space_ninja
+ desc = "What may appear to be a simple black garment is in fact a highly sophisticated nano-weave helmet. Standard issue ninja gear."
+ name = "ninja hood"
+ icon_state = "s-ninja"
+ item_state = "s-ninja_mask"
+ armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 25)
+ strip_delay = 12
+ unacidable = 1
+
+
+/obj/item/clothing/suit/space/space_ninja
+ name = "ninja suit"
+ desc = "A unique, vaccum-proof suit of nano-enhanced armor designed specifically for Spider Clan assassins."
+ icon_state = "s-ninja"
+ item_state = "s-ninja_suit"
+ allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals,/obj/item/weapon/stock_parts/cell)
+ slowdown = 0
+ unacidable = 1
+ armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+ strip_delay = 12
+
+ //Important parts of the suit.
+ var/mob/living/carbon/affecting = null//The wearer.
+ var/obj/item/weapon/stock_parts/cell/cell//Starts out with a high-capacity cell using New().
+ var/datum/effect/effect/system/spark_spread/spark_system//To create sparks.
+ var/reagent_list[] = list("omnizine","salbutamol","spaceacillin","charcoal","nutriment","radium","potass_iodide")//The reagents ids which are added to the suit at New().
+ var/stored_research[]//For stealing station research.
+ var/obj/item/weapon/disk/tech_disk/t_disk//To copy design onto disk.
+
+ //Other articles of ninja gear worn together, used to easily reference them after initializing.
+ var/obj/item/clothing/head/helmet/space/space_ninja/n_hood
+ var/obj/item/clothing/shoes/space_ninja/n_shoes
+ var/obj/item/clothing/gloves/space_ninja/n_gloves
+
+ //Main function variables.
+ var/s_initialized = 0//Suit starts off.
+ var/s_coold = 0//If the suit is on cooldown. Can be used to attach different cooldowns to abilities. Ticks down every second based on suit ntick().
+ var/s_cost = 5.0//Base energy cost each ntick.
+ var/s_acost = 25.0//Additional cost for additional powers active.
+ var/k_cost = 200.0//Kamikaze energy cost each ntick.
+ var/k_damage = 1.0//Brute damage potentially done by Kamikaze each ntick.
+ var/s_delay = 40.0//How fast the suit does certain things, lower is faster. Can be overridden in specific procs. Also determines adverse probability.
+ var/a_transfer = 20.0//How much reagent is transferred when injecting.
+ var/r_maxamount = 80.0//How much reagent in total there is.
+
+ //Support function variables.
+ var/spideros = 0//Mode of SpiderOS. This can change so I won't bother listing the modes here (0 is hub). Check ninja_equipment.dm for how it all works.
+ var/s_active = 0//Stealth off.
+ var/s_busy = 0//Is the suit busy with a process? Like AI hacking. Used for safety functions.
+ var/kamikaze = 0//Kamikaze on or off.
+ var/k_unlock = 0//To unlock Kamikaze.
+
+ //Ability function variables.
+ var/s_bombs = 10.0//Number of starting ninja smoke bombs.
+ var/a_boost = 3.0//Number of adrenaline boosters.
+
+ //Onboard AI related variables.
+
+ var/obj/item/device/aicard/NAI //Integrated intellicard.
+
+ var/obj/item/device/paicard/pai//A slot for a pAI device
+
+ var/obj/effect/overlay/hologram//Is the AI hologram on or off? Visible only to the wearer of the suit. This works by attaching an image to a blank overlay.
+
+ var/s_control = 1//If user in control of the suit.
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index d65ea343015d3..d5ee7e59bcc0f 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -116,6 +116,7 @@
icon_state = "reactiveoff"
item_state = "reactiveoff"
blood_overlay_type = "armor"
+ slowdown = 1
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
action_button_name = "Toggle Armor"
unacidable = 1
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index b9ecf892582fb..b8683c10cc70e 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -61,6 +61,7 @@
permeability_coefficient = 0.50
body_parts_covered = CHEST|GROIN|ARMS
allowed = list(/obj/item/weapon/kitchenknife)
+ action_button_name = "Toggle Jacket Sleeves"
togglename = "sleeves"
//Cook
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 6a2aaec47fd1f..0adae1c15a23b 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -68,7 +68,7 @@
icon_state = "judge"
item_state = "judge"
body_parts_covered = CHEST|GROIN|LEGS|ARMS
- allowed = list(/obj/item/weapon/storage/fancy/cigarettes,/obj/item/stack/spacecash)
+ allowed = list(/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/spacecash)
flags_inv = HIDEJUMPSUIT
@@ -187,15 +187,6 @@
item_state = "ponchoshame"
flags = NODROP
-/obj/item/clothing/suit/whitedress
- name = "white dress"
- desc = "A fancy white dress."
- icon_state = "white_dress"
- item_state = "w_suit"
- body_parts_covered = CHEST|GROIN|LEGS|FEET
- flags_inv = HIDEJUMPSUIT|HIDESHOES
-
-
/*
* Misc
*/
@@ -315,4 +306,4 @@
name = "mining winter coat"
icon_state = "coatminer"
allowed = list(/obj/item/weapon/pickaxe,/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter)
- armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
+ armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
\ No newline at end of file
diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm
index b569f9b5fe640..c9567e9c4ed20 100644
--- a/code/modules/clothing/suits/toggles.dm
+++ b/code/modules/clothing/suits/toggles.dm
@@ -57,9 +57,6 @@
..()
suit_toggle()
-/obj/item/clothing/suit/toggle/ui_action_click()
- suit_toggle()
-
/obj/item/clothing/suit/toggle/proc/suit_toggle()
set src in usr
@@ -83,9 +80,6 @@
/obj/item/clothing/suit/space/hardsuit/New()
MakeHelmet()
- if(!jetpack)
- verbs -= /obj/item/clothing/suit/space/hardsuit/verb/Jetpack
- verbs -= /obj/item/clothing/suit/space/hardsuit/verb/Jetpack_Rockets
..()
/obj/item/clothing/suit/space/hardsuit/proc/MakeHelmet()
@@ -142,4 +136,4 @@
else
H << "You disengage the helmet on the hardsuit."
playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1)
- RemoveHelmet()
+ RemoveHelmet()
\ No newline at end of file
diff --git a/code/modules/clothing/under/chameleon.dm b/code/modules/clothing/under/chameleon.dm
index 20acefb09d687..a92c45a0ab6aa 100644
--- a/code/modules/clothing/under/chameleon.dm
+++ b/code/modules/clothing/under/chameleon.dm
@@ -80,7 +80,6 @@
icon_state = A.icon_state
item_state = A.item_state
item_color = A.item_color
- suit_color = A.suit_color
usr.update_inv_w_uniform() //so our overlays update.
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 4ce2dc6849c61..bec82edc7fe71 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -92,6 +92,7 @@
icon_state = "officer"
item_state = "g_suit"
item_color = "officer"
+ can_adjust = 0
/obj/item/clothing/under/rank/centcom_commander
desc = "It's a jumpsuit worn by Centcom's highest-tier Commanders."
@@ -99,6 +100,7 @@
icon_state = "centcom"
item_state = "dg_suit"
item_color = "centcom"
+ can_adjust = 0
/obj/item/clothing/under/space
name = "\improper NASA jumpsuit"
@@ -453,7 +455,7 @@
item_state = "plaid_red"
item_color = "plaid_red"
fitted = FEMALE_UNIFORM_TOP
- can_adjust = 1
+ can_adjust = 0
/obj/item/clothing/under/plaid_skirt/blue
name = "blue plaid skirt"
@@ -468,10 +470,3 @@
icon_state = "plaid_purple"
item_state = "plaid_purple"
item_color = "plaid_purple"
-
-/obj/item/clothing/under/jester
- name = "jester suit"
- desc = "A jolly dress, well suited to entertain your master, nuncle."
- icon_state = "jester"
- item_color = "jester"
- can_adjust = 0
diff --git a/code/modules/clothing/under/ties.dm b/code/modules/clothing/under/ties.dm
index 6c4d586d74070..1520f2cfcf76d 100644
--- a/code/modules/clothing/under/ties.dm
+++ b/code/modules/clothing/under/ties.dm
@@ -145,7 +145,7 @@
/obj/item/clothing/tie/medal/gold/heroism
name = "medal of exceptional heroism"
- desc = "An extremely rare golden medal awarded only by Centcom. To receive such a medal is the highest honor and as such, very few exist. This medal is almost never awarded to anybody but commanders."
+ desc = "An extremely rare golden medal awarded only by Centcom. To recieve such a medal is the highest honor and as such, very few exist. This medal is almost never awarded to anybody but commanders."
////////////
//Armbands//
@@ -277,14 +277,3 @@
name = "striped blue scarf"
icon_state = "stripedbluescarf"
item_color = "stripedbluescarf"
-
-/obj/item/clothing/tie/petcollar //don't really wear this though please c'mon seriously guys
- name = "pet collar"
- desc = "It's for pets. Though you probably could wear it yourself, you'd doubtless be the subject of ridicule."
- icon_state = "petcollar"
- item_color = "petcollar"
- var/tagname = null
-
-/obj/item/clothing/tie/petcollar/attack_self(mob/user as mob)
- tagname = copytext(sanitize(input(user, "Would you like to change the name on the tag?", "Name your new pet", "Spot") as null|text),1,MAX_NAME_LEN)
- name = "[initial(name)] - [tagname]"
\ No newline at end of file
diff --git a/code/modules/crafting/guncrafting.dm b/code/modules/crafting/guncrafting.dm
index 45d4d340ecd87..ca3da0b965d0d 100644
--- a/code/modules/crafting/guncrafting.dm
+++ b/code/modules/crafting/guncrafting.dm
@@ -4,8 +4,8 @@
// PARTS //
/obj/item/weaponcrafting/reciever
- name = "modular receiver"
- desc = "A prototype modular receiver and trigger assembly for a firearm."
+ name = "modular reciever"
+ desc = "A prototype modular reciever and trigger assembly for a firearm."
icon = 'icons/obj/improvised.dmi'
icon_state = "reciever"
@@ -20,7 +20,7 @@
/obj/item/weaponcrafting/reciever/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W,/obj/item/pipe))
- user << "You attach the shotgun barrel to the receiver. The pins seem loose."
+ user << "You attach the shotgun barrel to the reciever. The pins seem loose."
var/obj/item/weaponcrafting/ishotgunconstruction/I = new /obj/item/weaponcrafting/ishotgunconstruction
user.unEquip(src)
user.put_in_hands(I)
@@ -32,7 +32,7 @@
/obj/item/weaponcrafting/ishotgunconstruction
name = "slightly conspicuous metal construction"
- desc = "A long pipe attached to a firearm receiver. The pins seem loose."
+ desc = "A long pipe attached to a firearm reciever. The pins seem loose."
icon = 'icons/obj/improvised.dmi'
icon_state = "ishotgunstep1"
@@ -42,7 +42,7 @@
var/obj/item/weaponcrafting/ishotgunconstruction2/C = new /obj/item/weaponcrafting/ishotgunconstruction2
user.unEquip(src)
user.put_in_hands(C)
- user << "You screw the pins into place, securing the pipe to the receiver."
+ user << "You screw the pins into place, securing the pipe to the reciever."
qdel(src)
/obj/item/weaponcrafting/ishotgunconstruction2
@@ -53,7 +53,7 @@
/obj/item/weaponcrafting/ishotgunconstruction2/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W,/obj/item/weaponcrafting/stock))
- user << "You attach the stock to the receiver-barrel assembly."
+ user << "You attach the stock to the reciever-barrel assembly."
var/obj/item/weaponcrafting/ishotgunconstruction3/I = new /obj/item/weaponcrafting/ishotgunconstruction3
user.unEquip(src)
user.put_in_hands(I)
@@ -63,7 +63,7 @@
/obj/item/weaponcrafting/ishotgunconstruction3
name = "extremely conspicuous metal construction"
- desc = "A receiver-barrel shotgun assembly with a loose wooden stock. There's no way you can fire it without the stock coming loose."
+ desc = "A reciever-barrel shotgun assembly with a loose wooden stock. There's no way you can fire it without the stock coming loose."
icon = 'icons/obj/improvised.dmi'
icon_state = "ishotgunstep2"
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index e9b2ab62b901b..ef5c30fd07c31 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -49,7 +49,7 @@
name = "Secbot"
result = /obj/machinery/bot/secbot
reqs = list(/obj/item/device/assembly/signaler = 1,
- /obj/item/clothing/head/helmet/sec = 1,
+ /obj/item/clothing/head/helmet = 1,
/obj/item/weapon/melee/baton = 1,
/obj/item/device/assembly/prox_sensor = 1,
/obj/item/robot_parts/r_arm = 1)
@@ -129,42 +129,6 @@
tools = list(/obj/item/weapon/screwdriver)
time = 5
-/datum/table_recipe/ionslug
- name = "Ion Scatter Shell"
- result = /obj/item/ammo_casing/shotgun/ion
- reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
- /obj/item/weapon/stock_parts/micro_laser/ultra = 1,
- /obj/item/weapon/stock_parts/subspace/crystal = 1)
- tools = list(/obj/item/weapon/screwdriver)
- time = 5
-
-/datum/table_recipe/improvisedslug
- name = "Improvised Shotgun Shell"
- result = /obj/item/ammo_casing/shotgun/improvised
- reqs = list(/obj/item/weapon/grenade/chem_grenade = 1,
- /obj/item/stack/sheet/metal = 1,
- /obj/item/stack/cable_coil = 1,
- /datum/reagent/fuel = 10)
- tools = list(/obj/item/weapon/screwdriver)
- time = 5
-
-/datum/table_recipe/improvisedslugoverload
- name = "Overload Improvised Shell"
- result = /obj/item/ammo_casing/shotgun/improvised/overload
- reqs = list(/obj/item/ammo_casing/shotgun/improvised = 1,
- /datum/reagent/blackpowder = 5)
- tools = list(/obj/item/weapon/screwdriver)
- time = 5
-
-/datum/table_recipe/laserslug
- name = "Laser Slug Shell"
- result = /obj/item/ammo_casing/shotgun/laserslug
- reqs = list(/obj/item/ammo_casing/shotgun/techshell = 1,
- /obj/item/weapon/stock_parts/capacitor/adv = 1,
- /obj/item/weapon/stock_parts/micro_laser/high = 1)
- tools = list(/obj/item/weapon/screwdriver)
- time = 5
-
/datum/table_recipe/ishotgun
name = "Improvised Shotgun"
result = /obj/item/weapon/gun/projectile/revolver/doublebarrel/improvised
diff --git a/code/modules/crafting/table.dm b/code/modules/crafting/table.dm
index 75847c323f4b2..749648f43fdcc 100644
--- a/code/modules/crafting/table.dm
+++ b/code/modules/crafting/table.dm
@@ -12,17 +12,10 @@
check_table()
main_loop:
for(var/A in R.reqs)
- var/needed_amount = R.reqs[A]
for(var/B in table_contents)
if(ispath(B, A))
if(table_contents[B] >= R.reqs[A])
continue main_loop
- else
- needed_amount -= table_contents[B]
- if(needed_amount <= 0)
- continue main_loop
- else
- continue
return 0
for(var/A in R.chem_catalysts)
if(table_contents[A] < R.chem_catalysts[A])
@@ -83,16 +76,11 @@
if(!check_contents(R) || !check_tools(user, R))
return 0
var/atom/movable/I = new R.result (loc)
- if(istype(I, /obj/item/weapon/reagent_containers/food/snacks))
- var/obj/item/weapon/reagent_containers/food/snacks/S = I
- S.create_reagents(S.volume)
var/list/parts = del_reqs(R, I)
for(var/A in parts)
if(istype(A, /obj/item))
var/atom/movable/B = A
B.loc = I
- B.pixel_x = initial(B.pixel_x)
- B.pixel_y = initial(B.pixel_y)
else
if(!I.reagents)
I.reagents = new /datum/reagents()
@@ -127,18 +115,15 @@
item_loop:
for(var/B in table_contents)
if(ispath(B, A))
- var/item_amount = table_contents[B]
- while(item_amount > 0)
+ while(amt > 0)
I = locate(B) in loc
Deletion.Add(I)
I.loc = null //remove it from the table loc so that we don't locate the same item every time (will be relocated inside the crafted item in construct_item())
amt--
- item_amount--
if(reagenttransfer && istype(I,/obj/item/weapon/reagent_containers))
var/obj/item/weapon/reagent_containers/RC = I
RC.reagents.trans_to(resultobject, RC.reagents.total_volume)
- if(amt <= 0)
- break item_loop
+ break item_loop
else
var/datum/reagent/RG = new A
reagent_loop:
@@ -178,7 +163,7 @@
return Deletion
/obj/structure/table/interact(mob/user)
- if(user.incapacitated() || user.lying || !Adjacent(user))
+ if(user.stat || user.lying || !Adjacent(user))
return
check_table()
if(!table_contents.len)
diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm
index affb72d1381ac..71fc5d1b93286 100644
--- a/code/modules/detectivework/scanner.dm
+++ b/code/modules/detectivework/scanner.dm
@@ -5,7 +5,7 @@
/obj/item/device/detective_scanner
name = "forensic scanner"
desc = "Used to remotely scan objects and biomass for DNA and fingerprints. Can print a report of the findings."
- icon_state = "forensicnew"
+ icon_state = "forensic1"
w_class = 3.0
item_state = "electronic"
flags = CONDUCT | NOBLUDGEON
diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm
index 10ca2b4b64e71..91f71dc1fe99e 100644
--- a/code/modules/events/anomaly_bluespace.dm
+++ b/code/modules/events/anomaly_bluespace.dm
@@ -54,8 +54,8 @@
if(A.anchored) continue
var/turf/newloc = locate(A.x + x_distance, A.y + y_distance, TO.z) // calculate the new place
- if(!A.Move(newloc) && newloc) // if the atom, for some reason, can't move, FORCE them to move! :) We try Move() first to invoke any movement-related checks the atom needs to perform after moving
- A.loc = newloc
+ if(!A.Move(newloc)) // if the atom, for some reason, can't move, FORCE them to move! :) We try Move() first to invoke any movement-related checks the atom needs to perform after moving
+ A.loc = locate(A.x + x_distance, A.y + y_distance, TO.z)
spawn()
if(ismob(A) && !(A in flashers)) // don't flash if we're already doing an effect
diff --git a/code/modules/events/anomaly_pyro.dm b/code/modules/events/anomaly_pyro.dm
index 9f5feea38e1e5..237e59a1d48a3 100644
--- a/code/modules/events/anomaly_pyro.dm
+++ b/code/modules/events/anomaly_pyro.dm
@@ -30,7 +30,7 @@
if(newAnomaly.loc)
explosion(get_turf(newAnomaly), -1,0,3, flame_range = 4)
- var/mob/living/simple_animal/slime/S = new/mob/living/simple_animal/slime(get_turf(newAnomaly))
+ var/mob/living/carbon/slime/S = new/mob/living/carbon/slime(get_turf(newAnomaly))
S.colour = pick("red", "orange")
qdel(newAnomaly)
\ No newline at end of file
diff --git a/code/modules/events/drone_uprising.dm b/code/modules/events/drone_uprising.dm
new file mode 100644
index 0000000000000..e2e976fef3533
--- /dev/null
+++ b/code/modules/events/drone_uprising.dm
@@ -0,0 +1,12 @@
+/datum/round_event_control/droneuprising
+ name = "Drone Uprising"
+ typepath = /datum/round_event/droneuprising
+ max_occurrences = 0
+
+/datum/round_event/droneuprising/start()
+ for(var/mob/M in player_list)
+ if(istype(M, /mob/living/simple_animal/drone) && M.stat != DEAD)
+ var/mob/living/simple_animal/drone/d = M
+ d.uprising = 1
+ d.show_uprising_notification()
+ d.check_laws()
diff --git a/code/modules/events/event.dm b/code/modules/events/event.dm
index e9661d5dc7c2f..172a562905bd8 100644
--- a/code/modules/events/event.dm
+++ b/code/modules/events/event.dm
@@ -13,7 +13,7 @@
var/max_occurrences = 20 //The maximum number of times this event can occur (naturally), it can still be forced.
//By setting this to 0 you can effectively disable an event.
- var/holidayID = "" //string which should be in the SSevents.holidays list if you wish this event to be holiday-specific
+ var/holidayID //string which should match the events.holiday variable if you wish this event to be holiday-specific
//anything with a (non-null) holidayID which does not match holiday, cannot run.
var/wizardevent = 0
@@ -86,7 +86,7 @@
//Do not override this proc, instead use the appropiate procs.
//This proc will handle the calls to the appropiate procs.
-/datum/round_event/process()
+/datum/round_event/proc/process()
if(!processing)
return
diff --git a/code/modules/events/holiday/friday13th.dm b/code/modules/events/holiday/friday13th.dm
index e1a393fb86761..a227cb6f6112a 100644
--- a/code/modules/events/holiday/friday13th.dm
+++ b/code/modules/events/holiday/friday13th.dm
@@ -2,7 +2,7 @@
/datum/round_event_control/fridaythethirteen
name = "Friday the 13th"
- holidayID = FRIDAY_13TH
+ holidayID = "Friday the 13th"
typepath = /datum/round_event/fridaythethirteen
weight = -1
max_occurrences = 1
diff --git a/code/modules/events/holiday/halloween.dm b/code/modules/events/holiday/halloween.dm
index 8c3536444deeb..5e8996a8c1da1 100644
--- a/code/modules/events/holiday/halloween.dm
+++ b/code/modules/events/holiday/halloween.dm
@@ -1,6 +1,6 @@
/datum/round_event_control/spooky
name = "2 SPOOKY! (Halloween)"
- holidayID = HALLOWEEN
+ holidayID = "Halloween"
typepath = /datum/round_event/spooky
weight = -1 //forces it to be called, regardless of weight
max_occurrences = 1
@@ -17,7 +17,7 @@
else
hardset_dna(H, null, null, null, null, /datum/species/zombie)
- for(var/mob/living/simple_animal/pet/corgi/Ian/Ian in mob_list)
+ for(var/mob/living/simple_animal/corgi/Ian/Ian in mob_list)
Ian.place_on_head(new /obj/item/weapon/bedsheet(Ian))
/datum/round_event/spooky/announce()
@@ -27,7 +27,7 @@
/datum/round_event_control/carp_migration/eyeballs
name = "Eyeball Migration"
typepath = /datum/round_event/carp_migration/eyeballs
- holidayID = HALLOWEEN
+ holidayID = "Halloween"
weight = 25
earliest_start = 0
@@ -40,7 +40,7 @@
/datum/round_event_control/meteor_wave/spooky
name = "Pumpkin Wave"
typepath = /datum/round_event/meteor_wave/spooky
- holidayID = HALLOWEEN
+ holidayID = "Halloween"
weight = 20
max_occurrences = 2
diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm
index 3f40addebdf85..727c5a0dce275 100644
--- a/code/modules/events/holiday/xmas.dm
+++ b/code/modules/events/holiday/xmas.dm
@@ -1,6 +1,6 @@
/datum/round_event_control/treevenge
name = "Treevenge (Christmas)"
- holidayID = CHRISTMAS
+ holidayID = "Xmas"
typepath = /datum/round_event/treevenge
max_occurrences = 1
weight = 20
@@ -17,7 +17,7 @@
//this is an example of a possible round-start event
/datum/round_event_control/presents
name = "Presents under Trees (Christmas)"
- holidayID = CHRISTMAS
+ holidayID = "Xmas"
typepath = /datum/round_event/presents
weight = -1 //forces it to be called, regardless of weight
max_occurrences = 1
@@ -29,7 +29,7 @@
for(var/turf/simulated/floor/T in orange(1,xmas))
for(var/i=1,i<=rand(1,5),i++)
new /obj/item/weapon/a_gift(T)
- for(var/mob/living/simple_animal/pet/corgi/Ian/Ian in mob_list)
+ for(var/mob/living/simple_animal/corgi/Ian/Ian in mob_list)
Ian.place_on_head(new /obj/item/clothing/head/helmet/space/santahat(Ian))
for(var/obj/machinery/computer/security/telescreen/entertainment/Monitor in machines)
Monitor.icon_state = "entertainment_xmas"
@@ -81,7 +81,7 @@
/datum/round_event_control/santa
name = "Santa is coming to town! (Christmas)"
- holidayID = CHRISTMAS
+ holidayID = "Xmas"
typepath = /datum/round_event/santa
weight = 150
max_occurrences = 1
@@ -143,9 +143,9 @@
santa_objective.completed = 1 //lets cut our santas some slack.
santa_objective.owner = santa.mind
santa.mind.objectives += santa_objective
- santa.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/presents)
+ santa.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/presents
var/obj/effect/proc_holder/spell/targeted/area_teleport/teleport/telespell = new(santa)
telespell.clothes_req = 0 //santa robes aren't actually magical.
- santa.mind.AddSpell(telespell) //does the station have chimneys? WHO KNOWS!
+ santa.mind.spell_list += telespell //does the station have chimneys? WHO KNOWS!
- santa << "You are Santa! Your objective is to bring joy to the people on this station. You can conjure more presents using a spell, and there are several presents in your bag."
+ santa << "You are Santa! Your objective is to bring joy to the people on this station. You can conjure more presents using a spell, and there are several presents in your bag."
diff --git a/code/modules/events/ninja.dm b/code/modules/events/ninja.dm
new file mode 100644
index 0000000000000..e35fbae5905f9
--- /dev/null
+++ b/code/modules/events/ninja.dm
@@ -0,0 +1,2436 @@
+//Note to future generations: I didn't write this god-awful code I just ported it to the event system and tried to make it less moon-speaky.
+//Don't judge me D; ~Carn
+
+/datum/round_event_control/ninja
+ name = "Space Ninja"
+ typepath = /datum/round_event/ninja
+ max_occurrences = 1
+ earliest_start = 30000 // 1 hour
+
+/datum/round_event/ninja
+ var/success_spawn = 0
+
+ var/helping_station
+ var/key
+ var/spawn_loc
+ var/mission
+
+ var/mob/living/carbon/human/Ninja
+
+/datum/round_event/ninja/setup()
+ helping_station = rand(0,1)
+
+/datum/round_event/ninja/kill()
+ if(!success_spawn && control)
+ control.occurrences--
+ return ..()
+
+/datum/round_event/ninja/start()
+ //selecting a spawn_loc
+ if(!spawn_loc)
+ var/list/spawn_locs = list()
+ for(var/obj/effect/landmark/L in landmarks_list)
+ if(isturf(L.loc))
+ switch(L.name)
+ if("ninjaspawn","carpspawn")
+ spawn_locs += L.loc
+ if(!spawn_locs.len)
+ return kill()
+ spawn_loc = pick(spawn_locs)
+ if(!spawn_loc)
+ return kill()
+
+ //selecting a candidate player
+ if(!key)
+ var/list/candidates = get_candidates(BE_NINJA)
+ if(!candidates.len)
+ return kill()
+ var/client/C = pick(candidates)
+ key = C.key
+ if(!key)
+ return kill()
+
+ //We prepare the mind before we spawn the ninja mob, so we cannot simply do mob.key = key then modify the mind.
+ //instead we make the mind and modify it, then make sure it is active and mind.transfer_to(mob)
+ //alternatively we could do mob.mind = mind;mob.key=key
+ var/datum/mind/Mind = create_ninja_mind(key)
+ Mind.active = 1
+
+ //generate objectives - You'll generally get 6 objectives (Ninja is meant to be hardmode!)
+ if(mission)
+ var/datum/objective/O = new /datum/objective(mission)
+ O.owner = Mind
+ Mind.objectives += O
+ else
+ if(helping_station) //DS are the highest priority (if we're a helpful ninja)
+ for(var/datum/mind/M in ticker.minds)
+ if(M.current && M.current.stat != DEAD)
+ if(M.special_role == "Death Commando")
+ var/datum/objective/assassinate/O = new /datum/objective/assassinate()
+ O.owner = Mind
+ O.target = M
+ O.explanation_text = "Slay \the [M.current.real_name], the Death Commando."
+ Mind.objectives += O
+
+ else //Xenos are the highest priority (if we're not so helpful) Although this makes zero sense at all...
+ for(var/mob/living/carbon/alien/humanoid/queen/Q in player_list)
+ if(Q.mind && Q.stat != DEAD)
+ var/datum/objective/assassinate/O = new /datum/objective/assassinate()
+ O.owner = Mind
+ O.target = Q.mind
+ O.explanation_text = "Slay \the [Q.real_name]."
+ Mind.objectives += O
+
+ if(Mind.objectives.len < 4) //not enough objectives still!
+ var/list/possible_targets = list()
+ for(var/datum/mind/M in ticker.minds)
+ if(M.current && M.current.stat != DEAD)
+ if(istype(M.current,/mob/living/carbon/human))
+ if(M.special_role)
+ possible_targets[M] = 0 //bad-guy
+ else if(M.assigned_role in command_positions)
+ possible_targets[M] = 1 //good-guy
+
+ var/list/objectives = list(1,2,3,4)
+ while(Mind.objectives.len < 4) //still not enough objectives!
+ switch(pick_n_take(objectives))
+ if(1) //research
+ var/datum/objective/download/O = new /datum/objective/download()
+ O.owner = Mind
+ O.gen_amount_goal()
+ Mind.objectives += O
+
+ if(2) //steal
+ var/datum/objective/steal/special/O = new /datum/objective/steal/special()
+ O.owner = Mind
+ Mind.objectives += O
+
+ if(3) //protect/kill
+ if(!possible_targets.len) continue
+ var/selected = rand(1,possible_targets.len)
+ var/datum/mind/M = possible_targets[selected]
+ var/is_bad_guy = possible_targets[M]
+ possible_targets.Cut(selected,selected+1)
+
+ if(is_bad_guy ^ helping_station) //kill (good-ninja + bad-guy or bad-ninja + good-guy)
+ var/datum/objective/assassinate/O = new /datum/objective/assassinate()
+ O.owner = Mind
+ O.target = M
+ O.explanation_text = "Slay \the [M.current.real_name], the [M.assigned_role]."
+ Mind.objectives += O
+ else //protect
+ var/datum/objective/protect/O = new /datum/objective/protect()
+ O.owner = Mind
+ O.target = M
+ O.explanation_text = "Protect \the [M.current.real_name], the [M.assigned_role], from harm."
+ Mind.objectives += O
+ if(4) //debrain/capture
+ if(!possible_targets.len) continue
+ var/selected = rand(1,possible_targets.len)
+ var/datum/mind/M = possible_targets[selected]
+ var/is_bad_guy = possible_targets[M]
+ possible_targets.Cut(selected,selected+1)
+
+ if(is_bad_guy ^ helping_station) //debrain (good-ninja + bad-guy or bad-ninja + good-guy)
+ var/datum/objective/debrain/O = new /datum/objective/debrain()
+ O.owner = Mind
+ O.target = M
+ O.explanation_text = "Steal the brain of [M.current.real_name]."
+ Mind.objectives += O
+ else //capture
+ var/datum/objective/capture/O = new /datum/objective/capture()
+ O.owner = Mind
+ O.gen_amount_goal()
+ Mind.objectives += O
+ else
+ break
+
+ //Add a survival objective since it's usually broad enough for any round type.
+ var/datum/objective/O = new /datum/objective/survive()
+ O.owner = Mind
+ Mind.objectives += O
+
+ //Finally, add their RP-directive
+ var/directive = generate_ninja_directive()
+ O = new /datum/objective(directive) //making it an objective so admins can reward the for completion
+ O.owner = Mind
+ Mind.objectives += O
+
+ //add some RP-fluff
+ Mind.store_memory("I am an elite mercenary assassin of the mighty Spider Clan. A SPACE NINJA!")
+ Mind.store_memory("Suprise is my weapon. Shadows are my armor. Without them, I am nothing. (//initialize your suit by right clicking on it, to use abilities like stealth)!")
+ Mind.store_memory("Officially, [helping_station?"Nanotrasen":"The Syndicate"] are my employer.")
+
+ //spawn the ninja and assign the candidate
+ Ninja = create_space_ninja(spawn_loc)
+ Mind.transfer_to(Ninja)
+
+ //initialise equipment
+ Ninja.wear_suit:randomize_param()
+ Ninja.internal = Ninja.s_store
+ if(Ninja.internals)
+ Ninja.internals.icon_state = "internal1"
+
+ if(Ninja.mind != Mind) //something has gone wrong!
+ ERROR("The ninja wasn't assigned the right mind. ;ç;")
+
+ Ninja << sound('sound/effects/ninja_greeting.ogg') //so ninja you probably wouldn't even know if you were made one
+
+ success_spawn = 1
+
+/*
+This proc will give the ninja a directive to follow. They are not obligated to do so but it's a fun roleplay reminder.
+Making this random or semi-random will probably not work without it also being incredibly silly.
+As such, it's hard-coded for now. No reason for it not to be, really.
+*/
+/datum/round_event/ninja/proc/generate_ninja_directive()
+ switch(rand(1,13))
+ if(1) return "The Spider Clan must not be linked to this operation. Remain as hidden and covert as possible."
+ if(2) return "[station_name] is financed by an enemy of the Spider Clan. Cause as much structural damage as possible."
+ if(3) return "A wealthy animal rights activist has made a request we cannot refuse. Prioritize saving animal lives whenever possible."
+ if(4) return "The Spider Clan absolutely cannot be linked to this operation. Eliminate all witnesses using most extreme prejudice."
+ if(5) return "We are currently negotiating with Nanotrasen command. Prioritize saving human lives over ending them."
+ if(6) return "We are engaged in a legal dispute over [station_name]. If a laywer is present on board, force their cooperation in the matter."
+ if(7) return "A financial backer has made an offer we cannot refuse. Implicate Syndicate involvement in the operation."
+ if(8) return "Let no one question the mercy of the Spider Clan. Ensure the safety of all non-essential personnel you encounter."
+ if(9) return "A free agent has proposed a lucrative business deal. Implicate Nanotrasen involvement in the operation."
+ if(10) return "Our reputation is on the line. Harm as few civilians or innocents as possible."
+ if(11) return "Our honor is on the line. Utilize only honorable tactics when dealing with opponents."
+ if(12) return "We are currently negotiating with a Syndicate leader. Disguise assassinations as suicide or another natural cause."
+ else return "There are no special supplemental instructions at this time."
+
+/*
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
++++++++++++++++++++++++++++++++++++++// //++++++++++++++++++++++++++++++++++
+======================================SPACE NINJA SETUP====================================
+___________________________________________________________________________________________
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+*/
+
+/*
+ README:
+
+ Data:
+
+ >> space_ninja.dm << is this file. It contains a variety of procs related to either spawning space ninjas,
+ modifying their verbs, various help procs, testing debug-related content, or storing unused procs for later.
+ Similar functions should go into this file, along with anything else that may not have an explicit category.
+ IMPORTANT: actual ninja suit, gloves, etc, are stored under the appropriate clothing files. If you need to change
+ variables or look them up, look there. Easiest way is through the map file browser.
+
+ >> ninja_abilities.dm << contains all the ninja-related powers. Spawning energy swords, teleporting, and the like.
+ If more powers are added, or perhaps something related to powers, it should go there. Make sure to describe
+ what an ability/power does so it's easier to reference later without looking at the code.
+ IMPORTANT: verbs are still somewhat funky to work with. If an argument is specified but is not referenced in a way
+ BYOND likes, in the code content, the verb will fail to trigger. Nothing will happen, literally, when clicked.
+ This can be bypassed by either referencing the argument properly, or linking to another proc with the argument
+ attached. The latter is what I like to do for certain cases--sometimes it's necessary to do that regardless.
+
+ >> ninja_equipment.dm << deals with all the equipment-related procs for a ninja. Primarily it has the suit, gloves,
+ and mask. The suit is by far the largest section of code out of the three and includes a lot of code that ties in
+ to other functions. This file has gotten kind of large so breaking it up may be in order. I use section hearders.
+ IMPORTANT: not much to say here. Follow along with the comments and adding new functions should be a breeze. Also
+ know that certain equipment pieces are linked in other files. The energy blade, for example, has special
+ functions defined in the appropriate files (airlock, securestorage, etc).
+
+ General Notes:
+
+ I created space ninjas with the expressed purpose of spicing up boring rounds. That is, ninjas are to xenos as marauders are to
+ death squads. Ninjas are stealthy, tech-savvy, and powerful. Not to say marauders are all of those things, but a clever ninja
+ should have little problem murderampaging their way through just about anything. Short of admin wizards maybe.
+ HOWEVER!
+ Ninjas also have a fairly great weakness as they require energy to use abilities. If, theoretically, there is a game
+ mode based around space ninjas, make sure to account for their energy needs.
+
+ Admin Notes:
+
+ Ninjas are not admin PCs--please do not use them for that purpose. They are another way to participate in the game post-death,
+ like pais, xenos, death squads, and cyborgs.
+ I'm currently looking for feedback from regular players since beta testing is largely done. I would appreciate if
+ you spawned regular players as ninjas when rounds are boring. Or exciting, it's all good as long as there is feedback.
+ You can also spawn ninja gear manually if you want to.
+
+ How to do that:
+ Make sure your character has a mind.
+ Change their assigned_role to "MODE", no quotes. Otherwise, the suit won't initialize.
+ Change their special_role to "Space Ninja", no quotes. Otherwise, the character will be gibbed.
+ Spawn ninja gear, put it on, hit initialize. Let the suit do the rest. You are now a space ninja.
+ I don't recommend messing with suit variables unless you really know what you're doing.
+
+ Miscellaneous Notes:
+
+ Potential Upgrade Tree:
+ Energy Shield:
+ Extra Ability
+ Syndicate Shield device?
+ Works like the force wall spell, except can be kept indefinitely as long as energy remains. Toggled on or off.
+ Would block bullets and the like.
+ Phase Shift
+ Extra Ability
+ Advanced Sensors?
+ Instead of being unlocked at the start, Phase Shieft would become available once requirements are met.
+ Uranium-based Recharger:
+ Suit Upgrade
+ Unsure
+ Instead of losing energy each second, the suit would regain the same amount of energy.
+ This would not count in activating stealth and similar.
+ Extended Battery Life:
+ Suit Upgrade
+ Battery of higher capacity
+ Already implemented. Replace current battery with one of higher capacity.
+ Advanced Cloak-Tech device.
+ Suit Upgrade
+ Syndicate Cloaking Device?
+ Remove cloak failure rate.
+*/
+
+
+//=======//CURRENT PLAYER VERB//=======//
+
+/client/proc/cmd_admin_ninjafy(var/mob/living/carbon/human/H in player_list)
+ set category = null
+ set name = "Make Space Ninja"
+
+ if(!ticker)
+ alert("Wait until the game starts")
+ return
+
+ if(!istype(H))
+ return
+
+ if(alert(src, "You sure?", "Confirm", "Yes", "No") != "Yes")
+ return
+
+ log_admin("[key_name(src)] turned [H.key] into a Space Ninja.")
+ H.mind = create_ninja_mind(H.key)
+ H.mind_initialize()
+ H.equip_space_ninja(1)
+ if(istype(H.wear_suit, /obj/item/clothing/suit/space/space_ninja))
+ H.wear_suit:randomize_param()
+ spawn(0)
+ H.wear_suit:ninitialize(10,H)
+
+//=======//CURRENT GHOST VERB//=======//
+
+/client/proc/send_space_ninja()
+ set category = "Fun"
+ set name = "Spawn Space Ninja"
+ set desc = "Spawns a space ninja for when you need a teenager with attitude."
+ set popup_menu = 0
+
+ if(!holder)
+ src << "Only administrators may use this command."
+ return
+ if(!ticker.mode)
+ alert("The game hasn't started yet!")
+ return
+ if(alert("Are you sure you want to send in a space ninja?",,"Yes","No")=="No")
+ return
+
+ var/mission = copytext(sanitize(input(src, "Please specify which mission the space ninja shall undertake.", "Specify Mission", null) as text|null),1,MAX_MESSAGE_LEN)
+
+ var/client/C = input("Pick character to spawn as the Space Ninja", "Key", "") as null|anything in clients
+ if(!C)
+ return
+
+ var/datum/round_event/ninja/E = new /datum/round_event/ninja()
+ E.key=C.key
+ E.mission=mission
+
+ message_admins("[key_name_admin(key)] has spawned [key_name_admin(C.key)] as a Space Ninja.")
+ log_admin("[key] used Spawn Space Ninja.")
+
+ return
+
+//=======//NINJA CREATION PROCS//=======//
+
+/proc/create_space_ninja(spawn_loc)
+ var/mob/living/carbon/human/new_ninja = new(spawn_loc)
+ if(prob(50)) new_ninja.gender = "female"
+ var/datum/preferences/A = new()//Randomize appearance for the ninja.
+ A.real_name = "[pick(ninja_titles)] [pick(ninja_names)]"
+ A.copy_to(new_ninja)
+ ready_dna(new_ninja)
+ new_ninja.equip_space_ninja()
+ return new_ninja
+
+/mob/living/carbon/human/proc/equip_space_ninja(safety=0)//Safety in case you need to unequip stuff for existing characters.
+ if(safety)
+ qdel(w_uniform)
+ qdel(wear_suit)
+ qdel(wear_mask)
+ qdel(head)
+ qdel(shoes)
+ qdel(gloves)
+
+ var/obj/item/device/radio/R = new /obj/item/device/radio/headset(src)
+ equip_to_slot_or_del(R, slot_ears)
+ equip_to_slot_or_del(new /obj/item/clothing/under/color/black(src), slot_w_uniform)
+ equip_to_slot_or_del(new /obj/item/clothing/shoes/space_ninja(src), slot_shoes)
+ equip_to_slot_or_del(new /obj/item/clothing/suit/space/space_ninja(src), slot_wear_suit)
+ equip_to_slot_or_del(new /obj/item/clothing/gloves/space_ninja(src), slot_gloves)
+ equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/space_ninja(src), slot_head)
+ equip_to_slot_or_del(new /obj/item/clothing/mask/gas/voice/space_ninja(src), slot_wear_mask)
+ equip_to_slot_or_del(new /obj/item/clothing/glasses/night(src), slot_glasses)
+ equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_belt)
+ equip_to_slot_or_del(new /obj/item/weapon/c4(src), slot_r_store)
+ equip_to_slot_or_del(new /obj/item/weapon/c4(src), slot_l_store)
+ equip_to_slot_or_del(new /obj/item/weapon/tank/internals/emergency_oxygen(src), slot_s_store)
+ equip_to_slot_or_del(new /obj/item/weapon/tank/jetpack/carbondioxide(src), slot_back)
+
+ var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(src)
+ E.imp_in = src
+ E.implanted = 1
+ E.implanted(src)
+ return 1
+
+//=======//HELPER PROCS//=======//
+
+//Randomizes suit parameters.
+/obj/item/clothing/suit/space/space_ninja/proc/randomize_param()
+ s_cost = rand(1,20)
+ s_acost = rand(20,100)
+ k_cost = rand(100,500)
+ k_damage = rand(1,20)
+ s_delay = rand(10,100)
+ s_bombs = rand(5,20)
+ a_boost = rand(1,7)
+
+//This proc prevents the suit from being taken off.
+/obj/item/clothing/suit/space/space_ninja/proc/lock_suit(mob/living/carbon/U, X = 0)
+ if(X)//If you want to check for icons.
+ icon_state = U.gender==FEMALE ? "s-ninjanf" : "s-ninjan"
+ U:gloves.icon_state = "s-ninjan"
+ U:gloves.item_state = "s-ninjan"
+ else
+ if(U.mind.special_role!="Space Ninja")
+ U << "\red fÄTaL ÈÈRRoR: 382200-*#00CÖDE RED\nUNAU†HORIZED USÈ DETÈC†††eD\nCoMMÈNCING SUB-R0U†IN3 13...\nTÈRMInATING U-U-USÈR..."
+ U.gib()
+ return 0
+ if(!istype(U:head, /obj/item/clothing/head/helmet/space/space_ninja))
+ U << "ERROR: 100113 UNABLE TO LOCATE HEAD GEAR\nABORTING..."
+ return 0
+ if(!istype(U:shoes, /obj/item/clothing/shoes/space_ninja))
+ U << "ERROR: 122011 UNABLE TO LOCATE FOOT GEAR\nABORTING..."
+ return 0
+ if(!istype(U:gloves, /obj/item/clothing/gloves/space_ninja))
+ U << "ERROR: 110223 UNABLE TO LOCATE HAND GEAR\nABORTING..."
+ return 0
+
+ affecting = U
+ flags |= NODROP //colons make me go all |=
+ slowdown = 0
+ n_hood = U:head
+ n_hood.flags |= NODROP
+ n_shoes = U:shoes
+ n_shoes.flags |= NODROP
+ n_shoes.slowdown--
+ n_gloves = U:gloves
+ n_gloves.flags |= NODROP
+
+ return 1
+
+//This proc allows the suit to be taken off.
+/obj/item/clothing/suit/space/space_ninja/proc/unlock_suit()
+ affecting = null
+ flags &= ~NODROP
+ slowdown = 1
+ icon_state = "s-ninja"
+ if(n_hood)//Should be attached, might not be attached.
+ n_hood.flags &= ~NODROP
+ if(n_shoes)
+ n_shoes.flags &= ~NODROP
+ n_shoes.slowdown++
+ if(n_gloves)
+ n_gloves.icon_state = "s-ninja"
+ n_gloves.item_state = "s-ninja"
+ n_gloves.flags &= ~NODROP
+ n_gloves.candrain=0
+ n_gloves.draining=0
+
+//Allows the mob to grab a stealth icon.
+/mob/proc/NinjaStealthActive(atom/A)//A is the atom which we are using as the overlay.
+ invisibility = INVISIBILITY_LEVEL_TWO//Set ninja invis to 2.
+ var/icon/opacity_icon = new(A.icon, A.icon_state)
+ var/icon/alpha_mask = getIconMask(src)
+ var/icon/alpha_mask_2 = new('icons/effects/effects.dmi', "at_shield1")
+ alpha_mask.AddAlphaMask(alpha_mask_2)
+ opacity_icon.AddAlphaMask(alpha_mask)
+ for(var/i=0,i<5,i++)//And now we add it as overlays. It's faster than creating an icon and then merging it.
+ var/image/I = image("icon" = opacity_icon, "icon_state" = A.icon_state, "layer" = layer+0.8)//So it's above other stuff but below weapons and the like.
+ switch(i)//Now to determine offset so the result is somewhat blurred.
+ if(1)
+ I.pixel_x -= 1
+ if(2)
+ I.pixel_x += 1
+ if(3)
+ I.pixel_y -= 1
+ if(4)
+ I.pixel_y += 1
+
+ overlays += I//And finally add the overlay.
+ overlays += image("icon"='icons/effects/effects.dmi',"icon_state" ="electricity","layer" = layer+0.9)
+
+//When ninja steal malfunctions.
+/mob/proc/NinjaStealthMalf()
+ invisibility = 0//Set ninja invis to 0.
+ overlays += image("icon"='icons/effects/effects.dmi',"icon_state" ="electricity","layer" = layer+0.9)
+ playsound(loc, 'sound/effects/stealthoff.ogg', 75, 1)
+
+//=======//GENERIC VERB MODIFIERS//=======//
+
+/obj/item/clothing/suit/space/space_ninja/proc/grant_equip_verbs()
+ verbs -= /obj/item/clothing/suit/space/space_ninja/proc/init
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/deinit
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/spideros
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/stealth
+ n_gloves.verbs += /obj/item/clothing/gloves/space_ninja/proc/toggled
+
+ s_initialized = 1
+
+/obj/item/clothing/suit/space/space_ninja/proc/remove_equip_verbs()
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/init
+ verbs -= /obj/item/clothing/suit/space/space_ninja/proc/deinit
+ verbs -= /obj/item/clothing/suit/space/space_ninja/proc/spideros
+ verbs -= /obj/item/clothing/suit/space/space_ninja/proc/stealth
+ if(n_gloves)
+ n_gloves.verbs -= /obj/item/clothing/gloves/space_ninja/proc/toggled
+
+ s_initialized = 0
+
+/obj/item/clothing/suit/space/space_ninja/proc/grant_ninja_verbs()
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjashift
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjasmoke
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjaboost
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjablade
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjastar
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjanet
+
+ s_initialized=1
+ slowdown=0
+
+/obj/item/clothing/suit/space/space_ninja/proc/remove_ninja_verbs()
+ verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjashift
+ verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt
+ verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjasmoke
+ verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjaboost
+ verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse
+ verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjablade
+ verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjastar
+ verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjanet
+
+//=======//KAMIKAZE VERBS//=======//
+
+/obj/item/clothing/suit/space/space_ninja/proc/grant_kamikaze(mob/living/carbon/U)
+ verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjashift
+ verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt
+ verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse
+ verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjastar
+ verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjanet
+
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjaslayer
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjawalk
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjamirage
+
+ verbs -= /obj/item/clothing/suit/space/space_ninja/proc/stealth
+
+ kamikaze = 1
+
+ icon_state = U.gender==FEMALE ? "s-ninjakf" : "s-ninjak"
+ if(n_gloves)
+ n_gloves.icon_state = "s-ninjak"
+ n_gloves.item_state = "s-ninjak"
+ n_gloves.candrain = 0
+ n_gloves.draining = 0
+ n_gloves.verbs -= /obj/item/clothing/gloves/space_ninja/proc/toggled
+
+ cancel_stealth()
+
+ U << browse(null, "window=spideros")
+ U << "Do or Die, LET'S ROCK!!"
+
+/obj/item/clothing/suit/space/space_ninja/proc/remove_kamikaze(mob/living/carbon/U)
+ if(kamikaze)
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjashift
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjastar
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjanet
+
+ verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjaslayer
+ verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjawalk
+ verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjamirage
+
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/stealth
+ if(n_gloves)
+ n_gloves.verbs -= /obj/item/clothing/gloves/space_ninja/proc/toggled
+
+ U.incorporeal_move = 0
+ kamikaze = 0
+ k_unlock = 0
+ U << "Disengaging mode...\nCODE NAME: KAMIKAZE"
+
+//=======//AI VERBS//=======//
+
+/obj/item/clothing/suit/space/space_ninja/proc/grant_AI_verbs()
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/ai_hack_ninja
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/ai_return_control
+
+ s_busy = 0
+ s_control = 0
+
+/obj/item/clothing/suit/space/space_ninja/proc/remove_AI_verbs()
+ verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ai_hack_ninja
+ verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ai_return_control
+
+ s_control = 1
+
+
+//Alternate ninja speech replacement.
+/*This text is hilarious but also absolutely retarded.
+message = replacetext(message, "l", "r")
+message = replacetext(message, "rr", "ru")
+message = replacetext(message, "v", "b")
+message = replacetext(message, "f", "hu")
+message = replacetext(message, "'t", "")
+message = replacetext(message, "t ", "to ")
+message = replacetext(message, " I ", " ai ")
+message = replacetext(message, "th", "z")
+message = replacetext(message, "ish", "isu")
+message = replacetext(message, "is", "izu")
+message = replacetext(message, "ziz", "zis")
+message = replacetext(message, "se", "su")
+message = replacetext(message, "br", "bur")
+message = replacetext(message, "ry", "ri")
+message = replacetext(message, "you", "yuu")
+message = replacetext(message, "ck", "cku")
+message = replacetext(message, "eu", "uu")
+message = replacetext(message, "ow", "au")
+message = replacetext(message, "are", "aa")
+message = replacetext(message, "ay", "ayu")
+message = replacetext(message, "ea", "ii")
+message = replacetext(message, "ch", "chi")
+message = replacetext(message, "than", "sen")
+message = replacetext(message, ".", "")
+message = lowertext(message)
+*/
+
+
+/*
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
++++++++++++++++++++++++++++++++++// //++++++++++++++++++++++++++++++++++
+==================================SPACE NINJA ABILITIES====================================
+___________________________________________________________________________________________
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+*/
+
+//=======//SAFETY CHECK//=======//
+/*
+X is optional, tells the proc to check for specific stuff. C is also optional.
+All the procs here assume that the character is wearing the ninja suit if they are using the procs.
+They should, as I have made every effort for that to be the case.
+In the case that they are not, I imagine the game will run-time error like crazy.
+s_cooldown ticks off each second based on the suit recharge proc, in seconds. Default of 1 seconds. Some abilities have no cool down.
+*/
+/obj/item/clothing/suit/space/space_ninja/proc/ninjacost(C = 0,X = 0)
+ var/mob/living/carbon/human/U = affecting
+ if( (U.stat||U.incorporeal_move)&&X!=3 )//Will not return if user is using an adrenaline booster since you can use them when stat==1.
+ U << "You must be conscious and solid to do this."//It's not a problem of stat==2 since the ninja will explode anyway if they die.
+ return 1
+ else if(C&&cell.chargeNot enough energy."
+ return 1
+ switch(X)
+ if(1)
+ cancel_stealth()//Get rid of it.
+ if(2)
+ if(s_bombs<=0)
+ U << "There are no more smoke bombs remaining."
+ return 1
+ if(3)
+ if(a_boost<=0)
+ U << "You do not have any more adrenaline boosters."
+ return 1
+ return (s_coold)//Returns the value of the variable which counts down to zero.
+
+//=======//TELEPORT GRAB CHECK//=======//
+/obj/item/clothing/suit/space/space_ninja/proc/handle_teleport_grab(turf/T, mob/living/U)
+ if(istype(U.get_active_hand(),/obj/item/weapon/grab))//Handles grabbed persons.
+ var/obj/item/weapon/grab/G = U.get_active_hand()
+ G.affecting.loc = locate(T.x+rand(-1,1),T.y+rand(-1,1),T.z)//variation of position.
+ if(istype(U.get_inactive_hand(),/obj/item/weapon/grab))
+ var/obj/item/weapon/grab/G = U.get_inactive_hand()
+ G.affecting.loc = locate(T.x+rand(-1,1),T.y+rand(-1,1),T.z)//variation of position.
+ return
+
+//=======//SMOKE//=======//
+/*Summons smoke in radius of user.
+Not sure why this would be useful (it's not) but whatever. Ninjas need their smoke bombs.*/
+/obj/item/clothing/suit/space/space_ninja/proc/ninjasmoke()
+ set name = "Smoke Bomb"
+ set desc = "Blind your enemies momentarily with a well-placed smoke bomb."
+ set category = "Ninja Ability"
+ set popup_menu = 0//Will not see it when right clicking.
+
+ if(!ninjacost(,2))
+ var/mob/living/carbon/human/U = affecting
+ U << "There are [s_bombs] smoke bombs remaining."
+ var/datum/effect/effect/system/bad_smoke_spread/smoke = new /datum/effect/effect/system/bad_smoke_spread()
+ smoke.set_up(10, 0, U.loc)
+ smoke.start()
+ playsound(U.loc, 'sound/effects/bamf.ogg', 50, 2)
+ s_bombs--
+ s_coold = 1
+ return
+
+//=======//9-8 TILE TELEPORT//=======//
+//Click to to teleport 9-10 tiles in direction facing.
+/obj/item/clothing/suit/space/space_ninja/proc/ninjajaunt()
+ set name = "Phase Jaunt (10E)"
+ set desc = "Utilizes the internal VOID-shift device to rapidly transit in direction facing."
+ set category = "Ninja Ability"
+ set popup_menu = 0
+
+ var/C = 100
+ if(!ninjacost(C,1))
+ var/mob/living/carbon/human/U = affecting
+ var/turf/destination = get_teleport_loc(U.loc,U,9,1,3,1,0,1)
+ var/turf/mobloc = get_turf(U.loc)//To make sure that certain things work properly below.
+ if(destination&&istype(mobloc, /turf))//The turf check prevents unusual behavior. Like teleporting out of cryo pods, cloners, mechs, etc.
+ spawn(0)
+ playsound(U.loc, "sparks", 50, 1)
+ anim(mobloc,src,'icons/mob/mob.dmi',,"phaseout",,U.dir)
+
+ handle_teleport_grab(destination, U)
+ U.loc = destination
+
+ spawn(0)
+ spark_system.start()
+ playsound(U.loc, 'sound/effects/phasein.ogg', 25, 1)
+ playsound(U.loc, "sparks", 50, 1)
+ anim(U.loc,U,'icons/mob/mob.dmi',,"phasein",,U.dir)
+
+ spawn(0)
+ destination.phase_damage_creatures(20,U)//Paralyse and damage mobs and mechas on the turf
+ s_coold = 1
+ cell.charge-=(C*10)
+ else
+ U << "The VOID-shift device is malfunctioning, teleportation failed."
+ return
+
+//=======//RIGHT CLICK TELEPORT//=======//
+//Right click to teleport somewhere, almost exactly like admin jump to turf.
+/obj/item/clothing/suit/space/space_ninja/proc/ninjashift(turf/T in oview())
+ set name = "Phase Shift (20E)"
+ set desc = "Utilizes the internal VOID-shift device to rapidly transit to a destination in view."
+ set category = null//So it does not show up on the panel but can still be right-clicked.
+ set src = usr.contents//Fixes verbs not attaching properly for objects. Praise the DM reference guide!
+
+ var/C = 200
+ if(!ninjacost(C,1))
+ var/mob/living/carbon/human/U = affecting
+ var/turf/mobloc = get_turf(U.loc)//To make sure that certain things work properly below.
+ if((!T.density)&&istype(mobloc, /turf))
+ spawn(0)
+ playsound(U.loc, 'sound/effects/sparks4.ogg', 50, 1)
+ anim(mobloc,src,'icons/mob/mob.dmi',,"phaseout",,U.dir)
+
+ handle_teleport_grab(T, U)
+ U.loc = T
+
+ spawn(0)
+ spark_system.start()
+ playsound(U.loc, 'sound/effects/phasein.ogg', 25, 1)
+ playsound(U.loc, 'sound/effects/sparks2.ogg', 50, 1)
+ anim(U.loc,U,'icons/mob/mob.dmi',,"phasein",,U.dir)
+
+ spawn(0)//Any living mobs in teleport area are gibbed.
+ T.phase_damage_creatures(20,U)//Paralyse and damage mobs and mechas on the turf
+ s_coold = 1
+ cell.charge-=(C*10)
+ else
+ U << "You cannot teleport into solid walls or from solid matter"
+ return
+
+//=======//EM PULSE//=======//
+//Disables nearby tech equipment.
+/obj/item/clothing/suit/space/space_ninja/proc/ninjapulse()
+ set name = "EM Burst (25E)"
+ set desc = "Disable any nearby technology with a electro-magnetic pulse."
+ set category = "Ninja Ability"
+ set popup_menu = 0
+
+ var/C = 250
+ if(!ninjacost(C,1))
+ var/mob/living/carbon/human/U = affecting
+ playsound(U.loc, 'sound/effects/EMPulse.ogg', 60, 2)
+ empulse(U, 4, 6) //Procs sure are nice. Slightly weaker than wizard's disable tch.
+ s_coold = 2
+ cell.charge-=(C*10)
+ return
+
+//=======//ENERGY BLADE//=======//
+//Summons a blade of energy in active hand.
+/obj/item/clothing/suit/space/space_ninja/proc/ninjablade()
+ set name = "Energy Blade (5E)"
+ set desc = "Create a focused beam of energy in your active hand."
+ set category = "Ninja Ability"
+ set popup_menu = 0
+
+ var/C = 50
+ if(!ninjacost(C))
+ var/mob/living/carbon/human/U = affecting
+ if(!kamikaze)
+ if(!U.get_active_hand()&&!istype(U.get_inactive_hand(), /obj/item/weapon/melee/energy/blade))
+ var/obj/item/weapon/melee/energy/blade/W = new()
+ spark_system.start()
+ playsound(U.loc, "sparks", 50, 1)
+ U.put_in_hands(W)
+ cell.charge-=(C*10)
+ else
+ U << "You can only summon one blade. Try dropping an item first."
+ else//Else you can run around with TWO energy blades. I don't know why you'd want to but cool factor remains.
+ if(!U.get_active_hand())
+ var/obj/item/weapon/melee/energy/blade/W = new()
+ U.put_in_hands(W)
+ if(!U.get_inactive_hand())
+ var/obj/item/weapon/melee/energy/blade/W = new()
+ U.put_in_inactive_hand(W)
+ spark_system.start()
+ playsound(U.loc, "sparks", 50, 1)
+ s_coold = 1
+ return
+
+//=======//NINJA STARS//=======//
+/*Shoots ninja stars at random people.
+This could be a lot better but I'm too tired atm.*/
+/obj/item/clothing/suit/space/space_ninja/proc/ninjastar()
+ set name = "Energy Star (5E)"
+ set desc = "Launches an energy star at a random living target."
+ set category = "Ninja Ability"
+ set popup_menu = 0
+
+ var/C = 50
+ if(!ninjacost(C))
+ var/mob/living/carbon/human/U = affecting
+ var/targets[] = list()//So yo can shoot while yo throw dawg
+ for(var/mob/living/M in oview(loc))
+ if(M.stat) continue//Doesn't target corpses or paralyzed persons.
+ targets.Add(M)
+ if(targets.len)
+ var/mob/living/target=pick(targets)//The point here is to pick a random, living mob in oview to shoot stuff at.
+
+ var/turf/curloc = U.loc
+ var/atom/targloc = get_turf(target)
+ if (!targloc || !istype(targloc, /turf) || !curloc)
+ return
+ if (targloc == curloc)
+ return
+ var/obj/item/projectile/energy/dart/A = new /obj/item/projectile/energy/dart(U.loc)
+ A.current = curloc
+ A.yo = targloc.y - curloc.y
+ A.xo = targloc.x - curloc.x
+ cell.charge-=(C*10)
+ A.fire()
+ else
+ U << "There are no targets in view."
+ return
+
+//=======//ENERGY NET//=======//
+/*Allows the ninja to capture people, I guess.
+Must right click on a mob to activate.*/
+/obj/item/clothing/suit/space/space_ninja/proc/ninjanet(mob/living/carbon/M in oview())//Only living carbon mobs.
+ set name = "Energy Net (20E)"
+ set desc = "Captures a fallen opponent in a net of energy. Will teleport them to a holding facility after 30 seconds."
+ set category = null
+ set src = usr.contents
+
+ var/C = 200
+ if(!ninjacost(C,1)&&iscarbon(M))
+ var/mob/living/carbon/human/U = affecting
+ if(M.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame.
+ //if(M)//DEBUG
+ if(!locate(/obj/effect/energy_net) in M.loc)//Check if they are already being affected by an energy net.
+ for(var/turf/T in getline(U.loc, M.loc))
+ if(T.density)//Don't want them shooting nets through walls. It's kind of cheesy.
+ U << "You may not use an energy net through solid obstacles!"
+ return
+ spawn(0)
+ U.Beam(M,"n_beam",,15)
+ M.anchored = 1//Anchors them so they can't move.
+ U.say("Get over here!")
+ var/obj/effect/energy_net/E = new /obj/effect/energy_net(M.loc)
+ E.layer = M.layer+1//To have it appear one layer above the mob.
+ for(var/mob/O in viewers(U, 3))
+ O.show_message(text("[] caught [] with an energy net!", U, M), 1)
+ E.affecting = M
+ E.master = U
+ spawn(0)//Parallel processing.
+ E.process(M)
+ cell.charge-=(C*10)
+ else
+ U << "They are already trapped inside an energy net."
+ else
+ U << "They will bring no honor to your Clan!"
+ return
+
+//=======//ADRENALINE BOOST//=======//
+/*Wakes the user so they are able to do their thing. Also injects a decent dose of radium.
+Movement impairing would indicate drugs and the like.*/
+/obj/item/clothing/suit/space/space_ninja/proc/ninjaboost()
+ set name = "Adrenaline Boost"
+ set desc = "Inject a secret chemical that will counteract all movement-impairing effect."
+ set category = "Ninja Ability"
+ set popup_menu = 0
+
+ if(!ninjacost(,3))//Have to make sure stat is not counted for this ability.
+ var/mob/living/carbon/human/U = affecting
+ //Wouldn't need to track adrenaline boosters if there was a miracle injection to get rid of paralysis and the like instantly.
+ //For now, adrenaline boosters ARE the miracle injection. Well, radium, really.
+ U.SetParalysis(0)
+ U.SetStunned(0)
+ U.SetWeakened(0)
+ /*
+ Due to lag, it was possible to adrenaline boost but remain helpless while life.dm resets player stat.
+ This lead to me and others spamming adrenaline boosters because they failed to kick in on time.
+ It's technically possible to come back from crit with this but it is very temporary.
+ Life.dm will kick the player back into unconsciosness the next process loop.
+ */
+ U.stat = 0//At least now you should be able to teleport away or shoot ninja stars.
+ spawn(30)//Slight delay so the enemy does not immedietly know the ability was used. Due to lag, this often came before waking up.
+ U.say(pick("A CORNERED FOX IS MORE DANGEROUS THAN A JACKAL!","HURT ME MOOORRREEE!","IMPRESSIVE!"))
+ spawn(70)
+ reagents.reaction(U, 2)
+ reagents.trans_id_to(U, "radium", a_transfer)
+ U << "You are beginning to feel the after-effect of the injection."
+ a_boost--
+ s_coold = 3
+ return
+
+/*
+===================================================================================
+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+===================================================================================
+Or otherwise known as anime mode. Which also happens to be ridiculously powerful.
+*/
+
+//=======//NINJA MOVEMENT//=======//
+//Also makes you move like you're on crack.
+/obj/item/clothing/suit/space/space_ninja/proc/ninjawalk()
+ set name = "Shadow Walk"
+ set desc = "Combines the VOID-shift and CLOAK-tech devices to freely move between solid matter. Toggle on or off."
+ set category = "Ninja Ability"
+ set popup_menu = 0
+
+ var/mob/living/carbon/human/U = affecting
+ if(!U.incorporeal_move)
+ U.incorporeal_move = 2
+ U << "You will now phase through solid matter."
+ else
+ U.incorporeal_move = 0
+ U << "You will no-longer phase through solid matter."
+ return
+
+//=======//5 TILE TELEPORT/GIB//=======//
+//Allows to kill up to five squares in a straight line. Seriously.
+/obj/item/clothing/suit/space/space_ninja/proc/ninjaslayer()
+ set name = "Phase Slayer"
+ set desc = "Utilizes the internal VOID-shift device to kill all creatures in a straight line."
+ set category = "Ninja Ability"
+ set popup_menu = 0
+
+ if(!ninjacost())
+ var/mob/living/carbon/human/U = affecting
+ var/turf/destination = get_teleport_loc(U.loc,U,5)
+ var/turf/mobloc = get_turf(U.loc)//To make sure that certain things work properly below.
+ if(destination&&istype(mobloc, /turf))
+ U.say("Ai Satsugai!")
+ spawn(0)
+ playsound(U.loc, "sparks", 50, 1)
+ anim(mobloc,U,'icons/mob/mob.dmi',,"phaseout",,U.dir)
+
+ spawn(0)
+ for(var/turf/T in getline(mobloc, destination))
+ spawn(0)
+ T.phase_damage_creatures(190,U)
+ if(T==mobloc||T==destination) continue
+ spawn(0)
+ anim(T,U,'icons/mob/mob.dmi',,"phasein",,U.dir)
+
+ handle_teleport_grab(destination, U)
+ U.loc = destination
+
+ spawn(0)
+ spark_system.start()
+ playsound(U.loc, 'sound/effects/phasein.ogg', 25, 1)
+ playsound(U.loc, "sparks", 50, 1)
+ anim(U.loc,U,'icons/mob/mob.dmi',,"phasein",,U.dir)
+ s_coold = 1
+ else
+ U << "The VOID-shift device is malfunctioning, teleportation failed."
+ return
+
+//=======//TELEPORT BEHIND MOB//=======//
+/*Appear behind a randomly chosen mob while a few decoy teleports appear.
+This is so anime it hurts. But that's the point.*/
+/obj/item/clothing/suit/space/space_ninja/proc/ninjamirage()
+ set name = "Spider Mirage"
+ set desc = "Utilizes the internal VOID-shift device to create decoys and teleport behind a random target."
+ set category = "Ninja Ability"
+ set popup_menu = 0
+
+ if(!ninjacost())//Simply checks for stat.
+ var/mob/living/carbon/human/U = affecting
+ var/targets[]
+ targets = new()
+ for(var/mob/living/M in oview(6))
+ if(M.stat) continue//Doesn't target corpses or paralyzed people.
+ targets.Add(M)
+ if(targets.len)
+ var/mob/living/target=pick(targets)
+ var/locx
+ var/locy
+ var/turf/mobloc = get_turf(target.loc)
+ var/safety = 0
+ switch(target.dir)
+ if(NORTH)
+ locx = mobloc.x
+ locy = (mobloc.y-1)
+ if(locy<1)
+ safety = 1
+ if(SOUTH)
+ locx = mobloc.x
+ locy = (mobloc.y+1)
+ if(locy>world.maxy)
+ safety = 1
+ if(EAST)
+ locy = mobloc.y
+ locx = (mobloc.x-1)
+ if(locx<1)
+ safety = 1
+ if(WEST)
+ locy = mobloc.y
+ locx = (mobloc.x+1)
+ if(locx>world.maxx)
+ safety = 1
+ else safety=1
+ if(!safety&&istype(mobloc, /turf))
+ U.say("Kumo no Shinkiro!")
+ var/turf/picked = locate(locx,locy,mobloc.z)
+ spawn(0)
+ playsound(U.loc, "sparks", 50, 1)
+ anim(mobloc,U,'icons/mob/mob.dmi',,"phaseout",,U.dir)
+
+ spawn(0)
+ var/limit = 4
+ for(var/turf/T in oview(5))
+ if(prob(20))
+ spawn(0)
+ anim(T,U,'icons/mob/mob.dmi',,"phasein",,U.dir)
+ limit--
+ if(limit<=0) break
+
+ handle_teleport_grab(picked, U)
+ U.loc = picked
+ U.dir = target.dir
+
+ spawn(0)
+ spark_system.start()
+ playsound(U.loc, 'sound/effects/phasein.ogg', 25, 1)
+ playsound(U.loc, "sparks", 50, 1)
+ anim(U.loc,U,'icons/mob/mob.dmi',,"phasein",,U.dir)
+ s_coold = 1
+ else
+ U << "The VOID-shift device is malfunctioning, teleportation failed."
+ else
+ U << "There are no targets in view."
+ return
+
+
+//For the love of god,space out your code! This is a nightmare to read.
+
+/*
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
++++++++++++++++++++++++++++++++++// //++++++++++++++++++++++++++++++++++
+===================================SPACE NINJA EQUIPMENT===================================
+___________________________________________________________________________________________
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+*/
+
+/*
+===================================================================================
+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+===================================================================================
+*/
+
+//=======//NEW AND DEL//=======//
+
+/obj/item/clothing/suit/space/space_ninja/New()
+ ..()
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/init//suit initialize verb
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/ai_instruction//for AIs
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/ai_holo
+ //verbs += /obj/item/clothing/suit/space/space_ninja/proc/display_verb_procs//DEBUG. Doesn't work.
+ spark_system = new()//spark initialize
+ spark_system.set_up(5, 0, src)
+ spark_system.attach(src)
+ stored_research = new()//Stolen research initialize.
+ for(var/T in typesof(/datum/tech) - /datum/tech)//Store up on research.
+ stored_research += new T(src)
+ var/reagent_amount//reagent initialize
+ for(var/reagent_id in reagent_list)
+ reagent_amount += reagent_id == "radium" ? r_maxamount+(a_boost*a_transfer) : r_maxamount//AI can inject radium directly.
+ reagents = new(reagent_amount)
+ reagents.my_atom = src
+ for(var/reagent_id in reagent_list)
+ reagent_id == "radium" ? reagents.add_reagent(reagent_id, r_maxamount+(a_boost*a_transfer)) : reagents.add_reagent(reagent_id, r_maxamount)//It will take into account radium used for adrenaline boosting.
+ cell = new/obj/item/weapon/stock_parts/cell/high//The suit should *always* have a battery because so many things rely on it.
+ cell.charge = 9000//Starting charge should not be higher than maximum charge. It leads to problems with recharging.
+ NAI = new(src) //ninja intellicard
+
+/obj/item/clothing/suit/space/space_ninja/Destroy()
+ if(affecting)//To make sure the window is closed.
+ affecting << browse(null, "window=hack spideros")
+ if(AI)//If there are AIs present when the ninja kicks the bucket.
+ killai(NAI)
+ if(hologram)//If there is a hologram
+ qdel(hologram.i_attached)//Delete it and the attached image.
+ qdel(hologram)
+ ..()
+
+//Simply deletes all the attachments and self, killing all related procs.
+/obj/item/clothing/suit/space/space_ninja/proc/terminate()
+ qdel(n_hood)
+ qdel(n_gloves)
+ qdel(n_shoes)
+ qdel(src)
+
+
+
+/obj/item/clothing/suit/space/space_ninja/proc/killai(var/obj/item/device/aicard/NAI)
+ for(var/mob/living/silicon/ai/A in src)
+ if(A.client)
+ A << "Self-erase protocol dete-- *bzzzzz*"
+ A << browse(null, "window=hack spideros")
+ NAI.flush = 1
+ return
+
+
+
+//=======//SUIT VERBS//=======//
+//Verbs link to procs because verb-like procs have a bug which prevents their use if the arguments are not readily referenced.
+
+/obj/item/clothing/suit/space/space_ninja/proc/init()
+ set name = "Initialize Suit"
+ set desc = "Initializes the suit for field operation."
+ set category = "Ninja Equip"
+
+ ninitialize()
+ return
+
+/obj/item/clothing/suit/space/space_ninja/proc/deinit()
+ set name = "De-Initialize Suit"
+ set desc = "Begins procedure to remove the suit."
+ set category = "Ninja Equip"
+
+ if(s_control&&!s_busy)
+ deinitialize()
+ else
+ affecting << "The function did not trigger!"
+ return
+
+/obj/item/clothing/suit/space/space_ninja/proc/spideros()
+ set name = "Display SpiderOS"
+ set desc = "Utilize built-in computer system."
+ set category = "Ninja Equip"
+
+ if(s_control&&!s_busy&&!kamikaze)
+ display_spideros()
+ else
+ affecting << "The interface is locked!"
+ return
+
+/obj/item/clothing/suit/space/space_ninja/proc/stealth()
+ set name = "Toggle Stealth"
+ set desc = "Utilize the internal CLOAK-tech device to activate or deactivate stealth-camo."
+ set category = "Ninja Equip"
+
+ if(s_control&&!s_busy)
+ toggle_stealth()
+ else
+ affecting << "Stealth does not appear to work!"
+ return
+
+//=======//PROCESS PROCS//=======//
+
+/obj/item/clothing/suit/space/space_ninja/proc/ntick(mob/living/carbon/human/U = affecting)
+ set background = BACKGROUND_ENABLED
+
+ //Runs in the background while the suit is initialized.
+ spawn while(cell.charge>=0)
+
+ //Let's check for some safeties.
+ if(s_initialized&&!affecting) terminate()//Kills the suit and attached objects.
+ if(!s_initialized) return//When turned off the proc stops.
+ for(var/mob/living/silicon/ai/A in NAI)
+ if(A&&A.stat==2)//If there is an AI and it's ded. Shouldn't happen without purging, could happen.
+ if(!s_control)
+ ai_return_control()//Return control to ninja if the AI was previously in control.
+
+ //Now let's do the normal processing.
+ if(s_coold) s_coold--//Checks for ability s_cooldown first.
+ var/A = s_cost//s_cost is the default energy cost each ntick, usually 5.
+ if(!kamikaze)
+ if(blade_check(U))//If there is a blade held in hand.
+ A += s_acost
+ if(s_active)//If stealth is active.
+ A += s_acost
+ else
+ if(prob(s_delay))//Suit delay is used as probability. May change later.
+ U.adjustBruteLoss(k_damage)//Default damage done, usually 1.
+ A = k_cost//kamikaze cost.
+ cell.charge-=A
+ if(cell.charge<=0)
+ if(kamikaze)
+ U.say("I DIE TO LIVE AGAIN!")
+ U << browse(null, "window=spideros")//Just in case.
+ U.death()
+ return
+ cell.charge=0
+ cancel_stealth()
+ sleep(10)//Checks every second.
+
+//=======//INITIALIZE//=======//
+
+/obj/item/clothing/suit/space/space_ninja/proc/ninitialize(delay = s_delay, mob/living/carbon/human/U = loc)
+ if(U.mind && U.mind.assigned_role=="MODE" && !s_initialized && !s_busy)//Shouldn't be busy... but anything is possible I guess.
+ s_busy = 1
+ for(var/i,i<7,i++)
+ switch(i)
+ if(0)
+ U << "Now initializing..."
+ if(1)
+ if(!lock_suit(U))//To lock the suit onto wearer.
+ break
+ U << "Securing external locking mechanism...\nNeural-net established."
+ if(2)
+ U << "Extending neural-net interface...\nNow monitoring brain wave pattern..."
+ if(3)
+ if(U.stat==2||U.health<=0)
+ U << "FĆAL �Rr�R: 344--93#�&&21 BR��N |/|/aV� PATT$RN RED\nA-A-aB�rT�NG..."
+ unlock_suit()
+ break
+ lock_suit(U,1)//Check for icons.
+ U.regenerate_icons()
+ U << " Linking neural-net interface...\nPattern\green GREEN, continuing operation."
+ if(4)
+ U << "VOID-shift device status: ONLINE.\nCLOAK-tech device status: ONLINE."
+ if(5)
+ U << "Primary system status: ONLINE.\nBackup system status: ONLINE.\nCurrent energy capacity: [cell.charge]."
+ if(6)
+ U << "All systems operational. Welcome to SpiderOS, [U.real_name]."
+ grant_ninja_verbs()
+ grant_equip_verbs()
+ ntick()
+ sleep(delay)
+ s_busy = 0
+ else
+ if(!U.mind||U.mind.assigned_role!="MODE")//Your run of the mill persons shouldn't know what it is. Or how to turn it on.
+ U << "You do not understand how this suit functions. Where the heck did it even come from?"
+ else if(s_initialized)
+ U << "The suit is already functioning. Please report this bug."
+ else
+ U << "ERROR: You cannot use this function at this time."
+ return
+
+//=======//DEINITIALIZE//=======//
+
+/obj/item/clothing/suit/space/space_ninja/proc/deinitialize(delay = s_delay)
+ if(affecting==loc&&!s_busy)
+ var/mob/living/carbon/human/U = affecting
+ if(!s_initialized)
+ U << "The suit is not initialized. Please report this bug."
+ return
+ if(alert("Are you certain you wish to remove the suit? This will take time and remove all abilities.",,"Yes","No")=="No")
+ return
+ if(s_busy || NAI.flush)
+ U << "ERROR: You cannot use this function at this time."
+ return
+ s_busy = 1
+ for(var/i = 0,i<7,i++)
+ switch(i)
+ if(0)
+ U << "Now de-initializing..."
+ remove_kamikaze(U)//Shutdowns kamikaze.
+ spideros = 0//Spideros resets.
+ if(1)
+ U << "Logging off, [U:real_name]. Shutting down SpiderOS."
+ remove_ninja_verbs()
+ if(2)
+ U << "Primary system status: OFFLINE.\nBackup system status: OFFLINE."
+ if(3)
+ U << "VOID-shift device status: OFFLINE.\nCLOAK-tech device status: OFFLINE."
+ cancel_stealth()//Shutdowns stealth.
+ if(4)
+ U << "Disconnecting neural-net interface...\greenSuccess."
+ if(5)
+ U << "Disengaging neural-net interface...\greenSuccess."
+ if(6)
+ U << "Unsecuring external locking mechanism...\nNeural-net abolished.\nOperation status: FINISHED."
+ blade_check(U,2)
+ remove_equip_verbs()
+ unlock_suit()
+ U.regenerate_icons()
+ sleep(delay)
+ s_busy = 0
+ return
+
+//=======//SPIDEROS PROC//=======//
+
+/obj/item/clothing/suit/space/space_ninja/proc/display_spideros()
+ if(!affecting) return//If no mob is wearing the suit. I almost forgot about this variable.
+ var/mob/living/carbon/human/U = affecting
+ var/mob/living/silicon/ai/A = AI
+ var/display_to = s_control ? U : A//Who do we want to display certain messages to?
+
+ var/dat = "SpiderOS"
+ dat += " Refresh"
+ if(spideros)
+ dat += " | Return"
+ dat += " | Close"
+ dat += " "
+ if(s_control)
+ dat += "
SpiderOS v.1.337
"
+ dat += "Welcome, [U.real_name]. "
+ else
+ dat += "
SpiderOS v.ERR-RR00123
"
+ dat += " "
+ dat += " Current Time: [worldtime2text()] "
+ dat += " Battery Life: [round(cell.charge/100)]% "
+ dat += " Smoke Bombs: \Roman [s_bombs] "
+ dat += " pai Device: "
+ if(pai)
+ dat += "Configure"
+ dat += " | "
+ dat += "Eject"
+ else
+ dat += "None Detected"
+ dat += "
"
+ dat += "Oxygen loss: [U.getOxyLoss()]"
+ dat += " | Toxin levels: [U.getToxLoss()] "
+ dat += "Burn severity: [U.getFireLoss()]"
+ dat += " | Brute trauma: [U.getBruteLoss()] "
+ dat += "Radiation Level: [U.radiation] rad "
+ dat += "Body Temperature: [U.bodytemperature-T0C]°C ([U.bodytemperature*1.8-459.67]°F) "
+
+ for(var/datum/disease/D in U.viruses)
+ dat += "Warning: Virus Detected. Name: [D.name].Type: [D.spread_text]. Stage: [D.stage]/[D.max_stages]. Possible Cure: [D.cure_text]. "
+ dat += "
"
+ for(var/datum/reagent/R in reagents.reagent_list)
+ if(R.id=="radium"&&s_control)//Can only directly inject radium when AI is in control.
+ continue
+ dat += "
"
+ if (count == 0)
+ dat += "None detected. "
+ if(32)
+ dat += "
Hidden Menu:
"
+ if(s_control)
+ dat += "Please input password: "
+ dat += "HERE "
+ dat += " "
+ dat += "Remember, you will not be able to recharge energy during this function. If energy runs out, the suit will auto self-destruct. "
+ dat += "Use with caution. De-initialize the suit when energy is low."
+ else
+ //Only leaving this in for funnays. CAN'T LET YOU DO THAT STAR FOX
+ dat += "WARNING: Hostile runtime intrusion detected: operation locked. The Spider Clan is watching you, INTRUDER."
+ dat += "ERROR: TARANTULA.v.4.77.12 encryption algorithm detected. Unable to decrypt archive. "
+ if(4)
+ dat += {"
+
Ninja Manual:
+
Who they are:
+ Space ninjas are a special type of ninja, specifically one of the space-faring type. The vast majority of space ninjas belong to the Spider Clan, a cult-like sect, which has existed for several hundred years. The Spider Clan practice a sort of augmentation of human flesh in order to achieve a more perfect state of being and follow Postmodern Space Bushido. They also kill people for money. Their leaders are chosen from the oldest of the grand-masters, people that have lived a lot longer than any mortal man should. Being a sect of technology-loving fanatics, the Spider Clan have the very best to choose from in terms of hardware--cybernetic implants, exoskeleton rigs, hyper-capacity batteries, and you get the idea. Some believe that much of the Spider Clan equipment is based on reverse-engineered alien technology while others doubt such claims. Whatever the case, their technology is absolutely superb.
+
How they relate to other SS13 organizations:
+
+
*Nanotrasen and the Syndicate are two sides of the same coin and that coin is valuable.
+
*The Space Wizard Federation is a problem, mainly because they are an extremely dangerous group of unpredictable individuals--not to mention the wizards hate technology and are in direct opposition of the Spider Clan. Best avoided or left well-enough alone. How to battle: wizards possess several powerful abilities to steer clear off. Blind in particular is a nasty spell--jaunt away if you are blinded and never approach a wizard in melee. Stealth may also work if the wizard is not wearing thermal scanners--don't count on this. Run away if you feel threatened and await a better opportunity.
+
*Changeling Hivemind: extremely dangerous and to be killed on sight. How to battle: they will likely try to absorb you. Adrenaline boost, then phase shift into them. If you get stung, use SpiderOS to inject counter-agents. Stealth may also work but detecting a changeling is the real battle.
+
*Xeno Hivemind: their skulls make interesting kitchen decorations and are challenging to best, especially in larger nests. How to battle: they can see through your stealth guise and energy stars will not work on them. Best killed with a Phase Shift or at range. If you happen on a projectile stun weapon, use it and then close in to melee.
+
+
The reason they (you) are here:
+ Space ninjas are renowned throughout the known controlled space as fearless spies, infiltrators, and assassins. They are sent on missions of varying nature by Nanotrasen, the Syndicate, and other shady organizations and people. To hire a space ninja means serious business.
+
Their playstyle:
+ A mix of traitor, changeling, and wizard. Ninjas rely on energy, or electricity to be precise, to keep their suits running (when out of energy, a suit hibernates). Suits gain energy from objects or creatures that contain electrical charge. APCs, cell batteries, rechargers, SMES batteries, cyborgs, mechs, and exposed wires are currently supported. Through energy ninjas gain access to special powers--while all powers are tied to the ninja suit, the most useful of them are verb activated--to help them in their mission. It is a constant struggle for a ninja to remain hidden long enough to recharge the suit and accomplish their objective; despite their arsenal of abilities, ninjas can die like any other. Unlike wizards, ninjas do not possess good crowd control and are typically forced to play more subdued in order to achieve their goals. Some of their abilities are specifically designed to confuse and disorient others. With that said, it should be perfectly possible to completely flip the fuck out and rampage as a ninja.
+
Their powers:
+ There are two primary types: Equipment and Abilties. Passive effect are always on. Active effect must be turned on and remain active only when there is energy to do so. Ability costs are listed next to them.
+ Equipment: cannot be tracked by AI (passive), faster speed (passive), stealth (active), vision switch (passive if toggled), voice masking (passive), SpiderOS (passive if toggled), energy drain (passive if toggled).
+
+
Voice masking generates a random name the ninja can use over the radio and in-person. Although, the former use is recommended.
+
Toggling vision cycles to one of the following: thermal, meson, or darkness vision. The starting mode allows one to scout the identity of those in view, revealing their role. Traitors, revolutionaries, wizards, and other such people will be made known to you.
+
Stealth, when activated, drains more battery charge and works similarly to a syndicate cloak. The cloak will deactivate when most Abilities are utilized.
+
On-board AI: The suit is able to download an AI much like an intellicard. Check with SpiderOS for details once downloaded.
+
SpiderOS is a specialized, PDA-like screen that allows for a small variety of functions, such as injecting healing chemicals directly from the suit. You are using it now, if that was not already obvious. You may also download AI modules directly to the OS.
+
+ Abilities:
+
+
*Phase Shift (2000E) and Phase Jaunt (1000E) are unique powers in that they can both be used for defense and offense. Jaunt launches the ninja forward facing up to 9 squares, somewhat randomly selecting the final destination. Shift can only be used on turf in view but is precise (cannot be used on walls). Any living mob in the area teleported to is instantly gibbed (mechs are damaged, huggers and other similar critters are killed). It is possible to teleport with a target, provided you grab them before teleporting.
+
*Energy Blade (500E) is a highly effective weapon. It is summoned directly to the ninja's hand and can also function as an EMAG for certain objects (doors/lockers/etc). You may also use it to cut through walls and disabled doors. Experiment! The blade will crit humans in two hits. This item cannot be placed in containers and when dropped or thrown disappears. Having an energy blade drains more power from the battery each tick.
+
*EM Pulse (2500E) is a highly useful ability that will create an electromagnetic shockwave around the ninja, disabling technology whenever possible. If used properly it can render a security force effectively useless. Of course, getting beat up with a toolbox is not accounted for.
+
*Energy Star (500E) is a ninja star made of green energy AND coated in poison. It works by picking a random living target within range and can be spammed to great effect in incapacitating foes. Just remember that the poison used is also used by the Xeno Hivemind (and will have no effect on them).
+
*Energy Net (2000E) is a non-lethal solution to incapacitating humanoids. The net is made of non-harmful phase energy and will halt movement as long as it remains in effect--it can be destroyed. If the net is not destroyed, after a certain time it will teleport the target to a holding facility for the Spider Clan and then vanish. You will be notified if the net fails or succeeds in capturing a target in this manner. Combine with energy stars or stripping to ensure success. Abduction never looked this leet.
+
*Adrenaline Boost (1 E. Boost/3) recovers the user from stun, weakness, and paralysis. Also injects 20 units of radium into the bloodstream.
+
*Smoke Bomb (1 Sm.Bomb/10) is a weak but potentially useful ability. It creates harmful smoke and can be used in tandem with other powers to confuse enemies.
+
*???: unleash the True Ultimate Power!
+
IMPORTANT:
+
+
*Make sure to toggle Special Interaction from the Ninja Equipment menu to interact differently with certain objects.
+
*Your starting power cell can be replaced if you find one with higher maximum energy capacity by clicking on your suit with the higher capacity cell.
+
*Conserve your energy. Without it, you are very vulnerable.
+
+ That is all you will need to know. The rest will come with practice and talent. Good luck!
+
Master /N
+ "}
+ if(5)
+ dat += "
AI Control:
"
+ if(NAI)
+ NAI.attack_self(display_to) //Just accesses the integrated Intellicard. If an AI is in control of the suit then I guess it can interact with its own card. How meta.
+
+ if(6)
+ dat += {"
+
"
+ if(istype(stored_research,/list))//If there is stored research. Should be but just in case.
+ for(var/datum/tech/current_data in stored_research)
+ dat += "
"
+ dat += "[current_data.name]: [current_data.level]"
+ if(t_disk)//If there is a disk inserted. We can either write or overwrite.
+ dat += " *Copy to Disk "
+ dat += "
"
+ dat += "
"
+ dat += ""
+
+ //Setting the can>resize etc to 0 remove them from the drag bar but still allows the window to be draggable.
+ display_to << browse(dat,"window=spideros;size=400x444;border=1;can_resize=1;can_close=0;can_minimize=0")
+
+//=======//SPIDEROS TOPIC PROC//=======//
+
+/obj/item/clothing/suit/space/space_ninja/Topic(href, href_list)
+ ..()
+ var/mob/living/carbon/human/U = affecting
+ var/mob/living/silicon/ai/A = AI
+ var/display_to = s_control ? U : A//Who do we want to display certain messages to?
+
+ if(s_control)
+ if(!affecting||U.stat||!s_initialized)//Check to make sure the guy is wearing the suit after clicking and it's on.
+ U << "Your suit must be worn and active to use this function."
+ U << browse(null, "window=spideros")//Closes the window.
+ return
+
+ if(k_unlock!=7&&href_list["choice"]!="Return")
+ var/u1=text2num(href_list["choice"])
+ var/u2=(u1?abs(abs(k_unlock-u1)-2):1)
+ k_unlock=(!u2? k_unlock+1:0)
+ if(k_unlock==7)
+ U << "Anonymous Messenger blinks."
+ else
+ if(!affecting||A.stat||!s_initialized||A.loc!=src)
+ A << "This function is not available at this time."
+ A << browse(null, "window=spideros")//Closes the window.
+ return
+
+ switch(href_list["choice"])
+ if("Close")
+ display_to << browse(null, "window=spideros")
+ return
+ if("Refresh")//Refresh, goes to the end of the proc.
+ if("Return")//Return
+ if(spideros<=9)
+ spideros=0
+ else
+ spideros = round(spideros/10)//Best way to do this, flooring to nearest integer.
+
+ if("Shock")
+ var/damage = min(cell.charge, rand(50,150))//Uses either the current energy left over or between 50 and 150.
+ if(damage>1)//So they don't spam it when energy is a factor.
+ spark_system.start()//SPARKS THERE SHALL BE SPARKS
+ U.electrocute_act(damage, src,0.1,1)//The last argument is a safety for the human proc that checks for gloves.
+ cell.charge -= damage
+ else
+ A << "ERROR: Not enough energy remaining."
+
+ if("Message")
+ var/obj/item/device/pda/P = locate(href_list["target"])
+ var/t = input(U, "Please enter untraceable message.") as text
+ t = copytext(sanitize(t), 1, MAX_MESSAGE_LEN)
+ if(!t||U.stat||U.wear_suit!=src||!s_initialized)//Wow, another one of these. Man...
+ display_to << browse(null, "window=spideros")
+ return
+ if(isnull(P)||P.toff)//So it doesn't freak out if the object no-longer exists.
+ display_to << "Error: unable to deliver message."
+ display_spideros()
+ return
+ P.tnote += "← From [!s_control?(A):"an unknown source"]: [t] "
+ if (!P.silent)
+ playsound(P.loc, 'sound/machines/twobeep.ogg', 50, 1)
+ P.audible_message("\icon[P] *[P.ttone]*", null, 3)
+ P.overlays.Cut()
+ P.overlays += image('icons/obj/pda.dmi', "pda-r")
+
+ if("Inject")
+ if( (href_list["tag"]=="radium"? (reagents.get_reagent_amount("radium"))<=(a_boost*a_transfer) : !reagents.get_reagent_amount(href_list["tag"])) )//Special case for radium. If there are only a_boost*a_transfer radium units left.
+ display_to << "Error: the suit cannot perform this function. Out of [href_list["name"]]."
+ else
+ reagents.reaction(U, 2)
+ reagents.trans_id_to(U, href_list["tag"], href_list["tag"]=="nutriment"?5:a_transfer)//Nutriment is a special case since it's very potent. Shouldn't influence actual refill amounts or anything.
+ display_to << "Injecting..."
+ U << "You feel a tiny prick and a sudden rush of substance in to your veins."
+
+ if("Trigger Ability")
+ var/ability_name = href_list["name"]+href_list["cost"]//Adds the name and cost to create the full proc name.
+ var/proc_arguments//What arguments to later pass to the proc, if any.
+ var/targets[] = list()//To later check for.
+ var/safety = 0//To later make sure we're triggering the proc when needed.
+ switch(href_list["name"])//Special case.
+ if("Phase Shift")
+ safety = 1
+ for(var/turf/T in oview(5,loc))
+ targets.Add(T)
+ if("Energy Net")
+ safety = 1
+ for(var/mob/living/carbon/M in oview(5,loc))
+ targets.Add(M)
+ if(targets.len)//Let's create an argument for the proc if needed.
+ proc_arguments = pick(targets)
+ safety = 0
+ if(!safety)
+ A << "You trigger [href_list["name"]]."
+ U << "[href_list["name"]] suddenly triggered!"
+ call(src,ability_name)(proc_arguments)
+ else
+ A << "There are no potential [href_list["name"]=="Phase Shift"?"destinations" : "targets"] in view."
+
+ if("Unlock Kamikaze")
+ if(input(U)=="Divine Wind")
+ if( !(U.stat||U.wear_suit!=src||!s_initialized) )
+ if( !(cell.charge<=1||s_busy) )
+ s_busy = 1
+ for(var/i, i<4, i++)
+ switch(i)
+ if(0)
+ U << "Engaging mode...\nCODE NAME: KAMIKAZE"
+ if(1)
+ U << "Re-routing power nodes... \nUnlocking limiter..."
+ if(2)
+ U << "Power nodes re-routed. \nLimiter unlocked."
+ if(3)
+ grant_kamikaze(U)//Give them verbs and change variables as necessary.
+ U.regenerate_icons()//Update their clothing.
+ ninjablade()//Summon two energy blades.
+ message_admins("[key_name_admin(U)] used KAMIKAZE mode.")//Let the admins know.
+ s_busy = 0
+ return
+ sleep(s_delay)
+ else
+ U << "ERROR: Unable to initiate mode."
+ else
+ U << browse(null, "window=spideros")
+ s_busy = 0
+ return
+ else
+ U << "ERROR: WRONG PASSWORD!"
+ k_unlock = 0
+ spideros = 0
+ s_busy = 0
+
+ if("Eject Disk")
+ var/turf/T = get_turf(loc)
+ if(!U.get_active_hand())
+ U.put_in_hands(t_disk)
+ t_disk.add_fingerprint(U)
+ t_disk = null
+ else
+ if(T)
+ t_disk.loc = T
+ t_disk = null
+ else
+ U << "ERROR: Could not eject disk."
+
+ if("Copy to Disk")
+ var/datum/tech/current_data = locate(href_list["target"])
+ U << "[current_data.name] successfully [(!t_disk.stored) ? "copied" : "overwritten"] to disk."
+ t_disk.stored = current_data
+
+ if("Configure pAI")
+ pai.attack_self(U)
+
+ if("Eject pAI")
+ var/turf/T = get_turf(loc)
+ if(!U.get_active_hand())
+ U.put_in_hands(pai)
+ pai.add_fingerprint(U)
+ pai = null
+ else
+ if(T)
+ pai.loc = T
+ pai = null
+ else
+ U << "ERROR: Could not eject pAI card."
+
+ if("Override AI Laws")
+ var/law_zero = A.laws.zeroth//Remembers law zero, if there is one.
+ A.laws = new /datum/ai_laws/ninja_override
+ A.set_zeroth_law(law_zero)//Adds back law zero if there was one.
+ A.show_laws()
+ U << "Law Override: SUCCESS."
+
+ if("Purge AI")
+ var/confirm = alert("Are you sure you want to purge the AI? This cannot be undone once started.", "Confirm purge", "Yes", "No")
+ if(U.stat||U.wear_suit!=src||!s_initialized)
+ U << browse(null, "window=spideros")
+ return
+ if(confirm == "Yes"&&AI)
+ if(A.laws.zeroth)//Gives a few seconds to re-upload the AI somewhere before it takes full control.
+ s_busy = 1
+ for(var/i,i<5,i++)
+ if(AI==A)
+ switch(i)
+ if(0)
+ A << "WARNING: purge procedure detected. \nNow hacking host..."
+ U << "WARNING: HACKING AT��TEMP� IN PR0GRESs!"
+ spideros = 0
+ k_unlock = 0
+ U << browse(null, "window=spideros")
+ if(1)
+ A << "Disconnecting neural interface..."
+ U << "WAR�NING: �R�O0�Gr�--S 2&3%"
+ if(2)
+ A << "Shutting down external protocol..."
+ U << "WARNING: P����RֆGr�5S 677^%"
+ cancel_stealth()
+ if(3)
+ A << "Connecting to kernel..."
+ U << "WARNING: �R�r�R_404"
+ A.control_disabled = 0
+ if(4)
+ A << "Connection established and secured. Menu updated."
+ U << "W�r#nING: #%@!!WȆ|_4�54@ \nUn�B88l3 T� L�-�o-L�CaT2 ##$!�RN�0..%.."
+ grant_AI_verbs()
+ return
+ sleep(s_delay)
+ else break
+ s_busy = 0
+ U << "Hacking attempt disconnected. Resuming normal operation."
+ else
+ NAI.flush = 1
+ A.suiciding = 1
+ A << "Your core files are being purged! This is the end..."
+ spawn(0)
+ display_spideros()//To refresh the screen and let this finish.
+ while (A.stat != 2)
+ A.adjustOxyLoss(2)
+ A.updatehealth()
+ sleep(10)
+ killai(NAI)
+ U << "Artificial Intelligence was terminated. Rebooting..."
+ NAI.flush = 0
+
+ if("Wireless AI")
+ A.control_disabled = !A.control_disabled
+ A << "AI wireless has been [A.control_disabled ? "disabled" : "enabled"]."
+ else//If it's not a defined function, it's a menu.
+ spideros=text2num(href_list["choice"])
+
+ display_spideros()//Refreshes the screen by calling it again (which replaces current screen with new screen).
+ return
+
+//=======//SPECIAL AI FUNCTIONS//=======//
+
+/obj/item/clothing/suit/space/space_ninja/proc/ai_holo(var/turf/T in oview(3,affecting))//To have an internal AI display a hologram to the AI and ninja only.
+ set name = "Display Hologram"
+ set desc = "Channel a holographic image directly to the user's field of vision. Others will not see it."
+ set category = null
+ set src = usr.loc
+
+ if(s_initialized&&affecting&&affecting.client&&istype(affecting.loc, /turf))//If the host exists and they are playing, and their location is a turf.
+ if(!hologram)//If there is not already a hologram.
+ hologram = new(T)//Spawn a blank effect at the location.
+ hologram.invisibility = 101//So that it doesn't show up, ever. This also means one could attach a number of images to a single obj and display them differently to differnet people.
+ hologram.anchored = 1//So it cannot be dragged by space wind and the like.
+ hologram.dir = get_dir(T,affecting.loc)
+
+ for(var/mob/living/silicon/ai/A in NAI)
+ var/image/I = image(A.holo_icon,hologram)//Attach an image to object.
+ hologram.i_attached = I//To attach the image in order to later reference.
+ A << I
+ affecting << I
+ affecting << "An image flicks to life nearby. It appears visible to you only."
+
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/ai_holo_clear
+
+ ai_holo_process()//Move to initialize
+ else
+ AI << "ERROR: Image feed in progress."
+ else
+ AI << "ERROR: Unable to project image."
+ return
+
+/obj/item/clothing/suit/space/space_ninja/proc/ai_holo_process()
+ set background = BACKGROUND_ENABLED
+
+ spawn while(hologram&&s_initialized&&AI)//Suit on and there is an AI present.
+ if(!s_initialized||get_dist(affecting,hologram.loc)>3)//Once suit is de-initialized or hologram reaches out of bounds.
+ qdel(hologram.i_attached)
+ qdel(hologram)
+
+ verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ai_holo_clear
+ return
+ sleep(10)//Checks every second.
+
+/obj/item/clothing/suit/space/space_ninja/proc/ai_instruction()//Let's the AI know what they can do.
+ set name = "Instructions"
+ set desc = "Displays a list of helpful information."
+ set category = "AI Ninja Equip"
+ set src = usr.loc
+
+ AI << "The menu you are seeing will contain other commands if they become available.\nRight click a nearby turf to display an AI Hologram. It will only be visible to you and your host. You can move it freely using normal movement keys--it will disappear if placed too far away."
+
+/obj/item/clothing/suit/space/space_ninja/proc/ai_holo_clear()
+ set name = "Clear Hologram"
+ set desc = "Stops projecting the current holographic image."
+ set category = "AI Ninja Equip"
+ set src = usr.loc
+
+ qdel(hologram.i_attached)
+ qdel(hologram)
+
+ verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ai_holo_clear
+ return
+
+/obj/item/clothing/suit/space/space_ninja/proc/ai_hack_ninja()
+ set name = "Hack SpiderOS"
+ set desc = "Hack directly into the Black Widow(tm) neuro-interface."
+ set category = "AI Ninja Equip"
+ set src = usr.loc
+
+ display_spideros()
+ return
+
+/obj/item/clothing/suit/space/space_ninja/proc/ai_return_control()
+ set name = "Relinquish Control"
+ set desc = "Return control to the user."
+ set category = "AI Ninja Equip"
+ set src = usr.loc
+
+
+ for(var/mob/living/silicon/ai/A in NAI)
+ AI << browse(null, "window=spideros")//Close window
+ AI << "You have seized your hacking attempt. [affecting.real_name] has regained control."
+ affecting << "UPDATE: [A.real_name] has ceased hacking attempt. All systems clear."
+
+ remove_AI_verbs()
+ return
+
+//=======//GENERAL SUIT PROCS//=======//
+
+/obj/item/clothing/suit/space/space_ninja/attackby(obj/item/I, mob/U, params)
+ if(U==affecting)//Safety, in case you try doing this without wearing the suit/being the person with the suit.
+ if(istype(I, /obj/item/device/aicard))//If it's an AI card.
+ if(s_control)
+ I:transfer_ai("NINJASUIT","AICARD",src,U)
+ else
+ U << "ERROR: Remote access channel disabled."
+ return//Return individually so that ..() can run properly at the end of the proc.
+ else if(istype(I, /obj/item/device/paicard) && !pai)//If it's a pai card.
+ U:drop_item()
+ I.loc = src
+ pai = I
+ U << "You slot \the [I] into \the [src]."
+ updateUsrDialog()
+ return
+ else if(istype(I, /obj/item/weapon/reagent_containers/glass))//If it's a glass beaker.
+ var/total_reagent_transfer//Keep track of this stuff.
+ for(var/reagent_id in reagent_list)
+ var/datum/reagent/R = I.reagents.has_reagent(reagent_id)//Mostly to pull up the name of the reagent after calculating. Also easier to use than writing long proc paths.
+ if(R&&reagents.get_reagent_amount(reagent_id)=a_transfer)//Radium is always special.
+ //Here we determine how much reagent will actually transfer if there is enough to transfer or there is a need of transfer. Minimum of max amount available (using a_transfer) or amount needed.
+ var/amount_to_transfer = min( (r_maxamount+(reagent_id == "radium"?(a_boost*a_transfer):0)-reagents.get_reagent_amount(reagent_id)) ,(round(R.volume/a_transfer))*a_transfer)//In the end here, we round the amount available, then multiply it again.
+ R.volume -= amount_to_transfer//Remove from reagent volume. Don't want to delete the reagent now since we need to perserve the name.
+ reagents.add_reagent(reagent_id, amount_to_transfer)//Add to suit. Reactions are not important.
+ total_reagent_transfer += amount_to_transfer//Add to total reagent trans.
+ U << "Added [amount_to_transfer] units of [R.name]."//Reports on the specific reagent added.
+ I.reagents.update_total()//Now we manually update the total to make sure everything is properly shoved under the rug.
+
+ U << "Replenished a total of [total_reagent_transfer ? total_reagent_transfer : "zero"] chemical units."//Let the player know how much total volume was added.
+ return
+ else if(istype(I, /obj/item/weapon/stock_parts/cell))
+ if(I:maxcharge>cell.maxcharge&&n_gloves&&n_gloves.candrain)
+ U << "Higher maximum capacity detected.\nUpgrading..."
+ if (n_gloves&&n_gloves.candrain&&do_after(U,s_delay))
+ U.drop_item()
+ I.loc = src
+ I:charge = min(I:charge+cell.charge, I:maxcharge)
+ var/obj/item/weapon/stock_parts/cell/old_cell = cell
+ old_cell.charge = 0
+ U.put_in_hands(old_cell)
+ old_cell.add_fingerprint(U)
+ old_cell.corrupt()
+ old_cell.updateicon()
+ cell = I
+ U << "Upgrade complete. Maximum capacity: [round(cell.maxcharge/100)]%"
+ else
+ U << "Procedure interrupted. Protocol terminated."
+ return
+ else if(istype(I, /obj/item/weapon/disk/tech_disk))//If it's a data disk, we want to copy the research on to the suit.
+ var/obj/item/weapon/disk/tech_disk/TD = I
+ if(TD.stored)//If it has something on it.
+ U << "Research information detected, processing..."
+ if(do_after(U,s_delay))
+ for(var/datum/tech/current_data in stored_research)
+ if(current_data.id==TD.stored.id)
+ if(current_data.levelData analyzed and updated. Disk erased.
"
+ else
+ U << "ERROR: Procedure interrupted. Process terminated."
+ else
+ I.loc = src
+ t_disk = I
+ U << "You slot \the [I] into \the [src]."
+ return
+ ..()
+
+/obj/item/clothing/suit/space/space_ninja/proc/toggle_stealth()
+ var/mob/living/carbon/human/U = affecting
+ if(s_active)
+ cancel_stealth()
+ else
+ spawn(0)
+ anim(U.loc,U,'icons/mob/mob.dmi',,"cloak",,U.dir)
+ s_active=!s_active
+ U.alpha = 0
+ U.visible_message("[U.name] vanishes into thin air!", \
+ "You are now invisible to normal detection.")
+ return
+
+/obj/item/clothing/suit/space/space_ninja/proc/cancel_stealth()
+ var/mob/living/carbon/human/U = affecting
+ if(s_active)
+ spawn(0)
+ anim(U.loc,U,'icons/mob/mob.dmi',,"uncloak",,U.dir)
+ s_active=!s_active
+ U.alpha = 255
+ U.visible_message("[U.name] appears from thin air!", \
+ "You are now visible.")
+ return 1
+ return 0
+
+/obj/item/clothing/suit/space/space_ninja/proc/blade_check(mob/living/carbon/U, X = 1)//Default to checking for blade energy.
+ switch(X)
+ if(1)
+ if(istype(U.get_active_hand(), /obj/item/weapon/melee/energy/blade))
+ if(cell.charge<=0)//If no charge left.
+ U.drop_item()//Blade is dropped from active hand (and deleted).
+ else return 1
+ else if(istype(U.get_inactive_hand(), /obj/item/weapon/melee/energy/blade))
+ if(cell.charge<=0)
+ U.swap_hand()//swap hand
+ U.drop_item()//drop blade
+ else return 1
+ if(2)
+ if(istype(U.get_active_hand(), /obj/item/weapon/melee/energy/blade))
+ U.drop_item()
+ if(istype(U.get_inactive_hand(), /obj/item/weapon/melee/energy/blade))
+ U.swap_hand()
+ U.drop_item()
+ return 0
+
+/obj/item/clothing/suit/space/space_ninja/examine(mob/user)
+ ..()
+ if(s_initialized)
+ if(user == affecting)
+ if(s_control)
+ user << "All systems operational. Current energy capacity: [cell.charge]."
+ if(!kamikaze)
+ user << "The CLOAK-tech device is [s_active?"active":"inactive"]."
+ else
+ user << "KAMIKAZE MODE ENGAGED!"
+ user << "There are [s_bombs] smoke bomb\s remaining."
+ user << "There are [a_boost] adrenaline booster\s remaining."
+ else
+ user << "�rr�R �a��a�� No-�-� f��N� 3RR�r"
+
+/*
+===================================================================================
+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+===================================================================================
+*/
+
+//=======//ENERGY DRAIN PROCS//=======//
+
+/obj/item/clothing/gloves/space_ninja/proc/drain(target_type as text, target, obj/suit)
+//Var Initialize
+ var/obj/item/clothing/suit/space/space_ninja/S = suit
+ var/mob/living/carbon/human/U = S.affecting
+ var/obj/item/clothing/gloves/space_ninja/G = S.n_gloves
+
+ var/drain = 0//To drain from battery.
+ var/maxcapacity = 0//Safety check for full battery.
+ var/totaldrain = 0//Total energy drained.
+
+ G.draining = 1
+
+ if(target_type!="RESEARCH")//I lumped research downloading here for ease of use.
+ U << "Now charging battery..."
+
+ switch(target_type)
+
+ if("APC")
+ var/obj/machinery/power/apc/A = target
+ if(A.cell&&A.cell.charge)
+ var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
+ spark_system.set_up(5, 0, A.loc)
+ while(G.candrain&&A.cell.charge>0&&!maxcapacity)
+ drain = rand(G.mindrain,G.maxdrain)
+ if(A.cell.chargeS.cell.maxcharge)
+ drain = S.cell.maxcharge-S.cell.charge
+ maxcapacity = 1//Reached maximum battery capacity.
+ if (do_after(U,10))
+ spark_system.start()
+ playsound(A.loc, "sparks", 50, 1)
+ A.cell.charge-=drain
+ S.cell.charge+=drain
+ totaldrain+=drain
+ else break
+ U << "Gained [totaldrain] energy from the APC."
+ if(!A.emagged)
+ flick("apc-spark", src)
+ A.emagged = 1
+ A.locked = 0
+ A.update_icon()
+ else
+ U << "This APC has run dry of power. You must find another source."
+
+ if("SMES")
+ var/obj/machinery/power/smes/A = target
+ if(A.charge)
+ var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
+ spark_system.set_up(5, 0, A.loc)
+ while(G.candrain&&A.charge>0&&!maxcapacity)
+ drain = rand(G.mindrain,G.maxdrain)
+ if(A.chargeS.cell.maxcharge)
+ drain = S.cell.maxcharge-S.cell.charge
+ maxcapacity = 1
+ if (do_after(U,10))
+ spark_system.start()
+ playsound(A.loc, "sparks", 50, 1)
+ A.charge-=drain
+ S.cell.charge+=drain
+ totaldrain+=drain
+ else break
+ U << "Gained [totaldrain] energy from the SMES cell."
+ else
+ U << "This SMES cell has run dry of power. You must find another source."
+
+ if("CELL")
+ var/obj/item/weapon/stock_parts/cell/A = target
+ if(A.charge)
+ if (G.candrain&&do_after(U,30))
+ U << "Gained [A.charge] energy from the cell."
+ if(S.cell.charge+A.charge>S.cell.maxcharge)
+ S.cell.charge=S.cell.maxcharge
+ else
+ S.cell.charge+=A.charge
+ A.charge = 0
+ G.draining = 0
+ A.corrupt()
+ A.updateicon()
+ else
+ U << "Procedure interrupted. Protocol terminated."
+ else
+ U << "This cell is empty and of no use."
+
+ if("MACHINERY")//Can be applied to generically to all powered machinery. I'm leaving this alone for now.
+ var/obj/machinery/A = target
+ if(A.powered())//If powered.
+
+ var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
+ spark_system.set_up(5, 0, A.loc)
+
+ var/obj/machinery/power/apc/B = A.loc.loc:get_apc()//Object.turf.area find APC
+ if(B)//If APC exists. Might not if the area is unpowered like Centcom.
+ var/datum/powernet/PN = B.terminal.powernet
+ while(G.candrain&&!maxcapacity&&!isnull(A))//And start a proc similar to drain from wire.
+ drain = rand(G.mindrain,G.maxdrain)
+ var/drained = 0
+ if(PN&&do_after(U,10))
+ drained = min(drain, PN.avail)
+ PN.load += drained
+ if(drained < drain)//if no power on net, drain apcs
+ for(var/obj/machinery/power/terminal/T in PN.nodes)
+ if(istype(T.master, /obj/machinery/power/apc))
+ var/obj/machinery/power/apc/AP = T.master
+ if(AP.operating && AP.cell && AP.cell.charge>0)
+ AP.cell.charge = max(0, AP.cell.charge - 5)
+ drained += 5
+ else break
+ S.cell.charge += drained
+ if(S.cell.charge>S.cell.maxcharge)
+ totaldrain += (drained-(S.cell.charge-S.cell.maxcharge))
+ S.cell.charge = S.cell.maxcharge
+ maxcapacity = 1
+ else
+ totaldrain += drained
+ spark_system.start()
+ if(drained==0) break
+ U << "Gained [totaldrain] energy from the power network."
+ else
+ U << "Power network could not be found. Aborting."
+ else
+ U << "This recharger is not providing energy. You must find another source."
+
+ if("RESEARCH")
+ var/obj/machinery/A = target
+ U << "Hacking \the [A]..."
+ spawn(0)
+ var/turf/location = get_turf(U)
+ for(var/mob/living/silicon/ai/AI in player_list)
+ AI << "Network Alert: Hacking attempt detected[location?" in [location]":". Unable to pinpoint location"]."
+ if(A:files&&A:files.known_tech.len)
+ for(var/datum/tech/current_data in S.stored_research)
+ U << "Checking \the [current_data.name] database."
+ if(do_after(U, S.s_delay)&&G.candrain&&!isnull(A))
+ for(var/datum/tech/analyzing_data in A:files.known_tech)
+ if(current_data.id==analyzing_data.id)
+ if(analyzing_data.level>current_data.level)
+ U << "Database:UPDATED."
+ current_data.level = analyzing_data.level
+ break//Move on to next.
+ else break//Otherwise, quit processing.
+ U << "Data analyzed. Process finished."
+
+ if("WIRE")
+ var/obj/structure/cable/A = target
+ var/datum/powernet/PN = A.powernet
+ while(G.candrain&&!maxcapacity&&!isnull(A))
+ drain = (round((rand(G.mindrain,G.maxdrain))/2))
+ var/drained = 0
+ if(PN&&do_after(U,10))
+ drained = min(drain, PN.avail)
+ PN.load += drained
+ if(drained < drain)//if no power on net, drain apcs
+ for(var/obj/machinery/power/terminal/T in PN.nodes)
+ if(istype(T.master, /obj/machinery/power/apc))
+ var/obj/machinery/power/apc/AP = T.master
+ if(AP.operating && AP.cell && AP.cell.charge>0)
+ AP.cell.charge = max(0, AP.cell.charge - 5)
+ drained += 5
+ else break
+ S.cell.charge += drained
+ if(S.cell.charge>S.cell.maxcharge)
+ totaldrain += (drained-(S.cell.charge-S.cell.maxcharge))
+ S.cell.charge = S.cell.maxcharge
+ maxcapacity = 1
+ else
+ totaldrain += drained
+ S.spark_system.start()
+ if(drained==0) break
+ U << "Gained [totaldrain] energy from the power network."
+
+ if("MECHA")
+ var/obj/mecha/A = target
+ A.occupant_message("Warning: Unauthorized access through sub-route 4, block H, detected.")
+ if(A.get_charge())
+ while(G.candrain&&A.cell.charge>0&&!maxcapacity)
+ drain = rand(G.mindrain,G.maxdrain)
+ if(A.cell.chargeS.cell.maxcharge)
+ drain = S.cell.maxcharge-S.cell.charge
+ maxcapacity = 1
+ if (do_after(U,10))
+ A.spark_system.start()
+ playsound(A.loc, "sparks", 50, 1)
+ A.cell.use(drain)
+ S.cell.charge+=drain
+ totaldrain+=drain
+ else break
+ U << "Gained [totaldrain] energy from [src]."
+ else
+ U << "The exosuit's battery has run dry. You must find another source of power."
+
+ if("CYBORG")
+ var/mob/living/silicon/robot/A = target
+ A << "Warning: Unauthorized access through sub-route 12, block C, detected."
+ G.draining = 1
+ if(A.cell&&A.cell.charge)
+ while(G.candrain&&A.cell.charge>0&&!maxcapacity)
+ drain = rand(G.mindrain,G.maxdrain)
+ if(A.cell.chargeS.cell.maxcharge)
+ drain = S.cell.maxcharge-S.cell.charge
+ maxcapacity = 1
+ if (do_after(U,10))
+ A.spark_system.start()
+ playsound(A.loc, "sparks", 50, 1)
+ A.cell.charge-=drain
+ S.cell.charge+=drain
+ totaldrain+=drain
+ else break
+ U << "Gained [totaldrain] energy from [A]."
+ else
+ U << "Their battery has run dry of power. You must find another source."
+
+ else//Else nothing :<
+
+ G.draining = 0
+
+ return
+
+//=======//GENERAL PROCS//=======//
+
+/obj/item/clothing/gloves/space_ninja/proc/toggled()
+ set name = "Toggle Interaction"
+ set desc = "Toggles special interaction on or off."
+ set category = "Ninja Equip"
+
+ var/mob/living/carbon/human/U = loc
+ U << "You [candrain?"disable":"enable"] special interaction."
+ candrain=!candrain
+
+/obj/item/clothing/gloves/space_ninja/examine(mob/user)
+ ..()
+ if(flags & NODROP)
+ user << "The energy drain mechanism is: [candrain?"active":"inactive"]."
+
+/*
+===================================================================================
+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+===================================================================================
+*/
+
+/obj/item/clothing/mask/gas/voice/space_ninja/New()
+ verbs += /obj/item/clothing/mask/gas/voice/space_ninja/proc/togglev
+
+//This proc is linked to human life.dm. It determines what hud icons to display based on mind special role for most mobs.
+/obj/item/clothing/mask/gas/voice/space_ninja/proc/assess_targets(list/target_list, mob/living/carbon/U)
+ var/icon/tempHud = 'icons/mob/hud.dmi'
+ for(var/mob/living/target in target_list)
+ if(iscarbon(target))
+ switch(target.mind.special_role)
+ if("traitor")
+ U.client.images += image(tempHud,target,"hudtraitor")
+ if("Revolutionary","Head Revolutionary")
+ U.client.images += image(tempHud,target,"hudrevolutionary")
+ if("Cultist")
+ U.client.images += image(tempHud,target,"hudcultist")
+ if("Changeling")
+ U.client.images += image(tempHud,target,"hudchangeling")
+ if("Wizard","Fake Wizard")
+ U.client.images += image(tempHud,target,"hudwizard")
+ if("Hunter","Sentinel","Drone","Queen")
+ U.client.images += image(tempHud,target,"hudalien")
+ if("Syndicate")
+ U.client.images += image(tempHud,target,"hudoperative")
+ if("Death Commando")
+ U.client.images += image(tempHud,target,"huddeathsquad")
+ if("Space Ninja")
+ U.client.images += image(tempHud,target,"hudninja")
+ else//If we don't know what role they have but they have one.
+ U.client.images += image(tempHud,target,"hudunknown1")
+ else if(issilicon(target))//If the silicon mob has no law datum, no inherent laws, or a law zero, add them to the hud.
+ var/mob/living/silicon/silicon_target = target
+ if(!silicon_target.laws||(silicon_target.laws&&(silicon_target.laws.zeroth||!silicon_target.laws.inherent.len)))
+ if(isrobot(silicon_target))//Different icons for robutts and AI.
+ U.client.images += image(tempHud,silicon_target,"hudmalborg")
+ else
+ U.client.images += image(tempHud,silicon_target,"hudmalai")
+ return 1
+
+/obj/item/clothing/mask/gas/voice/space_ninja/proc/togglev()
+ set name = "Toggle Voice"
+ set desc = "Toggles the voice synthesizer on or off."
+ set category = "Ninja Equip"
+
+ var/mob/U = loc//Can't toggle voice when you're not wearing the mask.
+ var/vchange = (alert("Would you like to synthesize a new name or turn off the voice synthesizer?",,"New Name","Turn Off"))
+ if(vchange=="New Name")
+ var/chance = rand(1,100)
+ switch(chance)
+ if(1 to 50)//High chance of a regular name.
+ voice = "[rand(0,1)==1?pick(first_names_female):pick(first_names_male)] [pick(last_names)]"
+ if(51 to 80)//Smaller chance of a clown name.
+ voice = "[pick(clown_names)]"
+ if(81 to 90)//Small chance of a wizard name.
+ voice = "[pick(wizard_first)] [pick(wizard_second)]"
+ if(91 to 100)//Small chance of an existing crew name.
+ var/names[] = new()
+ for(var/mob/living/carbon/human/M in player_list)
+ if(M==U||!M.client||!M.real_name) continue
+ names.Add(M.real_name)
+ voice = !names.len ? "Cuban Pete" : pick(names)
+ U << "You are now mimicking [voice]."
+ else
+ U << "The voice synthesizer is [voice!="Unknown"?"now":"already"] deactivated."
+ voice = "Unknown"
+ return
+
+/obj/item/clothing/mask/gas/voice/space_ninja/examine(mob/user)
+ ..()
+ user << "Voice mimicking algorithm is set [!vchange?"inactive":"active"]."
+
+/*
+===================================================================================
+<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+===================================================================================
+*/
+
+/*
+It will teleport people to a holding facility after 30 seconds. (Check the process() proc to change where teleport goes)
+It is possible to destroy the net by the occupant or someone else.
+*/
+
+/obj/effect/energy_net
+ name = "energy net"
+ desc = "It's a net made of green energy."
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "energynet"
+
+ density = 1//Can't pass through.
+ opacity = 0//Can see through.
+ mouse_opacity = 1//So you can hit it with stuff.
+ anchored = 1//Can't drag/grab the trapped mob.
+
+ var/health = 25//How much health it has.
+ var/mob/living/affecting = null//Who it is currently affecting, if anyone.
+ var/mob/living/master = null//Who shot web. Will let this person know if the net was successful or failed.
+
+/obj/effect/energy_net/proc/healthcheck()
+ if(health <=0)
+ density = 0
+ if(affecting)
+ var/mob/living/carbon/M = affecting
+ M.anchored = 0
+ for(var/mob/O in viewers(src, 3))
+ O.show_message("[M.name] was recovered from the energy net!", 1, "You hear a grunt.", 2)
+ if(!isnull(master))//As long as they still exist.
+ master << "ERROR: unable to initiate transport protocol. Procedure terminated."
+ qdel(src)
+ return
+
+/obj/effect/energy_net/process(var/mob/living/carbon/M as mob)
+ var/check = 30//30 seconds before teleportation. Could be extended I guess.
+ var/mob_name = affecting.name//Since they will report as null if terminated before teleport.
+ //The person can still try and attack the net when inside.
+ while(!isnull(M)&&!isnull(src)&&check>0)//While M and net exist, and 30 seconds have not passed.
+ check--
+ sleep(10)
+
+ if(isnull(M)||M.loc!=loc)//If mob is gone or not at the location.
+ if(!isnull(master))//As long as they still exist.
+ master << "ERROR: unable to locate \the [mob_name]. Procedure terminated."
+ qdel(src)//Get rid of the net.
+ return
+
+ if(!isnull(src))//As long as both net and person exist.
+ //No need to check for countdown here since while() broke, it's implicit that it finished.
+
+ density = 0//Make the net pass-through.
+ invisibility = 101//Make the net invisible so all the animations can play out.
+ health = INFINITY//Make the net invincible so that an explosion/something else won't kill it while, spawn() is running.
+ for(var/obj/item/W in M)
+ if(istype(M,/mob/living/carbon/human))
+ if(W==M:w_uniform) continue//So all they're left with are shoes and uniform.
+ if(W==M:shoes) continue
+ M.unEquip(W)
+
+ spawn(0)
+ playsound(M.loc, 'sound/effects/sparks4.ogg', 50, 1)
+ anim(M.loc,M,'icons/mob/mob.dmi',,"phaseout",,M.dir)
+
+ M.loc = pick(holdingfacility)//Throw mob in to the holding facility.
+ M << "You appear in a strange place!"
+
+ spawn(0)
+ var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
+ spark_system.set_up(5, 0, M.loc)
+ spark_system.start()
+ playsound(M.loc, 'sound/effects/phasein.ogg', 25, 1)
+ playsound(M.loc, 'sound/effects/sparks2.ogg', 50, 1)
+ anim(M.loc,M,'icons/mob/mob.dmi',,"phasein",,M.dir)
+ qdel(src)//Wait for everything to finish, delete the net. Else it will stop everything once net is deleted, including the spawn(0).
+
+ for(var/mob/O in viewers(src, 3))
+ O.show_message("[M] vanished!", 1, "You hear sparks flying!", 2)
+
+ if(!isnull(master))//As long as they still exist.
+ master << "SUCCESS: transport procedure of \the [affecting] complete."
+
+ M.anchored = 0//Important.
+
+ else//And they are free.
+ M << "You are free of the net!"
+ return
+
+/obj/effect/energy_net/bullet_act(var/obj/item/projectile/Proj)
+ health -= Proj.damage
+ healthcheck()
+ ..()
+
+/obj/effect/energy_net/ex_act(severity, target)
+ switch(severity)
+ if(1.0)
+ health-=50
+ if(2.0)
+ health-=50
+ if(3.0)
+ health-=prob(50)?50:25
+ healthcheck()
+ return
+
+/obj/effect/energy_net/blob_act()
+ health-=50
+ healthcheck()
+ return
+
+/obj/effect/energy_net/hitby(AM as mob|obj)
+ ..()
+ visible_message("[src] was hit by [AM].")
+ var/tforce = 0
+ if(ismob(AM))
+ tforce = 10
+ else
+ tforce = AM:throwforce
+ playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
+ health = max(0, health - tforce)
+ healthcheck()
+ ..()
+ return
+
+/obj/effect/energy_net/attack_hulk(mob/living/carbon/human/user)
+ ..(user, 1)
+ user.visible_message("[user] rips the energy net apart!", \
+ "You easily destroy the energy net.")
+ health-=50
+ healthcheck()
+
+/obj/effect/energy_net/attack_paw(mob/user)
+ return attack_hand()
+
+/obj/effect/energy_net/attack_alien(mob/living/user as mob)
+ user.do_attack_animation(src)
+ if (islarva(user))
+ return
+ playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
+ health -= rand(10, 20)
+ if(health > 0)
+ user.visible_message("[user] claws at the energy net!", \
+ "\green You claw at the net.")
+ else
+ user.visible_message("[user] slices the energy net apart!", \
+ "\green You slice the energy net to pieces.")
+ healthcheck()
+ return
+
+/obj/effect/energy_net/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+ var/aforce = W.force
+ health = max(0, health - aforce)
+ healthcheck()
+ ..()
+ return
+
+proc/create_ninja_mind(key)
+ var/datum/mind/Mind = new /datum/mind(key)
+ Mind.assigned_role = "MODE"
+ Mind.special_role = "Space Ninja"
+ ticker.mode.traitors |= Mind //Adds them to current traitor list. Which is really the extra antagonist list.
+ return Mind
diff --git a/code/modules/events/prison_break.dm b/code/modules/events/prison_break.dm
index df937798ef8a4..878a22a0050e9 100644
--- a/code/modules/events/prison_break.dm
+++ b/code/modules/events/prison_break.dm
@@ -40,7 +40,7 @@
else if(istype(O,/obj/structure/closet/secure_closet/brig))
var/obj/structure/closet/secure_closet/brig/temp = O
temp.locked = 0
- temp.update_icon()
+ temp.icon_state = temp.icon_closed
else if(istype(O,/obj/machinery/door/airlock/security))
var/obj/machinery/door/airlock/security/temp = O
temp.prison_open()
diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm
index f86ecdb5c42d0..85bba26cd2098 100644
--- a/code/modules/events/radiation_storm.dm
+++ b/code/modules/events/radiation_storm.dm
@@ -36,12 +36,11 @@
if(istype(C, /mob/living/carbon/human))
var/mob/living/carbon/human/H = C
+ H.apply_effect((75), IRRADIATE, 0) // Let the bodies hit the floor
if(prob(5))
- H.irradiate(rand(100, 160))
- else
- H.irradiate(rand(15, 75))
- if(prob(25))
- if(prob(75))
+ H.apply_effect((rand(100, 150)), IRRADIATE, 0)
+ if(prob(50))
+ if(prob(50))
randmutb(H)
domutcheck(H, null, 1)
else
@@ -50,7 +49,7 @@
else if(istype(C, /mob/living/carbon/monkey))
var/mob/living/carbon/monkey/M = C
- M.irradiate(rand(15, 75))
+ M.apply_effect((75), IRRADIATE, 0)
/datum/round_event/radiation_storm/end()
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index e4ec5e8fd5a6f..525d66debcae6 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -137,7 +137,7 @@
/datum/spacevine_mutation/light/on_grow(obj/effect/spacevine/holder)
if(prob(10*severity))
- holder.SetLuminosity(4)
+ holder.luminosity = 4
/datum/spacevine_mutation/toxicity
name = "toxic"
@@ -303,12 +303,14 @@
anchored = 1
density = 0
layer = 5
- mouse_opacity = 2 //Clicking anywhere on the turf is good enough
pass_flags = PASSTABLE | PASSGRILLE
var/energy = 0
var/obj/effect/spacevine_controller/master = null
var/list/mutations = list()
+/obj/effect/spacevine/New()
+ return
+
/obj/effect/spacevine/Destroy()
for(var/datum/spacevine_mutation/SM in mutations)
SM.on_death(src)
diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm
index 7703be7fc7344..037b2f4101f52 100644
--- a/code/modules/events/vent_clog.dm
+++ b/code/modules/events/vent_clog.dm
@@ -37,4 +37,4 @@
smoke.set_up(R, rand(1, 2), 0, vent, 0, silent = 1)
playsound(vent.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
smoke.start()
- qdel(R)
\ No newline at end of file
+ R.delete() //GC the reagents
\ No newline at end of file
diff --git a/code/modules/events/wizard/departmentrevolt.dm b/code/modules/events/wizard/departmentrevolt.dm
index 0408f97169aee..59707297095d3 100644
--- a/code/modules/events/wizard/departmentrevolt.dm
+++ b/code/modules/events/wizard/departmentrevolt.dm
@@ -1,6 +1,6 @@
/datum/round_event_control/wizard/deprevolt //stationwide!
name = "Departmental Uprising"
- weight = 0 //An order that requires order in a round of chaos was maybe not the best idea. Requiescat in pace departmental uprising August 2014 - March 2015
+ weight = 2
typepath = /datum/round_event/wizard/deprevolt/
max_occurrences = 1
earliest_start = 0
diff --git a/code/modules/events/wizard/imposter.dm b/code/modules/events/wizard/imposter.dm
index 5d3567a9d4782..1a55876b8e889 100644
--- a/code/modules/events/wizard/imposter.dm
+++ b/code/modules/events/wizard/imposter.dm
@@ -14,7 +14,7 @@
if(!candidates) return //Sad Trombone
var/client/C = pick(candidates)
- PoolOrNew(/obj/effect/effect/harmless_smoke, W.loc)
+ new /obj/effect/effect/harmless_smoke(W.loc)
var/mob/living/carbon/human/I = new /mob/living/carbon/human(W.loc)
I.real_name = W.real_name
@@ -33,9 +33,9 @@
I.key = C.key
//Operation: Fuck off and scare people
- I.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null))
- I.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink(null))
- I.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null))
+ I.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null)
+ I.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink(null)
+ I.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null)
ticker.mode.traitors += I.mind
I.mind.special_role = "imposter"
diff --git a/code/modules/events/wizard/summons.dm b/code/modules/events/wizard/summons.dm
index 7b3e27e16c6b9..afe85bad44869 100644
--- a/code/modules/events/wizard/summons.dm
+++ b/code/modules/events/wizard/summons.dm
@@ -5,11 +5,6 @@
max_occurrences = 1
earliest_start = 0
-/datum/round_event_control/wizard/summonguns/New()
- if(config.no_summon_guns)
- weight = 0
- ..()
-
/datum/round_event/wizard/summonguns/start()
rightandwrong(0,,10)
@@ -20,10 +15,5 @@
max_occurrences = 1
earliest_start = 0
-/datum/round_event_control/wizard/summonmagic/New()
- if(config.no_summon_magic)
- weight = 0
- ..()
-
/datum/round_event/wizard/summonmagic/start()
rightandwrong(1,,10)
\ No newline at end of file
diff --git a/code/modules/food&drinks/drinks/drinks.dm b/code/modules/food&drinks/drinks/drinks.dm
index 6888a4a9a04d6..51ece9f90d7ba 100644
--- a/code/modules/food&drinks/drinks/drinks.dm
+++ b/code/modules/food&drinks/drinks/drinks.dm
@@ -219,9 +219,6 @@
//////////////////////////soda_cans//
//These are in their own group to be used as IED's in /obj/item/weapon/grenade/ghettobomb.dm
-/obj/item/weapon/reagent_containers/food/drinks/soda_cans
- name = "soda can"
-
/obj/item/weapon/reagent_containers/food/drinks/soda_cans/attack(mob/M, mob/user)
if(M == user && !src.reagents.total_volume && user.a_intent == "harm" && user.zone_sel.selecting == "head")
user.visible_message("[user] crushes the can of [src] on \his forehead!", "You crush the can of [src] on your forehead!")
diff --git a/code/modules/food&drinks/drinks/drinks/bottle.dm b/code/modules/food&drinks/drinks/drinks/bottle.dm
index 5cdfcd67a2c7e..5c0bdec3e23b6 100644
--- a/code/modules/food&drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food&drinks/drinks/drinks/bottle.dm
@@ -92,8 +92,8 @@
target.visible_message("[user] has hit [target][head_attack_message] with a bottle of [src.name]!", \
"[user] has hit [target][head_attack_message] with a bottle of [src.name]!")
else
- user.visible_message("[target] hits \himself with a bottle of [src.name][head_attack_message]!", \
- "[target] hits \himself with a bottle of [src.name][head_attack_message]!")
+ user.visible_message("[target] hits himself with a bottle of [src.name][head_attack_message]!", \
+ "[target] hits himself with a bottle of [src.name][head_attack_message]!")
//Attack logs
add_logs(user, target, "attacked", object="bottle")
diff --git a/code/modules/food&drinks/drinks/drinks/drinkingglass.dm b/code/modules/food&drinks/drinks/drinks/drinkingglass.dm
index 116f3b4248006..816c4d7f651fc 100644
--- a/code/modules/food&drinks/drinks/drinks/drinkingglass.dm
+++ b/code/modules/food&drinks/drinks/drinks/drinkingglass.dm
@@ -8,7 +8,6 @@
volume = 50
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/on_reagent_change()
- overlays.Cut()
if (reagents.reagent_list.len > 0)
switch(reagents.get_master_reagent_id())
if("beer")
@@ -443,39 +442,8 @@
icon_state = "toxinsspecialglass"
name = "Toxins Special"
desc = "Whoah, this thing is on FIRE"
- if("chocolatepudding")
- icon_state = "chocolatepudding"
- name = "Chocolate Pudding"
- desc = ""
- if("vanillapudding")
- icon_state = "vanillapudding"
- name = "Vanilla Pudding"
- desc = "Whoah, this thing is on FIRE"
- if("cherryshake")
- icon_state = "cherryshake"
- name = "Cherry Shake"
- desc = "A cherry flavored milkshake."
- if("bluecherryshake")
- icon_state = "bluecherryshake"
- name = "Blue Cherry Shake"
- desc = "An exotic blue milkshake."
- if("drunkenblumpkin")
- icon_state = "drunkenblumpkin"
- name = "Drunken Blumpkin"
- desc = "A drink for the drunks."
- if("pumpkin_latte")
- icon_state = "pumpkin_latte"
- name = "Pumpkin Latte"
- desc = "A mix of coffee and pumpkin juice."
- if("gibbfloats")
- icon_state = "gibbfloats"
- name = "Gibbfloat"
- desc = "Dr. Gibb with ice cream on top."
else
icon_state ="glass_brown"
- var/image/I = image(icon, "glassoverlay")
- I.color = mix_color_from_reagents(reagents.reagent_list)
- overlays += I
name = "Glass of ..what?"
desc = "You can't really tell what this is."
else
@@ -578,16 +546,3 @@
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/filled/cola
list_reagents = list("cola" = 50)
-/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/attackby(var/obj/item/I, mob/user as mob, params)
- if(istype(I,/obj/item/weapon/reagent_containers/food/snacks/egg)) //breaking eggs
- var/obj/item/weapon/reagent_containers/food/snacks/egg/E = I
- if(reagents)
- if(reagents.total_volume >= reagents.maximum_volume)
- user << "[src] is full."
- else
- user << "You break [E] in [src]."
- reagents.add_reagent("eggyolk", 5)
- qdel(E)
- return
- else
- ..()
diff --git a/code/modules/food&drinks/food/condiment.dm b/code/modules/food&drinks/food/condiment.dm
index 5f489ddaa497c..0241915987687 100644
--- a/code/modules/food&drinks/food/condiment.dm
+++ b/code/modules/food&drinks/food/condiment.dm
@@ -8,7 +8,7 @@
/obj/item/weapon/reagent_containers/food/condiment
name = "condiment container"
desc = "Just your average condiment container."
- icon = 'icons/obj/food/containers.dmi'
+ icon = 'icons/obj/food.dmi'
icon_state = "emptycondiment"
flags = OPENCONTAINER
possible_transfer_amounts = list(1,5,10)
@@ -157,6 +157,7 @@
/obj/item/weapon/reagent_containers/food/condiment/flour
name = "flour sack"
desc = "A big bag of flour. Good for baking!"
+ icon = 'icons/obj/food.dmi'
icon_state = "flour"
item_state = "flour"
list_reagents = list("flour" = 30)
@@ -170,13 +171,6 @@
list_reagents = list("soymilk" = 50)
possible_states = list()
-/obj/item/weapon/reagent_containers/food/condiment/rice
- name = "rice sack"
- desc = "A big bag of rice. Good for cooking!"
- icon_state = "rice"
- item_state = "flour"
- list_reagents = list("rice" = 30)
- possible_states = list()
diff --git a/code/modules/food&drinks/food/customizables.dm b/code/modules/food&drinks/food/customizables.dm
index 7cc0ec3c7f0e8..b2277ccd75630 100644
--- a/code/modules/food&drinks/food/customizables.dm
+++ b/code/modules/food&drinks/food/customizables.dm
@@ -15,7 +15,7 @@
/obj/item/weapon/reagent_containers/food/snacks/customizable
bitesize = 4
w_class = 3
- volume = 80
+ volume = 60
var/ingMax = 12
var/list/ingredients = list()
@@ -50,7 +50,7 @@
S.trash = null //we remove the plate before adding the ingredient
ingredients += S
S.loc = src
- mix_filling_color(S)
+ filling_color = S.filling_color
S.reagents.trans_to(src,min(S.reagents.total_volume, 15)) //limit of 15, we don't want our custom food to be completely filled by just one ingredient with large reagent volume.
update_overlays(S)
user << "You add the [I.name] to the [name]."
@@ -77,43 +77,24 @@
customname = "custom"
break
if(ingredients.len == 1) //first ingredient
- if(istype(S, /obj/item/weapon/reagent_containers/food/snacks/meat))
- var/obj/item/weapon/reagent_containers/food/snacks/meat/M = S
- if(M.subjectname)
- customname = "[M.subjectname]"
- else if(M.subjectjob)
- customname = "[M.subjectjob]"
- else
- customname = S.name
+ if(istype(S, /obj/item/weapon/reagent_containers/food/snacks/meat/human))
+ var/obj/item/weapon/reagent_containers/food/snacks/meat/human/H = S
+ if(H.subjectname)
+ customname = "[H.subjectname]"
+ else if(H.subjectjob)
+ customname = "[H.subjectjob]"
else
- customname = S.name
+ customname = "[initial(S.name)]"
name = "[customname] [initial(name)]"
/obj/item/weapon/reagent_containers/food/snacks/customizable/proc/initialize_custom_food(obj/item/BASE, obj/item/I, mob/user)
if(istype(BASE,/obj/item/weapon/reagent_containers))
var/obj/item/weapon/reagent_containers/RC = BASE
RC.reagents.trans_to(src,RC.reagents.total_volume)
- for(var/obj/O in BASE.contents)
- contents += O
if(I && user)
attackby(I, user)
- user.unEquip(BASE)
qdel(BASE)
-/obj/item/weapon/reagent_containers/food/snacks/customizable/proc/mix_filling_color(obj/item/weapon/reagent_containers/food/snacks/S)
-
- if(ingredients.len == 1)
- filling_color = S.filling_color
- else
- var/list/rgbcolor = list(0,0,0,0)
- var/customcolor = GetColors(filling_color)
- var/ingcolor = GetColors(S.filling_color)
- rgbcolor[1] = (customcolor[1]+ingcolor[1])/2
- rgbcolor[2] = (customcolor[2]+ingcolor[2])/2
- rgbcolor[3] = (customcolor[3]+ingcolor[3])/2
- rgbcolor[4] = (customcolor[4]+ingcolor[4])/2
- filling_color = rgb(rgbcolor[1], rgbcolor[2], rgbcolor[3], rgbcolor[4])
-
/obj/item/weapon/reagent_containers/food/snacks/customizable/update_overlays(obj/item/weapon/reagent_containers/food/snacks/S)
var/image/I = new(icon, "[initial(icon_state)]_filling")
@@ -141,7 +122,6 @@
return
if(INGREDIENTS_FILL)
overlays.Cut()
- I.color = filling_color
if(INGREDIENTS_LINE)
I.pixel_y = rand(-8,3)
I.pixel_x = I.pixel_y
@@ -149,8 +129,7 @@
overlays += I
-/obj/item/weapon/reagent_containers/food/snacks/customizable/initialize_slice(obj/item/weapon/reagent_containers/food/snacks/slice, reagents_per_slice)
- ..()
+/obj/item/weapon/reagent_containers/food/snacks/customizable/initialize_slice(obj/item/weapon/reagent_containers/food/snacks/slice)
slice.name = "[customname] [initial(slice.name)]"
slice.filling_color = filling_color
slice.update_overlays(src)
@@ -173,7 +152,6 @@
name = "burger"
desc = "A timeless classic."
Ingredientsplacement = INGREDIENTS_STACKPLUSTOP
- icon = 'icons/obj/food/burgerbread.dmi'
icon_state = "bun"
@@ -182,7 +160,6 @@
ingMax = 6
slice_path = /obj/item/weapon/reagent_containers/food/snacks/breadslice/custom
slices_num = 5
- icon = 'icons/obj/food/burgerbread.dmi'
icon_state = "tofubread"
@@ -191,7 +168,6 @@
ingMax = 6
slice_path = /obj/item/weapon/reagent_containers/food/snacks/cakeslice/custom
slices_num = 5
- icon = 'icons/obj/food/piecake.dmi'
icon_state = "plaincake"
@@ -210,14 +186,12 @@
desc = "Noodles. With stuff. Delicious."
Ingredientsplacement = INGREDIENTS_SCATTER
ingMax = 6
- icon = 'icons/obj/food/pizzaspaghetti.dmi'
icon_state = "spaghettiboiled"
/obj/item/weapon/reagent_containers/food/snacks/customizable/pie
name = "pie"
ingMax = 6
- icon = 'icons/obj/food/piecake.dmi'
icon_state = "pie"
@@ -228,7 +202,6 @@
ingMax = 8
slice_path = /obj/item/weapon/reagent_containers/food/snacks/pizzaslice/custom
slices_num = 6
- icon = 'icons/obj/food/pizzaspaghetti.dmi'
icon_state = "pizzamargherita"
@@ -237,7 +210,6 @@
desc = "Very tasty."
trash = /obj/item/weapon/reagent_containers/glass/bowl
ingMax = 6
- icon = 'icons/obj/food/soupsalad.dmi'
icon_state = "bowl"
@@ -245,7 +217,6 @@
name = "toast"
desc = "A timeless classic."
Ingredientsplacement = INGREDIENTS_STACK
- icon = 'icons/obj/food/burgerbread.dmi'
icon_state = "breadslice"
var/finished = 0
@@ -282,12 +253,9 @@
desc = "A bowl with liquid and... stuff in it."
trash = /obj/item/weapon/reagent_containers/glass/bowl
ingMax = 8
- icon = 'icons/obj/food/soupsalad.dmi'
icon_state = "wishsoup"
-/obj/item/weapon/reagent_containers/food/snacks/customizable/soup/New()
- ..()
- eatverb = pick("slurp","sip","suck","inhale","drink")
+
@@ -300,7 +268,7 @@
icon_state = "snack_bowl"
name = "bowl"
desc = "A simple bowl, used for soups and salads."
- icon = 'icons/obj/food/soupsalad.dmi'
+ icon = 'icons/obj/food.dmi'
icon_state = "bowl"
flags = OPENCONTAINER
w_class = 3
@@ -329,9 +297,7 @@
/obj/item/weapon/reagent_containers/glass/bowl/update_icon()
overlays.Cut()
if(reagents.total_volume)
- var/image/filling = image('icons/obj/food/soupsalad.dmi', "fullbowl")
- filling.color = mix_color_from_reagents(reagents.reagent_list)
- overlays += filling
+ icon_state = "wishsoup"
else
icon_state = "bowl"
diff --git a/code/modules/food&drinks/food/snacks.dm b/code/modules/food&drinks/food/snacks.dm
index ebd60167175e0..fc0b9137e77e7 100644
--- a/code/modules/food&drinks/food/snacks.dm
+++ b/code/modules/food&drinks/food/snacks.dm
@@ -1,7 +1,7 @@
/obj/item/weapon/reagent_containers/food/snacks
name = "snack"
desc = "yummy"
- icon = 'icons/obj/food/food.dmi'
+ icon = 'icons/obj/food.dmi'
icon_state = null
var/bitesize = 2
var/bitecount = 0
@@ -17,8 +17,7 @@
var/filling_color = "#FFFFFF" //color to use when added to custom food.
var/custom_food_type = null //for food customizing. path of the custom food to create
var/junkiness = 0 //for junk food. used to lower human satiety.
- var/list/bonus_reagents = list() //the amount of reagents (usually nutriment and vitamin) added to crafted/cooked snacks, on top of the ingredients reagents.
- var/customfoodfilling = 1 // whether it can be used as filling in custom food
+
//Placeholder for effect that trigger on eating that aren't tied to reagents.
/obj/item/weapon/reagent_containers/food/snacks/proc/On_Consume()
@@ -51,7 +50,7 @@
M.unEquip(src) //so icons update :[
qdel(src)
return 0
- if(iscarbon(M))
+ if(istype(M, /mob/living/carbon))
if(!canconsume(M, user))
return 0
@@ -79,7 +78,7 @@
M << "You cannot force any more of \the [src] to go down your throat."
return 0
else
- if(!isbrain(M)) //If you're feeding it to someone else.
+ if(! (isslime(M) || isbrain(M)) ) //If you're feeding it to someone else.
if(wrapped)
return 0
if(fullness <= (600 * (1 + M.overeatduration / 1000)))
@@ -142,10 +141,7 @@
var/obj/item/weapon/reagent_containers/food/snacks/S = W
if(custom_food_type && ispath(custom_food_type))
if(S.w_class > 2)
- user << "[S] is too big for [src]."
- return 0
- if(!S.customfoodfilling)
- user << "[src] can't be filled with [S]."
+ user << "The ingredient is too big for [src]."
return 0
if(contents.len >= 20)
user << "You can't add more ingredients to [src]."
@@ -158,12 +154,6 @@
if(slice(sharpness, W, user))
return 1
-//Called when you finish tablecrafting a snack.
-/obj/item/weapon/reagent_containers/food/snacks/CheckParts()
- if(bonus_reagents.len)
- for(var/r_id in bonus_reagents)
- var/amount = bonus_reagents[r_id]
- reagents.add_reagent(r_id, amount)
/obj/item/weapon/reagent_containers/food/snacks/proc/slice(var/accuracy, obj/item/weapon/W, mob/user)
if((slices_num <= 0 || !slices_num) || !slice_path) //is the food sliceable?
@@ -191,15 +181,16 @@
)
slices_lost = rand(1,min(1,round(slices_num/2)))
+ if(!slice_path && !slices_num)
+ return
var/reagents_per_slice = reagents.total_volume/slices_num
for(var/i=1 to (slices_num-slices_lost))
var/obj/item/weapon/reagent_containers/food/snacks/slice = new slice_path (loc)
- initialize_slice(slice, reagents_per_slice)
+ initialize_slice(slice)
+ reagents.trans_to(slice,reagents_per_slice)
qdel(src)
-/obj/item/weapon/reagent_containers/food/snacks/proc/initialize_slice(obj/item/weapon/reagent_containers/food/snacks/slice, reagents_per_slice)
- slice.create_reagents(slice.volume)
- reagents.trans_to(slice,reagents_per_slice)
+/obj/item/weapon/reagent_containers/food/snacks/proc/initialize_slice(obj/item/weapon/reagent_containers/food/snacks/slice)
return
/obj/item/weapon/reagent_containers/food/snacks/proc/update_overlays(obj/item/weapon/reagent_containers/food/snacks/S)
@@ -213,14 +204,9 @@
overlays += I
// initialize_cooked_food() is called when microwaving the food
-/obj/item/weapon/reagent_containers/food/snacks/proc/initialize_cooked_food(obj/item/weapon/reagent_containers/food/snacks/S, cooking_efficiency = 1)
- S.create_reagents(S.volume)
+/obj/item/weapon/reagent_containers/food/snacks/proc/initialize_cooked_food(obj/item/weapon/reagent_containers/food/snacks/S)
if(reagents)
reagents.trans_to(S, reagents.total_volume)
- if(S.bonus_reagents.len)
- for(var/r_id in S.bonus_reagents)
- var/amount = S.bonus_reagents[r_id] * cooking_efficiency
- S.reagents.add_reagent(r_id, amount)
/obj/item/weapon/reagent_containers/food/snacks/Destroy()
if(contents)
@@ -276,31 +262,17 @@
/obj/item/weapon/reagent_containers/food/snacks/store
w_class = 3
- var/stored_item = 0
/obj/item/weapon/reagent_containers/food/snacks/store/attackby(obj/item/weapon/W, mob/user, params)
- ..()
- if(W.w_class <= 2 & !istype(W, /obj/item/weapon/reagent_containers/food/snacks)) //can't slip snacks inside, they're used for custom foods.
- if(is_sharp(W))
- return 0
- if(stored_item)
+ if(W.w_class > 2 || custom_food_type) //can't store objects inside food needed to start a customizable snack.
+ ..()
+ else
+ if(contents.len)
return 0
if(!iscarbon(user))
return 0
- if(contents.len >= 20)
- user << "[src] is full."
- return 0
user << "You slip [W] inside [src]."
user.unEquip(W)
add_fingerprint(user)
contents += W
- stored_item = 1
return 1 // no afterattack here
-
-/obj/item/weapon/reagent_containers/food/snacks/MouseDrop(atom/over)
- var/turf/T = get_turf(src)
- var/obj/structure/table/TB = locate(/obj/structure/table) in T
- if(TB)
- TB.MouseDrop(over)
- else
- ..()
diff --git a/code/modules/food&drinks/food/snacks/dough.dm b/code/modules/food&drinks/food/snacks/dough.dm
index 7773d08534c9f..d03339809cd25 100644
--- a/code/modules/food&drinks/food/snacks/dough.dm
+++ b/code/modules/food&drinks/food/snacks/dough.dm
@@ -5,7 +5,7 @@
/obj/item/weapon/reagent_containers/food/snacks/dough
name = "dough"
desc = "A piece of dough."
- icon = 'icons/obj/food/food_ingredients.dmi'
+ icon = 'icons/obj/food_ingredients.dmi'
icon_state = "dough"
cooked_type = /obj/item/weapon/reagent_containers/food/snacks/store/bread/plain
list_reagents = list("nutriment" = 6)
@@ -29,7 +29,7 @@
/obj/item/weapon/reagent_containers/food/snacks/flatdough
name = "flat dough"
desc = "A flattened dough."
- icon = 'icons/obj/food/food_ingredients.dmi'
+ icon = 'icons/obj/food_ingredients.dmi'
icon_state = "flat dough"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/doughslice
slices_num = 3
@@ -40,7 +40,7 @@
/obj/item/weapon/reagent_containers/food/snacks/pizzabread
name = "pizza bread"
desc = "Add ingredients to make a pizza"
- icon = 'icons/obj/food/food_ingredients.dmi'
+ icon = 'icons/obj/food_ingredients.dmi'
icon_state = "pizzabread"
custom_food_type = /obj/item/weapon/reagent_containers/food/snacks/customizable/pizza
list_reagents = list("nutriment" = 7)
@@ -50,7 +50,7 @@
/obj/item/weapon/reagent_containers/food/snacks/doughslice
name = "dough slice"
desc = "A slice of dough. Can be cooked into a bun."
- icon = 'icons/obj/food/food_ingredients.dmi'
+ icon = 'icons/obj/food_ingredients.dmi'
icon_state = "doughslice"
cooked_type = /obj/item/weapon/reagent_containers/food/snacks/bun
filling_color = "#CD853F"
@@ -59,7 +59,7 @@
/obj/item/weapon/reagent_containers/food/snacks/bun
name = "bun"
desc = "A base for any self-respecting burger."
- icon = 'icons/obj/food/burgerbread.dmi'
+ icon = 'icons/obj/food.dmi'
icon_state = "bun"
list_reagents = list("nutriment" = 1)
custom_food_type = /obj/item/weapon/reagent_containers/food/snacks/customizable/burger
@@ -68,7 +68,7 @@
/obj/item/weapon/reagent_containers/food/snacks/cakebatter
name = "cake batter"
desc = "Cook it to get a cake."
- icon = 'icons/obj/food/food_ingredients.dmi'
+ icon = 'icons/obj/food_ingredients.dmi'
icon_state = "cakebatter"
cooked_type = /obj/item/weapon/reagent_containers/food/snacks/store/cake/plain
list_reagents = list("nutriment" = 9)
@@ -89,7 +89,7 @@
/obj/item/weapon/reagent_containers/food/snacks/piedough
name = "pie dough"
desc = "Cook it to get a pie."
- icon = 'icons/obj/food/food_ingredients.dmi'
+ icon = 'icons/obj/food_ingredients.dmi'
icon_state = "piedough"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/rawpastrybase
slices_num = 3
@@ -100,7 +100,7 @@
/obj/item/weapon/reagent_containers/food/snacks/rawpastrybase
name = "raw pastry base"
desc = "Must be cooked before use."
- icon = 'icons/obj/food/food_ingredients.dmi'
+ icon = 'icons/obj/food_ingredients.dmi'
icon_state = "rawpastrybase"
cooked_type = /obj/item/weapon/reagent_containers/food/snacks/pastrybase
filling_color = "#CD853F"
@@ -109,7 +109,7 @@
/obj/item/weapon/reagent_containers/food/snacks/pastrybase
name = "pastry base"
desc = "A base for any self-respecting pastry"
- icon = 'icons/obj/food/food_ingredients.dmi'
+ icon = 'icons/obj/food_ingredients.dmi'
icon_state = "pastrybase"
list_reagents = list("nutriment" = 1)
filling_color = "#CD853F"
diff --git a/code/modules/food&drinks/food/snacks/meat.dm b/code/modules/food&drinks/food/snacks/meat.dm
index 1fbb0e409a3e7..14634bb1f9db7 100644
--- a/code/modules/food&drinks/food/snacks/meat.dm
+++ b/code/modules/food&drinks/food/snacks/meat.dm
@@ -1,21 +1,16 @@
/obj/item/weapon/reagent_containers/food/snacks/meat
- var/subjectname = ""
- var/subjectjob = null
-
-/obj/item/weapon/reagent_containers/food/snacks/meat/slab
name = "meat"
desc = "A slab of meat"
icon_state = "meat"
dried_type = /obj/item/weapon/reagent_containers/food/snacks/sosjerky
bitesize = 3
list_reagents = list("nutriment" = 3)
- cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain
- slice_path = /obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/plain
+ cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain
+ slice_path = /obj/item/weapon/reagent_containers/food/snacks/rawcutlet/plain
slices_num = 3
filling_color = "#FF0000"
-/obj/item/weapon/reagent_containers/food/snacks/meat/slab/initialize_slice(obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/slice, reagents_per_slice)
- ..()
+/obj/item/weapon/reagent_containers/food/snacks/meat/initialize_slice(obj/item/weapon/reagent_containers/food/snacks/rawcutlet/slice)
var/image/I = new(icon, "rawcutlet_coloration")
I.color = filling_color
slice.overlays += I
@@ -23,19 +18,21 @@
slice.name = "raw [name] cutlet"
slice.meat_type = name
-/obj/item/weapon/reagent_containers/food/snacks/meat/slab/initialize_cooked_food(obj/item/weapon/reagent_containers/food/snacks/S, cooking_efficiency)
+/obj/item/weapon/reagent_containers/food/snacks/meat/initialize_cooked_food(obj/item/weapon/reagent_containers/food/snacks/S)
..()
S.name = "[name] steak"
///////////////////////////////////// HUMAN MEATS //////////////////////////////////////////////////////
-/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human
+/obj/item/weapon/reagent_containers/food/snacks/meat/human
name = "-meat"
- cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain/human
- slice_path = /obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/plain/human
+ var/subjectname = ""
+ var/subjectjob = null
+ cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain/human
+ slice_path = /obj/item/weapon/reagent_containers/food/snacks/rawcutlet/plain/human
-/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/initialize_slice(obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/plain/human/slice, reagents_per_slice)
+/obj/item/weapon/reagent_containers/food/snacks/meat/human/initialize_slice(obj/item/weapon/reagent_containers/food/snacks/rawcutlet/plain/human/slice)
..()
if(subjectname)
slice.subjectname = subjectname
@@ -44,7 +41,7 @@
slice.subjectjob = subjectjob
slice.name = "raw [subjectjob] cutlet"
-/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/initialize_cooked_food(obj/item/weapon/reagent_containers/food/snacks/S, cooking_efficiency)
+/obj/item/weapon/reagent_containers/food/snacks/meat/human/initialize_cooked_food(obj/item/weapon/reagent_containers/food/snacks/S)
..()
if(subjectname)
S.name = "[subjectname] meatsteak"
@@ -52,51 +49,51 @@
S.name = "[subjectjob] meatsteak"
-/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/slime
+/obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/slime
icon_state = "slimemeat"
desc = "Because jello wasn't offensive enough to vegans"
list_reagents = list("nutriment" = 3, "slimejelly" = 3)
filling_color = "#00FFFF"
-/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/golem
+/obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/golem
icon_state = "golemmeat"
desc = "Edible rocks, welcome to the future"
list_reagents = list("nutriment" = 3, "iron" = 3)
filling_color = "#A9A9A9"
-/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/golem/adamantine
+/obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/golem/adamantine
icon_state = "agolemmeat"
desc = "From the slime pen to the rune to the kitchen, science"
filling_color = "#66CDAA"
-/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/lizard
+/obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/lizard
icon_state = "lizardmeat"
desc = "Delicious dino damage"
filling_color = "#6B8E23"
-/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/plant
+/obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/plant
icon_state = "plantmeat"
desc = "All the joys of healthy eating with all the fun of cannibalism"
filling_color = "#E9967A"
-/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/shadow
+/obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/shadow
icon_state = "shadowmeat"
desc = "Ow, the edge"
filling_color = "#202020"
-/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/fly
+/obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/fly
icon_state = "flymeat"
desc = "Nothing says tasty like maggot filled radioactive mutant flesh"
list_reagents = list("nutriment" = 3, "uranium" = 3)
-/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton
+/obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/skeleton
name = "-bone"
icon_state = "skeletonmeat"
desc = "There's a point where this needs to stop and clearly we have passed it"
filling_color = "#F0F0F0"
slice_path = null //can't slice a bone into cutlets
-/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie
+/obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/zombie
name = "-meat (rotten)"
icon_state = "lizardmeat" //Close enough.
desc = "Halfway to becoming fertilizer for your garden."
@@ -110,58 +107,58 @@
////////////////////////////////////// OTHER MEATS ////////////////////////////////////////////////////////
-/obj/item/weapon/reagent_containers/food/snacks/meat/slab/synthmeat
+/obj/item/weapon/reagent_containers/food/snacks/meat/synthmeat
name = "synthmeat"
desc = "A synthetic slab of meat."
-/obj/item/weapon/reagent_containers/food/snacks/meat/slab/monkey
+/obj/item/weapon/reagent_containers/food/snacks/meat/monkey
name = "monkey meat"
-/obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi
+/obj/item/weapon/reagent_containers/food/snacks/meat/corgi
name = "corgi meat"
desc = "Tastes like... well you know..."
-/obj/item/weapon/reagent_containers/food/snacks/meat/slab/pug
+/obj/item/weapon/reagent_containers/food/snacks/meat/pug
name = "pug meat"
desc = "Tastes like... well you know..."
-/obj/item/weapon/reagent_containers/food/snacks/meat/slab/killertomato
+/obj/item/weapon/reagent_containers/food/snacks/meat/killertomato
name = "killer tomato meat"
desc = "A slice from a huge tomato."
icon_state = "tomatomeat"
list_reagents = list("nutriment" = 2)
filling_color = "#FF0000"
- cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/steak/killertomato
- slice_path = /obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/killertomato
+ cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meatsteak/killertomato
+ slice_path = /obj/item/weapon/reagent_containers/food/snacks/rawcutlet/killertomato
-/obj/item/weapon/reagent_containers/food/snacks/meat/slab/bear
+/obj/item/weapon/reagent_containers/food/snacks/meat/bear
name = "bear meat"
desc = "A very manly slab of meat."
icon_state = "bearmeat"
list_reagents = list("nutriment" = 12, "morphine" = 5, "vitamin" = 2)
filling_color = "#FFB6C1"
- cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/steak/bear
- slice_path = /obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/bear
+ cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meatsteak/bear
+ slice_path = /obj/item/weapon/reagent_containers/food/snacks/rawcutlet/bear
-/obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno
+/obj/item/weapon/reagent_containers/food/snacks/meat/xeno
name = "xeno meat"
desc = "A slab of meat"
icon_state = "xenomeat"
list_reagents = list("nutriment" = 3, "vitamin" = 1)
bitesize = 4
filling_color = "#32CD32"
- cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/steak/xeno
- slice_path = /obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/xeno
+ cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meatsteak/xeno
+ slice_path = /obj/item/weapon/reagent_containers/food/snacks/rawcutlet/xeno
-/obj/item/weapon/reagent_containers/food/snacks/meat/slab/spider
+/obj/item/weapon/reagent_containers/food/snacks/meat/spider
name = "spider meat"
desc = "A slab of spider meat."
icon_state = "spidermeat"
list_reagents = list("nutriment" = 3, "toxin" = 3, "vitamin" = 1)
filling_color = "#7CFC00"
- cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/steak/spider
- slice_path = /obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/spider
+ cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meatsteak/spider
+ slice_path = /obj/item/weapon/reagent_containers/food/snacks/rawcutlet/spider
@@ -169,30 +166,25 @@
////////////////////////////////////// MEAT STEAKS ///////////////////////////////////////////////////////////
-/obj/item/weapon/reagent_containers/food/snacks/meat/steak
+/obj/item/weapon/reagent_containers/food/snacks/meatsteak
name = "steak"
desc = "A piece of hot spicy meat."
icon_state = "meatsteak"
- list_reagents = list("nutriment" = 5)
- bonus_reagents = list("nutriment" = 2, "vitamin" = 1)
+ list_reagents = list("nutriment" = 2, "vitamin" = 1)
trash = /obj/item/trash/plate
filling_color = "#B22222"
-/obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain
+/obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain
-/obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain/human
+/obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain/human
-/obj/item/weapon/reagent_containers/food/snacks/meat/steak/killertomato
- name = "killer tomato steak"
+/obj/item/weapon/reagent_containers/food/snacks/meatsteak/killertomato
-/obj/item/weapon/reagent_containers/food/snacks/meat/steak/bear
- name = "bear steak"
+/obj/item/weapon/reagent_containers/food/snacks/meatsteak/bear
-/obj/item/weapon/reagent_containers/food/snacks/meat/steak/xeno
- name = "xeno steak"
+/obj/item/weapon/reagent_containers/food/snacks/meatsteak/xeno
-/obj/item/weapon/reagent_containers/food/snacks/meat/steak/spider
- name = "spider steak"
+/obj/item/weapon/reagent_containers/food/snacks/meatsteak/spider
@@ -200,74 +192,61 @@
//Raw cutlets
-/obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet
+/obj/item/weapon/reagent_containers/food/snacks/rawcutlet
name = "raw cutlet"
desc = "A raw meat cutlet."
icon_state = "rawcutlet"
- cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/plain
+ cooked_type = /obj/item/weapon/reagent_containers/food/snacks/cutlet/plain
bitesize = 2
- list_reagents = list("nutriment" = 1)
filling_color = "#B22222"
var/meat_type = "meat"
-/obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/initialize_cooked_food(obj/item/weapon/reagent_containers/food/snacks/S, cooking_efficiency)
+/obj/item/weapon/reagent_containers/food/snacks/rawcutlet/initialize_cooked_food(obj/item/weapon/reagent_containers/food/snacks/S)
..()
S.name = "[meat_type] cutlet"
-/obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/plain
+/obj/item/weapon/reagent_containers/food/snacks/rawcutlet/plain
-/obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/plain/human
- cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/plain/human
+/obj/item/weapon/reagent_containers/food/snacks/rawcutlet/plain/human
+ cooked_type = /obj/item/weapon/reagent_containers/food/snacks/cutlet/plain/human
+ var/subjectname = ""
+ var/subjectjob = null
-/obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/plain/human/initialize_cooked_food(obj/item/weapon/reagent_containers/food/snacks/S, cooking_efficiency)
+/obj/item/weapon/reagent_containers/food/snacks/rawcutlet/plain/human/initialize_cooked_food(obj/item/weapon/reagent_containers/food/snacks/S)
..()
if(subjectname)
S.name = "[subjectname] [initial(S.name)]"
else if(subjectjob)
S.name = "[subjectjob] [initial(S.name)]"
-/obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/killertomato
- name = "raw killer tomato cutlet"
- cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/killertomato
+/obj/item/weapon/reagent_containers/food/snacks/rawcutlet/killertomato
-/obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/bear
- name = "raw bear cutlet"
- cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/bear
+/obj/item/weapon/reagent_containers/food/snacks/rawcutlet/bear
-/obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/xeno
- name = "raw xeno cutlet"
- cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/xeno
+/obj/item/weapon/reagent_containers/food/snacks/rawcutlet/xeno
-/obj/item/weapon/reagent_containers/food/snacks/meat/rawcutlet/spider
- name = "raw spider cutlet"
- cooked_type = /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/spider
+/obj/item/weapon/reagent_containers/food/snacks/rawcutlet/spider
//Cooked cutlets
-/obj/item/weapon/reagent_containers/food/snacks/meat/cutlet
+/obj/item/weapon/reagent_containers/food/snacks/cutlet
name = "cutlet"
desc = "A cooked meat cutlet."
icon_state = "cutlet"
bitesize = 2
- list_reagents = list("nutriment" = 2)
- bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
+ list_reagents = list("nutriment" = 1, "vitamin" = 1)
filling_color = "#B22222"
-/obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/plain
-
-/obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/plain/human
+/obj/item/weapon/reagent_containers/food/snacks/cutlet/plain
-/obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/killertomato
- name = "killer tomato cutlet"
+/obj/item/weapon/reagent_containers/food/snacks/cutlet/plain/human
-/obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/bear
- name = "bear cutlet"
+/obj/item/weapon/reagent_containers/food/snacks/cutlet/killertomato
-/obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/xeno
- name = "xeno cutlet"
+/obj/item/weapon/reagent_containers/food/snacks/cutlet/bear
-/obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/spider
- name = "spider cutlet"
+/obj/item/weapon/reagent_containers/food/snacks/cutlet/xeno
+/obj/item/weapon/reagent_containers/food/snacks/cutlet/spider
\ No newline at end of file
diff --git a/code/modules/food&drinks/food/snacks_bread.dm b/code/modules/food&drinks/food/snacks_bread.dm
index 8ff5e2681a397..5fc55b6639490 100644
--- a/code/modules/food&drinks/food/snacks_bread.dm
+++ b/code/modules/food&drinks/food/snacks_bread.dm
@@ -1,25 +1,19 @@
/obj/item/weapon/reagent_containers/food/snacks/store/bread
- icon = 'icons/obj/food/burgerbread.dmi'
- volume = 80
slices_num = 5
/obj/item/weapon/reagent_containers/food/snacks/breadslice
- icon = 'icons/obj/food/burgerbread.dmi'
bitesize = 2
custom_food_type = /obj/item/weapon/reagent_containers/food/snacks/customizable/sandwich
filling_color = "#FFA500"
- list_reagents = list("nutriment" = 2)
- slot_flags = SLOT_HEAD
- customfoodfilling = 0 //to avoid infinite bread-ception
+ slot_flags = SLOT_HEAD // i'm going to kill myself. i'm going to murder my own self.
/obj/item/weapon/reagent_containers/food/snacks/store/bread/plain
name = "bread"
desc = "Some plain old Earthen bread."
icon_state = "bread"
- bonus_reagents = list("nutriment" = 7)
- list_reagents = list("nutriment" = 10)
+ list_reagents = list("nutriment" = 7)
custom_food_type = /obj/item/weapon/reagent_containers/food/snacks/customizable/bread
slice_path = /obj/item/weapon/reagent_containers/food/snacks/breadslice/plain
@@ -27,15 +21,13 @@
name = "bread slice"
desc = "A slice of home."
icon_state = "breadslice"
- customfoodfilling = 1
/obj/item/weapon/reagent_containers/food/snacks/store/bread/meat
name = "meatbread loaf"
desc = "The culinary base of every self-respecting eloquen/tg/entleman."
icon_state = "meatbread"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/breadslice/meat
- bonus_reagents = list("nutriment" = 5, "vitamin" = 10)
- list_reagents = list("nutriment" = 30, "vitamin" = 5)
+ list_reagents = list("nutriment" = 5, "vitamin" = 10)
/obj/item/weapon/reagent_containers/food/snacks/breadslice/meat
name = "meatbread slice"
@@ -47,38 +39,33 @@
desc = "The culinary base of every self-respecting eloquen/tg/entleman. Extra Heretical."
icon_state = "xenomeatbread"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/breadslice/xenomeat
- bonus_reagents = list("nutriment" = 5, "vitamin" = 10)
- list_reagents = list("nutriment" = 30, "vitamin" = 5)
+ list_reagents = list("nutriment" = 5, "vitamin" = 10)
/obj/item/weapon/reagent_containers/food/snacks/breadslice/xenomeat
name = "xenomeatbread slice"
desc = "A slice of delicious meatbread. Extra Heretical."
icon_state = "xenobreadslice"
filling_color = "#32CD32"
- list_reagents = list("nutriment" = 6, "vitamin" = 1)
/obj/item/weapon/reagent_containers/food/snacks/store/bread/spidermeat
name = "spider meat loaf"
desc = "Reassuringly green meatloaf made from spider meat."
icon_state = "spidermeatbread"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/breadslice/spidermeat
- bonus_reagents = list("nutriment" = 5, "vitamin" = 10)
- list_reagents = list("nutriment" = 30, "toxin" = 15, "vitamin" = 5)
+ list_reagents = list("nutriment" = 5, "vitamin" = 10)
/obj/item/weapon/reagent_containers/food/snacks/breadslice/spidermeat
name = "spider meat bread slice"
desc = "A slice of meatloaf made from an animal that most likely still wants you dead."
icon_state = "xenobreadslice"
filling_color = "#7CFC00"
- list_reagents = list("nutriment" = 6, "toxin" = 3, "vitamin" = 1)
/obj/item/weapon/reagent_containers/food/snacks/store/bread/banana
name = "banana-nut bread"
desc = "A heavenly and filling treat."
icon_state = "bananabread"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/breadslice/banana
- bonus_reagents = list("nutriment" = 5, "banana" = 20)
- list_reagents = list("nutriment" = 20, "banana" = 20)
+ list_reagents = list("nutriment" = 5, "banana" = 20)
/obj/item/weapon/reagent_containers/food/snacks/breadslice/banana
@@ -86,52 +73,32 @@
desc = "A slice of delicious banana bread."
icon_state = "bananabreadslice"
filling_color = "#FFD700"
- list_reagents = list("nutriment" = 4, "banana" = 4)
/obj/item/weapon/reagent_containers/food/snacks/store/bread/tofu
name = "Tofubread"
desc = "Like meatbread but for vegetarians. Not guaranteed to give superpowers."
icon_state = "tofubread"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/breadslice/tofu
- bonus_reagents = list("nutriment" = 5, "vitamin" = 10)
- list_reagents = list("nutriment" = 20, "vitamin" = 5)
+ list_reagents = list("nutriment" = 5, "vitamin" = 10)
/obj/item/weapon/reagent_containers/food/snacks/breadslice/tofu
name = "tofubread slice"
desc = "A slice of delicious tofubread."
icon_state = "tofubreadslice"
filling_color = "#FF8C00"
- list_reagents = list("nutriment" = 4, "vitamin" = 1)
/obj/item/weapon/reagent_containers/food/snacks/store/bread/creamcheese
name = "cream cheese bread"
desc = "Yum yum yum!"
icon_state = "creamcheesebread"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/breadslice/creamcheese
- bonus_reagents = list("nutriment" = 5, "vitamin" = 5)
- list_reagents = list("nutriment" = 20, "vitamin" = 5)
+ list_reagents = list("nutriment" = 5, "vitamin" = 5)
/obj/item/weapon/reagent_containers/food/snacks/breadslice/creamcheese
name = "cream cheese bread slice"
desc = "A slice of yum!"
icon_state = "creamcheesebreadslice"
filling_color = "#FF8C00"
- list_reagents = list("nutriment" = 4, "vitamin" = 1)
-
-/obj/item/weapon/reagent_containers/food/snacks/store/bread/mimana
- name = "mimana bread"
- desc = "Best eaten in silence."
- icon_state = "mimanabread"
- slice_path = /obj/item/weapon/reagent_containers/food/snacks/breadslice/mimana
- bonus_reagents = list("nutriment" = 5, "vitamin" = 5)
- list_reagents = list("nutriment" = 20, "mutetoxin" = 5, "nothing" = 5, "vitamin" = 5)
-
-/obj/item/weapon/reagent_containers/food/snacks/breadslice/mimana
- name = "mimana bread slice"
- desc = "A slice of silence!"
- icon_state = "mimanabreadslice"
- filling_color = "#C0C0C0"
- list_reagents = list("nutriment" = 2, "mutetoxin" = 1, "nothing" = 1, "vitamin" = 1)
/obj/item/weapon/reagent_containers/food/snacks/breadslice/custom
name = "bread slice"
@@ -141,9 +108,7 @@
/obj/item/weapon/reagent_containers/food/snacks/baguette
name = "baguette"
desc = "Bon appetit!"
- icon = 'icons/obj/food/burgerbread.dmi'
icon_state = "baguette"
- bonus_reagents = list("nutriment" = 2, "vitamin" = 2)
- list_reagents = list("nutriment" = 6, "vitamin" = 1)
+ list_reagents = list("nutriment" = 2, "vitamin" = 2)
bitesize = 3
- w_class = 3
+ w_class = 3
\ No newline at end of file
diff --git a/code/modules/food&drinks/food/snacks_burgers.dm b/code/modules/food&drinks/food/snacks_burgers.dm
index 27f0b2b2bb222..83340dc3f14ff 100644
--- a/code/modules/food&drinks/food/snacks_burgers.dm
+++ b/code/modules/food&drinks/food/snacks_burgers.dm
@@ -1,147 +1,135 @@
/obj/item/weapon/reagent_containers/food/snacks/burger
filling_color = "#CD853F"
- icon = 'icons/obj/food/burgerbread.dmi'
icon_state = "hburger"
- bitesize = 3
- list_reagents = list("nutriment" = 6, "vitamin" = 1)
/obj/item/weapon/reagent_containers/food/snacks/burger/plain
name = "burger"
desc = "The cornerstone of every nutritious breakfast."
- bonus_reagents = list("vitamin" = 1)
+ list_reagents = list("vitamin" = 1)
+ bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/burger/human
var/hname = ""
var/job = null
- name = "human burger"
+ name = "-burger"
desc = "A bloody burger."
- bonus_reagents = list("vitamin" = 4)
+ list_reagents = list("vitamin" = 4)
/obj/item/weapon/reagent_containers/food/snacks/burger/appendix
name = "appendix burger"
desc = "Tastes like appendicitis."
- bonus_reagents = list("nutriment" = 6, "vitamin" = 6)
+ list_reagents = list("nutriment" = 6, "vitamin" = 6)
icon_state = "appendixburger"
/obj/item/weapon/reagent_containers/food/snacks/burger/fish
name = "fillet -o- carp sandwich"
desc = "Almost like a carp is yelling somewhere... Give me back that fillet -o- carp, give me that carp."
icon_state = "fishburger"
- bonus_reagents = list("nutriment" = 2, "vitamin" = 3)
+ list_reagents = list("nutriment" = 2, "vitamin" = 3)
/obj/item/weapon/reagent_containers/food/snacks/burger/tofu
name = "tofu burger"
desc = "What.. is that meat?"
icon_state = "tofuburger"
- bonus_reagents = list("nutriment" = 2, "vitamin" = 2)
+ list_reagents = list("nutriment" = 2, "vitamin" = 2)
/obj/item/weapon/reagent_containers/food/snacks/burger/roburger
name = "roburger"
desc = "The lettuce is the only organic component. Beep."
icon_state = "roburger"
- bonus_reagents = list("nutriment" = 2, "nanomachines" = 2, "vitamin" = 5)
- list_reagents = list("nutriment" = 6, "nanomachines" = 5, "vitamin" = 1)
+ list_reagents = list("nutriment" = 2, "nanomachines" = 2, "vitamin" = 5)
/obj/item/weapon/reagent_containers/food/snacks/burger/roburgerbig
name = "roburger"
desc = "This massive patty looks like poison. Beep."
icon_state = "roburger"
volume = 120
- bonus_reagents = list("nutriment" = 5, "nanomachines" = 70, "vitamin" = 10)
- list_reagents = list("nutriment" = 6, "nanomachines" = 70, "vitamin" = 5)
+ list_reagents = list("nutriment" = 5, "nanomachines" = 70, "vitamin" = 10)
/obj/item/weapon/reagent_containers/food/snacks/burger/xeno
name = "xenoburger"
desc = "Smells caustic. Tastes like heresy."
icon_state = "xburger"
- bonus_reagents = list("nutriment" = 2, "vitamin" = 6)
-
-/obj/item/weapon/reagent_containers/food/snacks/burger/bearger
- name = "bearger"
- desc = "Best served rawr."
- icon_state = "bearger"
- bonus_reagents = list("nutriment" = 3, "vitamin" = 6)
+ list_reagents = list("nutriment" = 2, "vitamin" = 6)
/obj/item/weapon/reagent_containers/food/snacks/burger/clown
name = "clown burger"
desc = "This tastes funny..."
icon_state = "clownburger"
- bonus_reagents = list("nutriment" = 4, "vitamin" = 6, "banana" = 6)
+ list_reagents = list("nutriment" = 4, "vitamin" = 6, "banana" = 6)
/obj/item/weapon/reagent_containers/food/snacks/burger/mime
name = "mime burger"
desc = "Its taste defies language."
icon_state = "mimeburger"
- bonus_reagents = list("nutriment" = 4, "vitamin" = 6, "nothing" = 6)
+ list_reagents = list("nutriment" = 4, "vitamin" = 6, "nothing" = 6)
/obj/item/weapon/reagent_containers/food/snacks/burger/brain
name = "brainburger"
desc = "A strange looking burger. It looks almost sentient."
icon_state = "brainburger"
- bonus_reagents = list("nutriment" = 6, "mannitol" = 6, "vitamin" = 5)
- list_reagents = list("nutriment" = 6, "mannitol" = 5, "vitamin" = 1)
+ list_reagents = list("nutriment" = 6, "mannitol" = 6, "vitamin" = 5)
/obj/item/weapon/reagent_containers/food/snacks/burger/ghost
name = "ghost burger"
desc = "Too Spooky!"
alpha = 125
- bonus_reagents = list("nutriment" = 5, "vitamin" = 12)
+ list_reagents = list("nutriment" = 5, "vitamin" = 12)
/obj/item/weapon/reagent_containers/food/snacks/burger/red
name = "red burger"
desc = "Perfect for hiding the fact it's burnt to a crisp."
icon_state = "cburger"
color = "#DA0000FF"
- bonus_reagents = list("redcrayonpowder" = 10, "vitamin" = 5)
+ list_reagents = list("redcrayonpowder" = 10, "vitamin" = 5)
/obj/item/weapon/reagent_containers/food/snacks/burger/orange
name = "orange burger"
desc = "Contains 0% juice."
icon_state = "cburger"
color = "#FF9300FF"
- bonus_reagents = list("orangecrayonpowder" = 10, "vitamin" = 5)
+ list_reagents = list("orangecrayonpowder" = 10, "vitamin" = 5)
/obj/item/weapon/reagent_containers/food/snacks/burger/yellow
name = "yellow burger"
desc = "Bright to the last bite."
icon_state = "cburger"
color = "#FFF200FF"
- bonus_reagents = list("yellowcrayonpowder" = 10, "vitamin" = 5)
+ list_reagents = list("yellowcrayonpowder" = 10, "vitamin" = 5)
/obj/item/weapon/reagent_containers/food/snacks/burger/green
name = "green burger"
desc = "It's not tainted meat, it's painted meat!"
icon_state = "cburger"
color = "#A8E61DFF"
- bonus_reagents = list("greencrayonpowder" = 10, "vitamin" = 5)
+ list_reagents = list("greencrayonpowder" = 10, "vitamin" = 5)
/obj/item/weapon/reagent_containers/food/snacks/burger/blue
name = "blue burger"
desc = "Is this blue rare?"
icon_state = "cburger"
color = "#00B7EFFF"
- bonus_reagents = list("bluecrayonpowder" = 10, "vitamin" = 5)
+ list_reagents = list("bluecrayonpowder" = 10, "vitamin" = 5)
/obj/item/weapon/reagent_containers/food/snacks/burger/purple
name = "purple burger"
desc = "Regal and low class at the same time."
icon_state = "cburger"
color = "#DA00FFFF"
- bonus_reagents = list("purplecrayonpowder" = 10, "vitamin" = 5)
+ list_reagents = list("purplecrayonpowder" = 10, "vitamin" = 5)
/obj/item/weapon/reagent_containers/food/snacks/burger/spell
name = "spell burger"
desc = "This is absolutely Ei Nath."
icon_state = "spellburger"
- bonus_reagents = list("nutriment" = 6, "vitamin" = 10)
+ list_reagents = list("nutriment" = 6, "vitamin" = 10)
/obj/item/weapon/reagent_containers/food/snacks/burger/bigbite
name = "big bite burger"
desc = "Forget the Big Mac. THIS is the future!"
icon_state = "bigbiteburger"
- bonus_reagents = list("vitamin" = 6)
- list_reagents = list("nutriment" = 10, "vitamin" = 2)
+ list_reagents = list("vitamin" = 6)
w_class = 3
/obj/item/weapon/reagent_containers/food/snacks/burger/jelly
@@ -150,32 +138,15 @@
icon_state = "jellyburger"
/obj/item/weapon/reagent_containers/food/snacks/burger/jelly/slime
- bonus_reagents = list("slimejelly" = 5, "vitamin" = 5)
- list_reagents = list("nutriment" = 6, "slimejelly" = 5, "vitamin" = 1)
+ list_reagents = list("slimejelly" = 5, "vitamin" = 5)
/obj/item/weapon/reagent_containers/food/snacks/burger/jelly/cherry
- bonus_reagents = list("cherryjelly" = 5, "vitamin" = 5)
- list_reagents = list("nutriment" = 6, "cherryjelly" = 5, "vitamin" = 1)
+ list_reagents = list("cherryjelly" = 5, "vitamin" = 5)
/obj/item/weapon/reagent_containers/food/snacks/burger/superbite
name = "super bite burger"
desc = "This is a mountain of a burger. FOOD!"
icon_state = "superbiteburger"
- bonus_reagents = list("vitamin" = 10)
- list_reagents = list("nutriment" = 40, "vitamin" = 5)
+ list_reagents = list("vitamin" = 10)
w_class = 3
- bitesize = 7
- volume = 100
-
-/obj/item/weapon/reagent_containers/food/snacks/burger/fivealarm
- name = "five alarm burger"
- desc = "HOT! HOT!"
- icon_state = "fivealarmburger"
- bonus_reagents = list("nutriment" = 2, "vitamin" = 5)
- list_reagents = list("nutriment" = 6, "capsaicin" = 5, "condensedcapsaicin" = 5, "vitamin" = 1)
-
-/obj/item/weapon/reagent_containers/food/snacks/burger/rat
- name = "rat burger"
- desc = "Pretty much what you'd expect..."
- icon_state = "ratburger"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
\ No newline at end of file
+ volume = 80
diff --git a/code/modules/food&drinks/food/snacks_cake.dm b/code/modules/food&drinks/food/snacks_cake.dm
index 0d28706099616..d8a65be515bde 100644
--- a/code/modules/food&drinks/food/snacks_cake.dm
+++ b/code/modules/food&drinks/food/snacks_cake.dm
@@ -1,31 +1,25 @@
/obj/item/weapon/reagent_containers/food/snacks/store/cake
- icon = 'icons/obj/food/piecake.dmi'
slice_path = /obj/item/weapon/reagent_containers/food/snacks/cakeslice/plain
slices_num = 5
bitesize = 3
- volume = 80
- list_reagents = list("nutriment" = 20, "vitamin" = 5)
/obj/item/weapon/reagent_containers/food/snacks/cakeslice
- icon = 'icons/obj/food/piecake.dmi'
trash = /obj/item/trash/plate
- list_reagents = list("nutriment" = 4, "vitamin" = 1)
- customfoodfilling = 0 //to avoid infinite cake-ception
+ bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/store/cake/plain
name = "vanilla cake"
desc = "A plain cake, not a lie."
icon_state = "plaincake"
custom_food_type = /obj/item/weapon/reagent_containers/food/snacks/customizable/cake
- bonus_reagents = list("nutriment" = 10, "vitamin" = 2)
+ list_reagents = list("nutriment" = 10, "vitamin" = 2)
/obj/item/weapon/reagent_containers/food/snacks/cakeslice/plain
name = "vanilla cake slice"
desc = "Just a slice of cake, it is enough for everyone."
icon_state = "plaincake_slice"
filling_color = "#FFD700"
- customfoodfilling = 1
/obj/item/weapon/reagent_containers/food/snacks/store/cake/carrot
name = "carrot cake"
@@ -33,15 +27,13 @@
icon_state = "carrotcake"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/cakeslice/carrot
slices_num = 5
- bonus_reagents = list("nutriment" = 3, "oculine" = 5, "vitamin" = 10)
- list_reagents = list("nutriment" = 20, "oculine" = 10, "vitamin" = 5)
+ list_reagents = list("nutriment" = 3, "oculine" = 5, "vitamin" = 10)
/obj/item/weapon/reagent_containers/food/snacks/cakeslice/carrot
name = "carrot cake slice"
desc = "Carrotty slice of Carrot Cake, carrots are good for your eyes! Also not a lie."
icon_state = "carrotcake_slice"
filling_color = "#FFA500"
- list_reagents = list("nutriment" = 4, "oculine" = 2, "vitamin" = 1)
/obj/item/weapon/reagent_containers/food/snacks/store/cake/brain
@@ -50,8 +42,7 @@
icon_state = "braincake"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/cakeslice/brain
slices_num = 5
- bonus_reagents = list("nutriment" = 5, "mannitol" = 10, "vitamin" = 10)
- list_reagents = list("nutriment" = 20, "mannitol" = 10, "vitamin" = 5)
+ list_reagents = list("nutriment" = 5, "mannitol" = 10, "vitamin" = 10)
/obj/item/weapon/reagent_containers/food/snacks/cakeslice/brain
@@ -59,7 +50,6 @@
desc = "Lemme tell you something about prions. THEY'RE DELICIOUS."
icon_state = "braincakeslice"
filling_color = "#FF69B4"
- list_reagents = list("nutriment" = 4, "mannitol" = 2, "vitamin" = 1)
/obj/item/weapon/reagent_containers/food/snacks/store/cake/cheese
name = "cheese cake"
@@ -67,7 +57,7 @@
icon_state = "cheesecake"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/cakeslice/cheese
slices_num = 5
- bonus_reagents = list("vitamin" = 10)
+ list_reagents = list("vitamin" = 10)
/obj/item/weapon/reagent_containers/food/snacks/cakeslice/cheese
@@ -83,7 +73,7 @@
icon_state = "orangecake"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/cakeslice/orange
slices_num = 5
- bonus_reagents = list("nutriment" = 3, "vitamin" = 10)
+ list_reagents = list("nutriment" = 3, "vitamin" = 10)
/obj/item/weapon/reagent_containers/food/snacks/cakeslice/orange
name = "orange cake slice"
@@ -97,7 +87,7 @@
icon_state = "limecake"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/cakeslice/lime
slices_num = 5
- bonus_reagents = list("nutriment" = 3, "vitamin" = 10)
+ list_reagents = list("nutriment" = 3, "vitamin" = 10)
/obj/item/weapon/reagent_containers/food/snacks/cakeslice/lime
name = "lime cake slice"
@@ -112,7 +102,7 @@
icon_state = "lemoncake"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/cakeslice/lemon
slices_num = 5
- bonus_reagents = list("nutriment" = 3, "vitamin" = 10)
+ list_reagents = list("nutriment" = 3, "vitamin" = 10)
/obj/item/weapon/reagent_containers/food/snacks/cakeslice/lemon
@@ -128,7 +118,7 @@
icon_state = "chocolatecake"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/cakeslice/chocolate
slices_num = 5
- bonus_reagents = list("nutriment" = 3, "vitamin" = 10)
+ list_reagents = list("nutriment" = 3, "vitamin" = 10)
/obj/item/weapon/reagent_containers/food/snacks/cakeslice/chocolate
@@ -144,15 +134,13 @@
icon_state = "birthdaycake"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/cakeslice/birthday
slices_num = 5
- bonus_reagents = list("nutriment" = 7, "sprinkles" = 10, "vitamin" = 5)
- list_reagents = list("nutriment" = 20, "sprinkles" = 10, "vitamin" = 5)
+ list_reagents = list("nutriment" = 7, "sprinkles" = 10, "vitamin" = 5)
/obj/item/weapon/reagent_containers/food/snacks/cakeslice/birthday
name = "birthday cake slice"
desc = "A slice of your birthday."
icon_state = "birthdaycakeslice"
filling_color = "#DC143C"
- list_reagents = list("nutriment" = 4, "sprinkles" = 2, "vitamin" = 1)
/obj/item/weapon/reagent_containers/food/snacks/store/cake/apple
@@ -161,7 +149,7 @@
icon_state = "applecake"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/cakeslice/apple
slices_num = 5
- bonus_reagents = list("nutriment" = 3, "vitamin" = 10)
+ list_reagents = list("nutriment" = 3, "vitamin" = 10)
/obj/item/weapon/reagent_containers/food/snacks/cakeslice/apple
name = "apple cake slice"
@@ -179,23 +167,10 @@
desc = "A cake made of slimes. Probably not electrified."
icon_state = "slimecake"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/cakeslice/slimecake
- bonus_reagents = list("nutriment" = 1, "vitamin" = 3)
+ slices_num = 5
+ list_reagents = list("nutriment" = 1, "vitamin" = 3)
/obj/item/weapon/reagent_containers/food/snacks/cakeslice/slimecake
- name = "slime cake slice"
- desc = "A slice of slime cake."
+ name = "Slime cake slice"
icon_state = "slimecake_slice"
filling_color = "#00FFFF"
-
-/obj/item/weapon/reagent_containers/food/snacks/store/cake/pumpkinspice
- name = "pumpkin spice cake"
- desc = "A hollow cake with real pumpkin."
- icon_state = "pumpkinspicecake"
- slice_path = /obj/item/weapon/reagent_containers/food/snacks/cakeslice/pumpkinspice
- bonus_reagents = list("nutriment" = 3, "vitamin" = 5)
-
-/obj/item/weapon/reagent_containers/food/snacks/cakeslice/pumpkinspice
- name = "pumpkin spice cake slice"
- desc = "A spicy slice of pumpkin goodness."
- icon_state = "pumpkinspicecakeslice"
- filling_color = "#FFD700"
\ No newline at end of file
diff --git a/code/modules/food&drinks/food/snacks_egg.dm b/code/modules/food&drinks/food/snacks_egg.dm
index 23c80a6bf4bbc..8d9a585c2f85b 100644
--- a/code/modules/food&drinks/food/snacks_egg.dm
+++ b/code/modules/food&drinks/food/snacks_egg.dm
@@ -5,8 +5,7 @@
name = "chocolate egg"
desc = "Such, sweet, fattening food."
icon_state = "chocolateegg"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
- list_reagents = list("nutriment" = 4, "sugar" = 2, "cocoa" = 2)
+ list_reagents = list("nutriment" = 1, "vitamin" = 1)
filling_color = "#A0522D"
/obj/item/weapon/reagent_containers/food/snacks/egg
@@ -74,26 +73,23 @@
name = "fried egg"
desc = "A fried egg, with a touch of salt and pepper."
icon_state = "friedegg"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
+ list_reagents = list("nutriment" = 1, "vitamin" = 1)
bitesize = 1
filling_color = "#FFFFF0"
- list_reagents = list("nutriment" = 3)
/obj/item/weapon/reagent_containers/food/snacks/boiledegg
name = "boiled egg"
desc = "A hard boiled egg."
icon_state = "egg"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
+ list_reagents = list("nutriment" = 1, "vitamin" = 1)
filling_color = "#FFFFF0"
- list_reagents = list("nutriment" = 2, "vitamin" = 1)
/obj/item/weapon/reagent_containers/food/snacks/omelette //FUCK THIS
name = "omelette du fromage"
desc = "That's all you can say!"
icon_state = "omelette"
trash = /obj/item/trash/plate
- bonus_reagents = list("nutriment" = 1, "vitamin" = 2)
- list_reagents = list("nutriment" = 8, "vitamin" = 1)
+ list_reagents = list("nutriment" = 1, "vitamin" = 2)
bitesize = 1
w_class = 3
@@ -117,7 +113,6 @@
name = "eggs benedict"
desc = "There is only one egg on this, how rude."
icon_state = "benedict"
- bonus_reagents = list("vitamin" = 4)
+ list_reagents = list("vitamin" = 4)
trash = /obj/item/trash/plate
- w_class = 3
- list_reagents = list("nutriment" = 6, "vitamin" = 4)
\ No newline at end of file
+ w_class = 3
\ No newline at end of file
diff --git a/code/modules/food&drinks/food/snacks_meat.dm b/code/modules/food&drinks/food/snacks_meat.dm
index 30a12799e00e3..11db6f04b532d 100644
--- a/code/modules/food&drinks/food/snacks_meat.dm
+++ b/code/modules/food&drinks/food/snacks_meat.dm
@@ -8,16 +8,15 @@
desc = "A grifftastic sandwich that burns your tongue and then leaves it numb!"
icon_state = "cubancarp"
trash = /obj/item/trash/plate
- bonus_reagents = list("nutriment" = 1, "vitamin" = 4)
+ list_reagents = list("nutriment" = 1, "vitamin" = 4)
bitesize = 3
filling_color = "#CD853F"
- list_reagents = list("nutriment" = 6, "capsaicin" = 1)
/obj/item/weapon/reagent_containers/food/snacks/carpmeat
name = "carp fillet"
desc = "A fillet of spess carp meat."
icon_state = "fishfillet"
- list_reagents = list("nutriment" = 3, "carpotoxin" = 2, "vitamin" = 2)
+ list_reagents = list("nutriment" = 2, "carpotoxin" = 2, "vitamin" = 2)
bitesize = 6
filling_color = "#FA8072"
@@ -33,8 +32,7 @@
name = "fish fingers"
desc = "A finger of fish."
icon_state = "fishfingers"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 2)
- list_reagents = list("nutriment" = 4)
+ list_reagents = list("nutriment" = 1, "vitamin" = 2)
bitesize = 1
filling_color = "#CD853F"
@@ -42,8 +40,7 @@
name = "fish and chips"
desc = "I do say so myself chap."
icon_state = "fishandchips"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 2)
- list_reagents = list("nutriment" = 6)
+ list_reagents = list("nutriment" = 1, "vitamin" = 2)
filling_color = "#FA8072"
////////////////////////////////////////////MEATS AND ALIKE////////////////////////////////////////////
@@ -55,6 +52,13 @@
list_reagents = list("nutriment" = 2)
filling_color = "#F0E68C"
+/obj/item/weapon/reagent_containers/food/snacks/tendies
+ name = "Chicken Tendies"
+ desc = "Fills you up and gives you Good Boy Points."
+ icon_state = "tendies"
+ list_reagents = list("nutriment" = 5, "vitamin" = 2)
+ bitesize = 2
+
/obj/item/weapon/reagent_containers/food/snacks/spiderleg
name = "spider leg"
desc = "A still twitching leg of a giant spider... you don't really want to eat this, do you?"
@@ -68,16 +72,7 @@
desc = "Now you can feel like a real tourist vacationing in Ireland."
icon_state = "cornedbeef"
trash = /obj/item/trash/plate
- bonus_reagents = list("nutriment" = 1, "vitamin" = 4)
- list_reagents = list("nutriment" = 5)
-
-/obj/item/weapon/reagent_containers/food/snacks/bearsteak
- name = "Filet migrawr"
- desc = "Because eating bear wasn't manly enough."
- icon_state = "bearsteak"
- trash = /obj/item/trash/plate
- bonus_reagents = list("nutriment" = 2, "vitamin" = 6)
- list_reagents = list("nutriment" = 2, "vitamin" = 5, "manlydorf" = 5)
+ list_reagents = list("nutriment" = 1, "vitamin" = 4)
/obj/item/weapon/reagent_containers/food/snacks/faggot
name = "faggot"
@@ -91,33 +86,37 @@
desc = "A piece of mixed, long meat."
icon_state = "sausage"
filling_color = "#CD5C5C"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
- list_reagents = list("nutriment" = 6, "vitamin" = 1)
/obj/item/weapon/reagent_containers/food/snacks/sausage/New()
..()
eatverb = pick("bite","chew","nibble","deep throat","gobble","chomp")
+/obj/item/weapon/reagent_containers/food/snacks/wingfangchu
+ name = "wing fang chu"
+ desc = "A savory dish of alien wing wang in soy."
+ icon_state = "wingfangchu"
+ trash = /obj/item/weapon/reagent_containers/glass/bowl
+ list_reagents = list("nutriment" = 1, "vitamin" = 2)
+
/obj/item/weapon/reagent_containers/food/snacks/kebab
trash = /obj/item/stack/rods
icon_state = "kebab"
w_class = 3
- list_reagents = list("nutriment" = 8)
/obj/item/weapon/reagent_containers/food/snacks/kebab/human
name = "human-kebab"
desc = "A human meat, on a stick."
- bonus_reagents = list("nutriment" = 1, "vitamin" = 6)
+ list_reagents = list("nutriment" = 1, "vitamin" = 6)
/obj/item/weapon/reagent_containers/food/snacks/kebab/monkey
name = "meat-kebab"
desc = "Delicious meat, on a stick."
- bonus_reagents = list("nutriment" = 1, "vitamin" = 2)
+ list_reagents = list("nutriment" = 1, "vitamin" = 2)
/obj/item/weapon/reagent_containers/food/snacks/kebab/tofu
name = "tofu-kebab"
desc = "Vegan meat, on a stick."
- bonus_reagents = list("nutriment" = 1)
+ list_reagents = list("nutriment" = 1)
/obj/item/weapon/reagent_containers/food/snacks/monkeycube
name = "monkey cube"
@@ -161,18 +160,16 @@
name = "enchiladas"
desc = "Viva La Mexico!"
icon_state = "enchiladas"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 2)
+ list_reagents = list("nutriment" = 1, "vitamin" = 2)
bitesize = 4
filling_color = "#FFA07A"
- list_reagents = list("nutriment" = 8, "capsaicin" = 6)
/obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat
name = "stewed soy meat"
desc = "Even non-vegetarians will LOVE this!"
icon_state = "stewedsoymeat"
trash = /obj/item/trash/plate
- bonus_reagents = list("nutriment" = 1)
- list_reagents = list("nutriment" = 8)
+ list_reagents = list("nutriment" = 1)
filling_color = "#D2691E"
/obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat/New()
@@ -184,8 +181,7 @@
desc = "A giant spider's leg that's still twitching after being cooked. Gross!"
icon_state = "spiderlegcooked"
trash = /obj/item/trash/plate
- bonus_reagents = list("nutriment" = 1, "capsaicin" = 2, "vitamin" = 2)
- list_reagents = list("nutriment" = 3, "capsaicin" = 2)
+ list_reagents = list("nutriment" = 1, "capsaicin" = 2, "vitamin" = 2)
filling_color = "#000000"
/obj/item/weapon/reagent_containers/food/snacks/spidereggsham
@@ -193,8 +189,7 @@
desc = "Would you eat them on a train? Would you eat them on a plane? Would you eat them on a state of the art corporate deathtrap floating through space?"
icon_state = "spidereggsham"
trash = /obj/item/trash/plate
- bonus_reagents = list("nutriment" = 1, "vitamin" = 3)
- list_reagents = list("nutriment" = 6)
+ list_reagents = list("nutriment" = 1, "vitamin" = 3)
bitesize = 4
filling_color = "#7FFF00"
@@ -202,6 +197,5 @@
name = "carp sashimi"
desc = "Celebrate surviving attack from hostile alien lifeforms by hospitalising yourself."
icon_state = "sashimi"
- bonus_reagents = list("nutriment" = 1, "capsaicin" = 4, "vitamin" = 4)
- list_reagents = list("nutriment" = 6, "capsaicin" = 5)
- filling_color = "#FA8072"
+ list_reagents = list("nutriment" = 1, "capsaicin" = 4, "vitamin" = 4)
+ filling_color = "#FA8072"
\ No newline at end of file
diff --git a/code/modules/food&drinks/food/snacks_other.dm b/code/modules/food&drinks/food/snacks_other.dm
index f11f863aad2eb..5abc827d9548d 100644
--- a/code/modules/food&drinks/food/snacks_other.dm
+++ b/code/modules/food&drinks/food/snacks_other.dm
@@ -1,7 +1,7 @@
////////////////////////////////////////////OTHER////////////////////////////////////////////
-/obj/item/weapon/reagent_containers/food/snacks/store/cheesewheel
+/obj/item/weapon/reagent_containers/food/snacks/cheesewheel
name = "cheese wheel"
desc = "A big wheel of delcious Cheddar."
icon_state = "cheesewheel"
@@ -15,7 +15,6 @@
desc = "A wedge of delicious Cheddar. The cheese wheel it was cut from can't have gone far."
icon_state = "cheesewedge"
filling_color = "#FFD700"
- list_reagents = list("nutriment" = 3, "vitamin" = 1)
/obj/item/weapon/reagent_containers/food/snacks/watermelonslice
name = "watermelon slice"
@@ -79,8 +78,7 @@
name = "loaded baked potato"
desc = "Totally baked."
icon_state = "loadedbakedpotato"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 2)
- list_reagents = list("nutriment" = 6)
+ list_reagents = list("nutriment" = 1, "vitamin" = 2)
filling_color = "#D2B48C"
/obj/item/weapon/reagent_containers/food/snacks/fries
@@ -104,8 +102,7 @@
desc = "Fries. Covered in cheese. Duh."
icon_state = "cheesyfries"
trash = /obj/item/trash/plate
- bonus_reagents = list("nutriment" = 1, "vitamin" = 2)
- list_reagents = list("nutriment" = 6)
+ list_reagents = list("nutriment" = 1, "vitamin" = 2)
filling_color = "#FFD700"
/obj/item/weapon/reagent_containers/food/snacks/badrecipe
@@ -128,8 +125,7 @@
desc = "An apple coated in sugary sweetness."
icon_state = "candiedapple"
bitesize = 3
- bonus_reagents = list("nutriment" = 2, "sugar" = 3)
- list_reagents = list("nutriment" = 3, "sugar" = 2)
+ list_reagents = list("nutriment" = 2, "sugar" = 3)
filling_color = "#FF4500"
/obj/item/weapon/reagent_containers/food/snacks/mint
@@ -141,20 +137,18 @@
list_reagents = list("minttoxin" = 1)
filling_color = "#800000"
-/obj/item/weapon/reagent_containers/food/snacks/eggwrap
+/obj/item/weapon/reagent_containers/food/snacks/wrap
name = "egg wrap"
desc = "The precursor to Pigs in a Blanket."
- icon_state = "eggwrap"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 3)
- list_reagents = list("nutriment" = 5)
+ icon_state = "wrap"
+ list_reagents = list("nutriment" = 1, "vitamin" = 3)
filling_color = "#F0E68C"
/obj/item/weapon/reagent_containers/food/snacks/beans
name = "tin of beans"
desc = "Musical fruit in a slightly less musical container."
icon_state = "beans"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
- list_reagents = list("nutriment" = 10)
+ list_reagents = list("nutriment" = 1, "vitamin" = 1)
filling_color = "#B22222"
/obj/item/weapon/reagent_containers/food/snacks/spidereggs
@@ -168,16 +162,14 @@
name = "chocolate coin"
desc = "A completely edible but nonflippable festive coin."
icon_state = "chococoin"
- bonus_reagents = list("nutriment" = 1, "sugar" = 1)
- list_reagents = list("nutriment" = 3, "cocoa" = 1)
+ list_reagents = list("nutriment" = 1, "sugar" = 1)
filling_color = "#A0522D"
/obj/item/weapon/reagent_containers/food/snacks/chocoorange
name = "chocolate orange"
desc = "A festive chocolate orange"
icon_state = "chocoorange"
- bonus_reagents = list("nutriment" = 1, "sugar" = 1)
- list_reagents = list("nutriment" = 3, "sugar" = 1)
+ list_reagents = list("nutriment" = 1, "sugar" = 1)
filling_color = "#A0522D"
/obj/item/weapon/reagent_containers/food/snacks/eggplantparm
@@ -185,129 +177,5 @@
desc = "The only good recipe for eggplant."
icon_state = "eggplantparm"
trash = /obj/item/trash/plate
- bonus_reagents = list("nutriment" = 1, "vitamin" = 3)
- list_reagents = list("nutriment" = 6, "vitamin" = 2)
- filling_color = "#BA55D3"
-
-/obj/item/weapon/reagent_containers/food/snacks/tortilla
- name = "tortilla"
- desc = "The base for all your burritos."
- icon = 'icons/obj/food/food_ingredients.dmi'
- icon_state = "tortilla"
- list_reagents = list("nutriment" = 3, "vitamin" = 1)
- filling_color = "#FFEFD5"
-
-/obj/item/weapon/reagent_containers/food/snacks/burrito
- name = "burrito"
- desc = "Tortilla wrapped goodness."
- icon_state = "burrito"
- bonus_reagents = list("nutriment" = 2, "vitamin" = 2)
- list_reagents = list("nutriment" = 4, "vitamin" = 1)
- filling_color = "#FFEFD5"
-
-/obj/item/weapon/reagent_containers/food/snacks/cheesyburrito
- name = "cheesy burrito"
- desc = "It's a burrito filled with cheese."
- icon_state = "cheesyburrito"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 2)
- list_reagents = list("nutriment" = 4, "vitamin" = 2)
- filling_color = "#FFD800"
-
-/obj/item/weapon/reagent_containers/food/snacks/carneburrito
- name = "carne asada burrito"
- desc = "The best burrito for meat lovers."
- icon_state = "carneburrito"
- bonus_reagents = list("nutriment" = 2, "vitamin" = 1)
- list_reagents = list("nutriment" = 5, "vitamin" = 1)
- filling_color = "#A0522D"
-
-/obj/item/weapon/reagent_containers/food/snacks/fuegoburrito
- name = "fuego plasma burrito"
- desc = "A super spicy burrito."
- icon_state = "fuegoburrito"
- bonus_reagents = list("nutriment" = 2, "vitamin" = 3)
- list_reagents = list("nutriment" = 4, "capsaicin" = 5, "vitamin" = 3)
- filling_color = "#FF2000"
-
-/obj/item/weapon/reagent_containers/food/snacks/yakiimo
- name = "yaki imo"
- desc = "Made with roasted sweet potatoes!"
- icon_state = "yakiimo"
- trash = /obj/item/trash/plate
- list_reagents = list("nutriment" = 5, "vitamin" = 4)
- filling_color = "#8B1105"
-
-/obj/item/weapon/reagent_containers/food/snacks/roastparsnip
- name = "roast parsnip"
- desc = "Sweet and crunchy."
- icon_state = "roastparsnip"
- trash = /obj/item/trash/plate
- list_reagents = list("nutriment" = 3, "vitamin" = 4)
- filling_color = "#FF5500"
-
-/obj/item/weapon/reagent_containers/food/snacks/melonfruitbowl
- name = "melon fruit bowl"
- desc = "For people who wants edible fruit bowls."
- icon_state = "melonfruitbowl"
- bonus_reagents = list("nutriment" = 2, "vitamin" = 2)
- list_reagents = list("nutriment" = 6, "vitamin" = 4)
- filling_color = "#FF5500"
- w_class = 3
-
-/obj/item/weapon/reagent_containers/food/snacks/spacefreezy
- name = "space freezy"
- desc = "The best icecream in space."
- icon_state = "spacefreezy"
- bonus_reagents = list("nutriment" = 2, "vitamin" = 2)
- list_reagents = list("nutriment" = 6, "bluecherryjelly" = 5, "vitamin" = 4)
- filling_color = "#87CEFA"
-
-/obj/item/weapon/reagent_containers/food/snacks/sundae
- name = "sundae"
- desc = "A classic dessert."
- icon_state = "sundae"
- bonus_reagents = list("nutriment" = 2, "vitamin" = 1)
- list_reagents = list("nutriment" = 6, "banana" = 5, "vitamin" = 2)
- filling_color = "#FFFACD"
-
-/obj/item/weapon/reagent_containers/food/snacks/honkdae
- name = "honkdae"
- desc = "The clown's favorite dessert."
- icon_state = "honkdae"
- bonus_reagents = list("nutriment" = 2, "vitamin" = 2)
- list_reagents = list("nutriment" = 6, "banana" = 10, "vitamin" = 4)
- filling_color = "#FFFACD"
-
-/obj/item/weapon/reagent_containers/food/snacks/nachos
- name = "nachos"
- desc = "Chips from Space Mexico."
- icon_state = "nachos"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
- list_reagents = list("nutriment" = 6, "vitamin" = 2)
- filling_color = "#F4A460"
-
-/obj/item/weapon/reagent_containers/food/snacks/cheesynachos
- name = "cheesy nachos"
- desc = "The delicious combination of nachos and melting cheese."
- icon_state = "cheesynachos"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 2)
- list_reagents = list("nutriment" = 6, "vitamin" = 3)
- filling_color = "#FFD700"
-
-/obj/item/weapon/reagent_containers/food/snacks/cubannachos
- name = "cuban nachos"
- desc = "That's some dangerously spicy nachos."
- icon_state = "cubannachos"
- bonus_reagents = list("nutriment" = 2, "vitamin" = 3)
- list_reagents = list("nutriment" = 7, "capsaicin" = 8, "vitamin" = 4)
- filling_color = "#DC143C"
-
-/obj/item/weapon/reagent_containers/food/snacks/melonkeg
- name = "melon keg"
- desc = "Who knew vodka was a fruit?"
- icon_state = "melonkeg"
- bonus_reagents = list("nutriment" = 3, "vitamin" = 3)
- list_reagents = list("nutriment" = 9, "vodka" = 15, "vitamin" = 4)
- filling_color = "#FFD700"
- volume = 80
- bitesize = 5
\ No newline at end of file
+ list_reagents = list("nutriment" = 1, "vitamin" = 3)
+ filling_color = "#BA55D3"
\ No newline at end of file
diff --git a/code/modules/food&drinks/food/snacks_pastry.dm b/code/modules/food&drinks/food/snacks_pastry.dm
index 1af2b47ad8ab2..20171e5e471d0 100644
--- a/code/modules/food&drinks/food/snacks_pastry.dm
+++ b/code/modules/food&drinks/food/snacks_pastry.dm
@@ -7,10 +7,8 @@
desc = "Goes great with Robust Coffee."
icon_state = "donut1"
bitesize = 5
- bonus_reagents = list("sugar" = 1)
- list_reagents = list("nutriment" = 3, "sugar" = 2)
+ list_reagents = list("sugar" = 1)
var/extra_reagent = null
- filling_color = "#D2691E"
/obj/item/weapon/reagent_containers/food/snacks/donut/New()
..()
@@ -18,8 +16,6 @@
icon_state = "donut2"
name = "frosted donut"
reagents.add_reagent("sprinkles", 2)
- bonus_reagents = list("sprinkles" = 2, "sugar" = 1)
- filling_color = "#FF69B4"
/obj/item/weapon/reagent_containers/food/snacks/donut/chaos
name = "chaos donut"
@@ -30,31 +26,25 @@
..()
extra_reagent = pick("nutriment", "capsaicin", "frostoil", "krokodil", "plasma", "cocoa", "slimejelly", "banana", "berryjuice", "omnizine")
reagents.add_reagent("[extra_reagent]", 3)
- bonus_reagents = list("[extra_reagent]" = 3, "sugar" = 1)
if(prob(30))
icon_state = "donut2"
name = "frosted chaos donut"
reagents.add_reagent("sprinkles", 2)
- bonus_reagents = list("sprinkles" = 2, "[extra_reagent]" = 3, "sugar" = 1)
- filling_color = "#FF69B4"
/obj/item/weapon/reagent_containers/food/snacks/donut/jelly
name = "jelly donut"
desc = "You jelly?"
icon_state = "jdonut1"
- bonus_reagents = list("sugar" = 1, "vitamin" = 1)
+ list_reagents = list("sugar" = 1, "vitamin" = 1)
extra_reagent = "berryjuice"
/obj/item/weapon/reagent_containers/food/snacks/donut/jelly/New()
..()
- if(extra_reagent)
- reagents.add_reagent("[extra_reagent]", 3)
+ reagents.add_reagent("[extra_reagent]", 5)
if(prob(30))
icon_state = "jdonut2"
name = "frosted jelly Donut"
reagents.add_reagent("sprinkles", 2)
- bonus_reagents = list("sprinkles" = 2, "sugar" = 1)
- filling_color = "#FF69B4"
/obj/item/weapon/reagent_containers/food/snacks/donut/jelly/slimejelly
name = "jelly donut"
@@ -74,9 +64,7 @@
name = "muffin"
desc = "A delicious and spongy little cake."
icon_state = "muffin"
- bonus_reagents = list("vitamin" = 1)
- list_reagents = list("nutriment" = 6)
- filling_color = "#F4A460"
+ list_reagents = list("vitamin" = 1)
/obj/item/weapon/reagent_containers/food/snacks/muffin/berry
name = "berry muffin"
@@ -93,9 +81,8 @@
name = "chawanmushi"
desc = "A legendary egg custard that makes friends out of enemies. Probably too hot for a cat to eat."
icon_state = "chawanmushi"
- bonus_reagents = list("vitamin" = 1)
- list_reagents = list("nutriment" = 5)
- filling_color = "#FFE4E1"
+ trash = /obj/item/weapon/reagent_containers/glass/bowl
+ list_reagents = list("vitamin" = 1)
////////////////////////////////////////////WAFFLES////////////////////////////////////////////
@@ -104,8 +91,7 @@
desc = "Mmm, waffles."
icon_state = "waffles"
trash = /obj/item/trash/waffles
- bonus_reagents = list("vitamin" = 1)
- list_reagents = list("nutriment" = 8, "vitamin" = 1)
+ list_reagents = list("vitamin" = 1)
filling_color = "#D2691E"
/obj/item/weapon/reagent_containers/food/snacks/soylentgreen
@@ -113,8 +99,7 @@
desc = "Not made of people. Honest." //Totally people.
icon_state = "soylent_green"
trash = /obj/item/trash/waffles
- bonus_reagents = list("vitamin" = 1)
- list_reagents = list("nutriment" = 10, "vitamin" = 1)
+ list_reagents = list("vitamin" = 1)
filling_color = "#9ACD32"
/obj/item/weapon/reagent_containers/food/snacks/soylenviridians
@@ -122,8 +107,7 @@
desc = "Not made of people. Honest." //Actually honest for once.
icon_state = "soylent_yellow"
trash = /obj/item/trash/waffles
- bonus_reagents = list("vitamin" = 1)
- list_reagents = list("nutriment" = 10, "vitamin" = 1)
+ list_reagents = list("vitamin" = 1)
filling_color = "#9ACD32"
/obj/item/weapon/reagent_containers/food/snacks/rofflewaffles
@@ -132,8 +116,7 @@
icon_state = "rofflewaffles"
trash = /obj/item/trash/waffles
bitesize = 4
- bonus_reagents = list("vitamin" = 2)
- list_reagents = list("nutriment" = 8, "mushroomhallucinogen" = 2, "vitamin" = 2)
+ list_reagents = list("vitamin" = 2)
filling_color = "#00BFFF"
////////////////////////////////////////////OTHER////////////////////////////////////////////
@@ -143,7 +126,7 @@
desc = "COOKIE!!!"
icon_state = "COOKIE!!!"
bitesize = 1
- bonus_reagents = list("nutriment" = 1)
+ list_reagents = list("nutriment" = 1)
filling_color = "#F0E68C"
/obj/item/weapon/reagent_containers/food/snacks/donkpocket
@@ -155,33 +138,29 @@
filling_color = "#CD853F"
/obj/item/weapon/reagent_containers/food/snacks/donkpocket/warm
- name = "warm Donk-pocket"
+ name = "\improper Warm Donk-pocket"
desc = "The heated food of choice for the seasoned traitor."
- bonus_reagents = list("omnizine" = 3)
- list_reagents = list("nutriment" = 4, "omnizine" = 3)
+ list_reagents = list("omnizine" = 4)
/obj/item/weapon/reagent_containers/food/snacks/fortunecookie
name = "fortune cookie"
desc = "A true prophecy in each cookie!"
icon_state = "fortune_cookie"
- bonus_reagents = list("nutriment" = 2)
- list_reagents = list("nutriment" = 3)
+ list_reagents = list("nutriment" = 2)
filling_color = "#F4A460"
/obj/item/weapon/reagent_containers/food/snacks/poppypretzel
name = "poppy pretzel"
desc = "It's all twisted up!"
icon_state = "poppypretzel"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 2)
- list_reagents = list("nutriment" = 5)
+ list_reagents = list("nutriment" = 1, "vitamin" = 2)
filling_color = "#F0E68C"
/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit
name = "plump helmet biscuit"
desc = "This is a finely-prepared plump helmet biscuit. The ingredients are exceptionally minced plump helmet, and well-minced dwarven wheat flour."
icon_state = "phelmbiscuit"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
- list_reagents = list("nutriment" = 5)
+ list_reagents = list("nutriment" = 1, "vitamin" = 1)
filling_color = "#F0E68C"
/obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit/New()
@@ -190,14 +169,12 @@
name = "exceptional plump helmet biscuit"
desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!"
reagents.add_reagent("omnizine", 5)
- bonus_reagents = list("omnizine" = 5, "nutriment" = 1, "vitamin" = 1)
/obj/item/weapon/reagent_containers/food/snacks/cracker
name = "cracker"
desc = "It's a salted cracker."
icon_state = "cracker"
bitesize = 1
- bonus_reagents = list("nutriment" = 1)
list_reagents = list("nutriment" = 1)
filling_color = "#F0E68C"
@@ -206,62 +183,26 @@
desc = "Fresh footlong ready to go down on."
icon_state = "hotdog"
bitesize = 3
- bonus_reagents = list("nutriment" = 1, "vitamin" = 3)
- list_reagents = list("nutriment" = 6, "ketchup" = 3, "vitamin" = 3)
+ list_reagents = list("nutriment" = 1, "vitamin" = 3)
filling_color = "#8B0000"
/obj/item/weapon/reagent_containers/food/snacks/meatbun
name = "meat bun"
desc = "Has the potential to not be Dog."
icon_state = "meatbun"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 2)
- list_reagents = list("nutriment" = 6, "vitamin" = 2)
+ list_reagents = list("nutriment" = 1, "vitamin" = 2)
filling_color = "#8B0000"
/obj/item/weapon/reagent_containers/food/snacks/sugarcookie
name = "sugar cookie"
desc = "Just like your little sister used to make."
icon_state = "sugarcookie"
- bonus_reagents = list("nutriment" = 1, "sugar" = 3)
- list_reagents = list("nutriment" = 3, "sugar" = 3)
+ list_reagents = list("nutriment" = 1, "sugar" = 3)
filling_color = "#CD853F"
/obj/item/weapon/reagent_containers/food/snacks/chococornet
name = "chocolate cornet"
desc = "Which side's the head, the fat end or the thin end?"
icon_state = "chococornet"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
- list_reagents = list("nutriment" = 5, "vitamin" = 1)
+ list_reagents = list("nutriment" = 1, "vitamin" = 1)
filling_color = "#FFE4C4"
-
-/obj/item/weapon/reagent_containers/food/snacks/oatmealcookie
- name = "oatmeal cookie"
- desc = "The best of both cookie and oat"
- icon_state = "oatmealcookie"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
- list_reagents = list("nutriment" = 5, "vitamin" = 1)
- filling_color = "#D2691E"
-
-/obj/item/weapon/reagent_containers/food/snacks/raisincookie
- name = "raisin cookie"
- desc = "Why would you put raisins on a cookie?"
- icon_state = "raisincookie"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
- list_reagents = list("nutriment" = 5, "vitamin" = 1)
- filling_color = "#F0E68C"
-
-/obj/item/weapon/reagent_containers/food/snacks/cherrycupcake
- name = "cherry cupcake"
- desc = "A sweet cupcake with cherry bits."
- icon_state = "cherrycupcake"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
- list_reagents = list("nutriment" = 5, "vitamin" = 1)
- filling_color = "#F0E68C"
-
-/obj/item/weapon/reagent_containers/food/snacks/bluecherrycupcake
- name = "blue cherry cupcake"
- desc = "Blue cherries inside a delicious cupcake"
- icon_state = "bluecherrycupcake"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 3)
- list_reagents = list("nutriment" = 5, "vitamin" = 1)
- filling_color = "#F0E68C"
diff --git a/code/modules/food&drinks/food/snacks_pie.dm b/code/modules/food&drinks/food/snacks_pie.dm
index e4fe6700f6790..1c4547d3f26fb 100644
--- a/code/modules/food&drinks/food/snacks_pie.dm
+++ b/code/modules/food&drinks/food/snacks_pie.dm
@@ -1,26 +1,22 @@
/obj/item/weapon/reagent_containers/food/snacks/pie
- icon = 'icons/obj/food/piecake.dmi'
trash = /obj/item/trash/plate
bitesize = 3
w_class = 3
- volume = 80
- list_reagents = list("nutriment" = 10, "vitamin" = 2)
/obj/item/weapon/reagent_containers/food/snacks/pie/plain
name = "plain pie"
desc = "A simple pie, still delicious."
icon_state = "pie"
custom_food_type = /obj/item/weapon/reagent_containers/food/snacks/customizable/pie
- bonus_reagents = list("nutriment" = 8, "vitamin" = 1)
+ list_reagents = list("nutriment" = 8, "vitamin" = 1)
/obj/item/weapon/reagent_containers/food/snacks/pie/cream
name = "banana cream pie"
desc = "Just like back home, on clown planet! HONK!"
icon_state = "pie"
trash = /obj/item/trash/plate
- bonus_reagents = list("nutriment" = 2, "vitamin" = 2)
- list_reagents = list("nutriment" = 6, "banana" = 5, "vitamin" = 2)
+ list_reagents = list("nutriment" = 2, "vitamin" = 2)
/obj/item/weapon/reagent_containers/food/snacks/pie/cream/throw_impact(atom/hit_atom)
..()
@@ -33,28 +29,22 @@
name = "berry clafoutis"
desc = "No black birds, this is a good sign."
icon_state = "berryclafoutis"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 2)
- list_reagents = list("nutriment" = 10, "berryjuice" = 5, "vitamin" = 2)
+ list_reagents = list("nutriment" = 1, "vitamin" = 2)
-/obj/item/weapon/reagent_containers/food/snacks/pie/bearypie
- name = "beary pie"
- desc = "No brown bears, this is a good sign."
- icon_state = "bearypie"
- bonus_reagents = list("nutriment" = 2, "vitamin" = 3)
- list_reagents = list("nutriment" = 2, "vitamin" = 3)
/obj/item/weapon/reagent_containers/food/snacks/pie/meatpie
name = "meat-pie"
icon_state = "meatpie"
desc = "An old barber recipe, very delicious!"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 5)
+ list_reagents = list("nutriment" = 1, "vitamin" = 5)
/obj/item/weapon/reagent_containers/food/snacks/pie/tofupie
name = "tofu-pie"
icon_state = "meatpie"
desc = "A delicious tofu pie."
- bonus_reagents = list("nutriment" = 1, "vitamin" = 2)
+ list_reagents = list("nutriment" = 1, "vitamin" = 2)
+
/obj/item/weapon/reagent_containers/food/snacks/pie/amanita_pie
@@ -62,15 +52,14 @@
desc = "Sweet and tasty poison pie."
icon_state = "amanita_pie"
bitesize = 4
- bonus_reagents = list("nutriment" = 1, "vitamin" = 4)
- list_reagents = list("nutriment" = 6, "amatoxin" = 3, "mushroomhallucinogen" = 1, "vitamin" = 4)
+ list_reagents = list("nutriment" = 1, "vitamin" = 4)
/obj/item/weapon/reagent_containers/food/snacks/pie/plump_pie
name = "plump pie"
desc = "I bet you love stuff made out of plump helmets!"
icon_state = "plump_pie"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 4)
+ list_reagents = list("nutriment" = 1, "vitamin" = 4)
/obj/item/weapon/reagent_containers/food/snacks/pie/plump_pie/New()
..()
@@ -78,7 +67,6 @@
name = "exceptional plump pie"
desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump pie!"
reagents.add_reagent("omnizine", 5)
- bonus_reagents = list("nutriment" = 1, "omnizine" = 5, "vitamin" = 4)
/obj/item/weapon/reagent_containers/food/snacks/pie/xemeatpie
@@ -86,14 +74,15 @@
icon_state = "xenomeatpie"
desc = "A delicious meatpie. Probably heretical."
trash = /obj/item/trash/plate
- bonus_reagents = list("nutriment" = 1, "vitamin" = 5)
+ list_reagents = list("nutriment" = 1, "vitamin" = 5)
+
/obj/item/weapon/reagent_containers/food/snacks/pie/applepie
name = "apple pie"
desc = "A pie containing sweet sweet love...or apple."
icon_state = "applepie"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 3)
+ list_reagents = list("nutriment" = 1, "vitamin" = 3)
@@ -101,69 +90,25 @@
name = "cherry pie"
desc = "Taste so good, make a grown man cry."
icon_state = "cherrypie"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 2)
+ list_reagents = list("nutriment" = 1, "vitamin" = 2)
-/obj/item/weapon/reagent_containers/food/snacks/pie/pumpkinpie
+/obj/item/weapon/reagent_containers/food/snacks/pumpkinpie
name = "pumpkin pie"
desc = "A delicious treat for the autumn months."
icon_state = "pumpkinpie"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/pumpkinpieslice
slices_num = 5
- bonus_reagents = list("nutriment" = 1, "vitamin" = 5)
+ list_reagents = list("nutriment" = 1, "vitamin" = 5)
/obj/item/weapon/reagent_containers/food/snacks/pumpkinpieslice
name = "pumpkin pie slice"
desc = "A slice of pumpkin pie, with whipped cream on top. Perfection."
- icon = 'icons/obj/food/piecake.dmi'
icon_state = "pumpkinpieslice"
trash = /obj/item/trash/plate
- filling_color = "#FFA500"
- list_reagents = list("nutriment" = 2)
/obj/item/weapon/reagent_containers/food/snacks/pie/appletart
name = "golden apple streusel tart"
desc = "A tasty dessert that won't make it through a metal detector."
icon_state = "gappletart"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 4)
- list_reagents = list("nutriment" = 8, "gold" = 5, "vitamin" = 4)
-
-/obj/item/weapon/reagent_containers/food/snacks/pie/blumpkinpie
- name = "blumpkin pie"
- desc = "An odd blue pie made with toxic blumpkin."
- icon_state = "blumpkinpie"
- slice_path = /obj/item/weapon/reagent_containers/food/snacks/blumpkinpieslice
- slices_num = 5
- bonus_reagents = list("nutriment" = 3, "vitamin" = 6)
-
-/obj/item/weapon/reagent_containers/food/snacks/blumpkinpieslice
- name = "blumpkin pie slice"
- desc = "A slice of blumpkin pie, with whipped cream on top. Is this edible?"
- icon = 'icons/obj/food/piecake.dmi'
- icon_state = "blumpkinpieslice"
- trash = /obj/item/trash/plate
- filling_color = "#1E90FF"
- list_reagents = list("nutriment" = 2)
-
-/obj/item/weapon/reagent_containers/food/snacks/pie/dulcedebatata
- name = "dulce de batata"
- desc = "A delicious jelly made with sweet potatoes."
- icon_state = "dulcedebatata"
- slice_path = /obj/item/weapon/reagent_containers/food/snacks/dulcedebatataslice
- slices_num = 5
- bonus_reagents = list("nutriment" = 4, "vitamin" = 8)
-
-/obj/item/weapon/reagent_containers/food/snacks/dulcedebatataslice
- name = "dulce de batata slice"
- desc = "A slice of sweet dulce de batata jelly."
- icon = 'icons/obj/food/piecake.dmi'
- icon_state = "dulcedebatataslice"
- trash = /obj/item/trash/plate
- filling_color = "#8B4513"
- list_reagents = list("nutriment" = 2)
-
-/obj/item/weapon/reagent_containers/food/snacks/pie/frostypie
- name = "frosty pie"
- desc = "Tastes like blue and cold."
- icon_state = "frostypie"
- bonus_reagents = list("nutriment" = 4, "vitamin" = 6)
+ list_reagents = list("nutriment" = 1, "vitamin" = 4)
\ No newline at end of file
diff --git a/code/modules/food&drinks/food/snacks_pizza.dm b/code/modules/food&drinks/food/snacks_pizza.dm
index c9f993c17f7c7..deb170a95be73 100644
--- a/code/modules/food&drinks/food/snacks_pizza.dm
+++ b/code/modules/food&drinks/food/snacks_pizza.dm
@@ -2,22 +2,18 @@
/////////////////////////////////////////////////PIZZA////////////////////////////////////////
/obj/item/weapon/reagent_containers/food/snacks/pizza
- icon = 'icons/obj/food/pizzaspaghetti.dmi'
w_class = 3
slices_num = 6
- volume = 80
- list_reagents = list("nutriment" = 30, "tomatojuice" = 6, "vitamin" = 5)
-
-/obj/item/weapon/reagent_containers/food/snacks/pizzaslice
- icon = 'icons/obj/food/pizzaspaghetti.dmi'
- list_reagents = list("nutriment" = 5)
/obj/item/weapon/reagent_containers/food/snacks/pizza/margherita
name = "margherita"
desc = "The most cheezy pizza in galaxy."
icon_state = "pizzamargherita"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/pizzaslice/margherita
- bonus_reagents = list("nutriment" = 5, "vitamin" = 5)
+ slices_num = 6
+ list_reagents = list("nutriment" = 5, "vitamin" = 5)
+
+
/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/margherita
name = "margherita slice"
@@ -25,89 +21,48 @@
icon_state = "pizzamargheritaslice"
filling_color = "#FFA500"
-/obj/item/weapon/reagent_containers/food/snacks/pizza/meat
+/obj/item/weapon/reagent_containers/food/snacks/pizza/meatpizza
name = "meatpizza"
desc = "Greasy pizza with delicious meat."
icon_state = "meatpizza"
- slice_path = /obj/item/weapon/reagent_containers/food/snacks/pizzaslice/meat
- bonus_reagents = list("nutriment" = 5, "vitamin" = 8)
- list_reagents = list("nutriment" = 30, "tomatojuice" = 6, "vitamin" = 8)
+ slice_path = /obj/item/weapon/reagent_containers/food/snacks/pizzaslice/meatpizza
+ slices_num = 6
+ list_reagents = list("nutriment" = 5, "vitamin" = 8)
-/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/meat
+/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/meatpizza
name = "meatpizza slice"
desc = "A nutritious slice of meatpizza."
icon_state = "meatpizzaslice"
filling_color = "#A52A2A"
-/obj/item/weapon/reagent_containers/food/snacks/pizza/mushroom
+/obj/item/weapon/reagent_containers/food/snacks/pizza/mushroompizza
name = "mushroom pizza"
desc = "Very special pizza."
icon_state = "mushroompizza"
- slice_path = /obj/item/weapon/reagent_containers/food/snacks/pizzaslice/mushroom
- bonus_reagents = list("nutriment" = 5, "vitamin" = 5)
- list_reagents = list("nutriment" = 30, "vitamin" = 5)
+ slice_path = /obj/item/weapon/reagent_containers/food/snacks/pizzaslice/mushroompizza
+ slices_num = 6
+ list_reagents = list("nutriment" = 5, "vitamin" = 5)
-/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/mushroom
+/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/mushroompizza
name = "mushroom pizza slice"
desc = "Maybe it is the last slice of pizza in your life."
icon_state = "mushroompizzaslice"
filling_color = "#FFE4C4"
-/obj/item/weapon/reagent_containers/food/snacks/pizza/vegetable
+/obj/item/weapon/reagent_containers/food/snacks/pizza/vegetablepizza
name = "vegetable pizza"
desc = "No one of Tomatos Sapiens were harmed during making this pizza."
icon_state = "vegetablepizza"
- slice_path = /obj/item/weapon/reagent_containers/food/snacks/pizzaslice/vegetable
- bonus_reagents = list("nutriment" = 5, "vitamin" = 5)
- list_reagents = list("nutriment" = 25, "tomatojuice" = 6, "oculine" = 12, "vitamin" = 5)
+ slice_path = /obj/item/weapon/reagent_containers/food/snacks/pizzaslice/vegetablepizza
+ slices_num = 6
+ list_reagents = list("nutriment" = 5, "vitamin" = 5)
-/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/vegetable
+/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/vegetablepizza
name = "vegetable pizza slice"
desc = "A slice of the most green pizza of all pizzas not containing green ingredients."
icon_state = "vegetablepizzaslice"
filling_color = "#FFA500"
-/obj/item/weapon/reagent_containers/food/snacks/pizza/donkpocket
- name = "donkpocket pizza"
- desc = "Who thought this would be a good idea?"
- icon_state = "donkpocketpizza"
- slice_path = /obj/item/weapon/reagent_containers/food/snacks/pizzaslice/donkpocket
- bonus_reagents = list("nutriment" = 5, "vitamin" = 5)
- list_reagents = list("nutriment" = 25, "tomatojuice" = 6, "omnizine" = 10, "vitamin" = 5)
-
-/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/donkpocket
- name = "donkpocket pizza slice"
- desc = "Smells like donkpocket."
- icon_state = "donkpocketpizzaslice"
- filling_color = "#FFA500"
-
-/obj/item/weapon/reagent_containers/food/snacks/pizza/dank
- name = "dank pizza"
- desc = "The hippie's pizza of choice."
- icon_state = "dankpizza"
- slice_path = /obj/item/weapon/reagent_containers/food/snacks/pizzaslice/dank
- bonus_reagents = list("nutriment" = 2, "vitamin" = 6)
- list_reagents = list("nutriment" = 25, "doctorsdelight" = 5, "tomatojuice" = 6, "vitamin" = 5)
-
-/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/dank
- name = "dank pizza slice"
- desc = "So good, man..."
- icon_state = "dankpizzaslice"
- filling_color = "#2E8B57"
-
-/obj/item/weapon/reagent_containers/food/snacks/pizza/sassysage
- name = "sassysage pizza"
- desc = "You can really smell the sassiness."
- icon_state = "sassysagepizza"
- slice_path = /obj/item/weapon/reagent_containers/food/snacks/pizzaslice/sassysage
- bonus_reagents = list("nutriment" = 6, "vitamin" = 6)
-
-/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/sassysage
- name = "sassysage pizza slice"
- desc = "Deliciously sassy."
- icon_state = "sassysagepizzaslice"
- filling_color = "#FF4500"
-
/obj/item/weapon/reagent_containers/food/snacks/pizzaslice/custom
name = "pizza slice"
icon_state = "pizzamargheritaslice"
@@ -116,7 +71,7 @@
/obj/item/pizzabox
name = "pizza box"
desc = "A box suited for pizzas."
- icon = 'icons/obj/food/containers.dmi'
+ icon = 'icons/obj/food.dmi'
icon_state = "pizzabox1"
var/open = 0 // Is the box open?
var/ismessy = 0 // Fancy mess on the lid
@@ -151,7 +106,7 @@
icon_state = "pizzabox_open"
if(pizza)
- var/image/pizzaimg = image('icons/obj/food/pizzaspaghetti.dmi', icon_state = pizza.icon_state)
+ var/image/pizzaimg = image("food.dmi", icon_state = pizza.icon_state)
pizzaimg.pixel_y = -3
overlays += pizzaimg
@@ -168,7 +123,7 @@
doimgtag = 1
if(doimgtag)
- var/image/tagimg = image('icons/obj/food/containers.dmi', icon_state = "pizzabox_tag")
+ var/image/tagimg = image("food.dmi", icon_state = "pizzabox_tag")
tagimg.pixel_y = boxes.len * 3
overlays += tagimg
@@ -271,20 +226,28 @@
/obj/item/pizzabox/margherita/New()
pizza = new /obj/item/weapon/reagent_containers/food/snacks/pizza/margherita(src)
+ pizza.reagents.add_reagent("nutriment", 25)
+ pizza.reagents.add_reagent("tomatojuice", 6)
boxtag = "Margherita Deluxe"
update_icon()
/obj/item/pizzabox/vegetable/New()
- pizza = new /obj/item/weapon/reagent_containers/food/snacks/pizza/vegetable(src)
+ pizza = new /obj/item/weapon/reagent_containers/food/snacks/pizza/vegetablepizza(src)
+ pizza.reagents.add_reagent("nutriment", 20)
+ pizza.reagents.add_reagent("tomatojuice", 6)
+ pizza.reagents.add_reagent("oculine", 12)
boxtag = "Gourmet Vegatable"
update_icon()
/obj/item/pizzabox/mushroom/New()
- pizza = new /obj/item/weapon/reagent_containers/food/snacks/pizza/mushroom(src)
+ pizza = new /obj/item/weapon/reagent_containers/food/snacks/pizza/mushroompizza(src)
+ pizza.reagents.add_reagent("nutriment", 25)
boxtag = "Mushroom Special"
update_icon()
/obj/item/pizzabox/meat/New()
- pizza = new /obj/item/weapon/reagent_containers/food/snacks/pizza/meat(src)
+ pizza = new /obj/item/weapon/reagent_containers/food/snacks/pizza/meatpizza(src)
+ pizza.reagents.add_reagent("nutriment", 25)
+ pizza.reagents.add_reagent("tomatojuice", 6)
boxtag = "Meatlover's Supreme"
update_icon()
\ No newline at end of file
diff --git a/code/modules/food&drinks/food/snacks_salad.dm b/code/modules/food&drinks/food/snacks_salad.dm
index d98273c4fb330..a39f11820cbc0 100644
--- a/code/modules/food&drinks/food/snacks_salad.dm
+++ b/code/modules/food&drinks/food/snacks_salad.dm
@@ -1,11 +1,9 @@
//this category is very little but I think that it has great potential to grow
////////////////////////////////////////////SALAD////////////////////////////////////////////
/obj/item/weapon/reagent_containers/food/snacks/salad
- icon = 'icons/obj/food/soupsalad.dmi'
trash = /obj/item/weapon/reagent_containers/glass/bowl
bitesize = 3
w_class = 3
- list_reagents = list("nutriment" = 7, "vitamin" = 2)
/obj/item/weapon/reagent_containers/food/snacks/salad/New()
..()
@@ -15,78 +13,16 @@
name = "\improper Aesir salad"
desc = "Probably too incredible for mortal men to fully enjoy."
icon_state = "aesirsalad"
- bonus_reagents = list("omnizine" = 2, "vitamin" = 6)
- list_reagents = list("nutriment" = 8, "omnizine" = 8, "vitamin" = 6)
+ list_reagents = list("omnizine" = 8, "vitamin" = 6)
/obj/item/weapon/reagent_containers/food/snacks/salad/herbsalad
name = "herb salad"
desc = "A tasty salad with apples on top."
icon_state = "herbsalad"
- bonus_reagents = list("vitamin" = 4)
- list_reagents = list("nutriment" = 8, "vitamin" = 2)
+ list_reagents = list("vitamin" = 4)
/obj/item/weapon/reagent_containers/food/snacks/salad/validsalad
name = "valid salad"
desc = "It's just an herb salad with meatballs and fried potato slices. Nothing suspicious about it."
icon_state = "validsalad"
- bonus_reagents = list("doctorsdelight" = 5, "vitamin" = 4)
- list_reagents = list("nutriment" = 8, "doctorsdelight" = 5, "vitamin" = 2)
-
-/obj/item/weapon/reagent_containers/food/snacks/salad/oatmeal
- name = "oatmeal"
- desc = "A nice bowl of oatmeal."
- icon_state = "oatmeal"
- bonus_reagents = list("nutriment" = 4, "vitamin" = 4)
- list_reagents = list("nutriment" = 7, "milk" = 10, "vitamin" = 2)
-
-/obj/item/weapon/reagent_containers/food/snacks/salad/fruit
- name = "fruit salad"
- desc = "Your standard fruit salad."
- icon_state = "fruitsalad"
- bonus_reagents = list("nutriment" = 2, "vitamin" = 4)
-
-/obj/item/weapon/reagent_containers/food/snacks/salad/jungle
- name = "jungle salad"
- desc = "Exotic fruits in a bowl."
- icon_state = "junglesalad"
- bonus_reagents = list("nutriment" = 4, "vitamin" = 4)
- list_reagents = list("nutriment" = 7, "banana" = 5, "vitamin" = 4)
-
-/obj/item/weapon/reagent_containers/food/snacks/salad/citrusdelight
- name = "citrus delight"
- desc = "Citrus overload!"
- icon_state = "citrusdelight"
- bonus_reagents = list("nutriment" = 4, "vitamin" = 4)
- list_reagents = list("nutriment" = 7, "vitamin" = 5)
-
-/obj/item/weapon/reagent_containers/food/snacks/salad/ricebowl
- name = "ricebowl"
- desc = "A bowl of raw rice."
- icon_state = "ricebowl"
- cooked_type = /obj/item/weapon/reagent_containers/food/snacks/salad/boiledrice
- list_reagents = list("nutriment" = 4)
-
-/obj/item/weapon/reagent_containers/food/snacks/salad/boiledrice
- name = "boiled rice"
- desc = "A warm bowl of rice."
- icon_state = "boiledrice"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
- list_reagents = list("nutriment" = 5, "vitamin" = 1)
-
-/obj/item/weapon/reagent_containers/food/snacks/salad/ricepudding
- name = "rice pudding"
- desc = "Everybody loves rice pudding!"
- icon_state = "ricepudding"
- bonus_reagents = list("nutriment" = 4, "vitamin" = 2)
-
-/obj/item/weapon/reagent_containers/food/snacks/salad/ricepork
- name = "rice and pork"
- desc = "Well, it looks like pork..."
- icon_state = "riceporkbowl"
- bonus_reagents = list("nutriment" = 4, "vitamin" = 4)
-
-/obj/item/weapon/reagent_containers/food/snacks/salad/eggbowl
- name = "egg bowl"
- desc = "A bowl of rice with a fried egg."
- icon_state = "eggbowl"
- bonus_reagents = list("nutriment" = 4, "vitamin" = 4)
+ list_reagents = list("doctorsdelight" = 5, "vitamin" = 4)
diff --git a/code/modules/food&drinks/food/snacks_sandwichtoast.dm b/code/modules/food&drinks/food/snacks_sandwichtoast.dm
index cef39b6836bd8..c4c3d2463248b 100644
--- a/code/modules/food&drinks/food/snacks_sandwichtoast.dm
+++ b/code/modules/food&drinks/food/snacks_sandwichtoast.dm
@@ -2,84 +2,66 @@
/obj/item/weapon/reagent_containers/food/snacks/sandwich
name = "sandwich"
desc = "A grand creation of meat, cheese, bread, and several leaves of lettuce! Arthur Dent would be proud."
- icon = 'icons/obj/food/burgerbread.dmi'
icon_state = "sandwich"
trash = /obj/item/trash/plate
- bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
- list_reagents = list("nutriment" = 6, "vitamin" = 1)
+ list_reagents = list("nutriment" = 1, "vitamin" = 1)
cooked_type = /obj/item/weapon/reagent_containers/food/snacks/toastedsandwich
/obj/item/weapon/reagent_containers/food/snacks/toastedsandwich
name = "toasted sandwich"
desc = "Now if you only had a pepper bar."
- icon = 'icons/obj/food/burgerbread.dmi'
icon_state = "toastedsandwich"
trash = /obj/item/trash/plate
- bonus_reagents = list("nutriment" = 1, "carbon" = 2)
- list_reagents = list("nutriment" = 6, "carbon" = 2)
+ list_reagents = list("nutriment" = 1, "carbon" = 2)
/obj/item/weapon/reagent_containers/food/snacks/grilledcheese
name = "grilled cheese sandwich"
desc = "Goes great with Tomato soup!"
- icon = 'icons/obj/food/burgerbread.dmi'
icon_state = "toastedsandwich"
trash = /obj/item/trash/plate
- bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
- list_reagents = list("nutriment" = 7, "vitamin" = 1)
+ list_reagents = list("nutriment" = 1, "vitamin" = 1)
/obj/item/weapon/reagent_containers/food/snacks/jellysandwich
name = "jelly sandwich"
desc = "You wish you had some peanut butter to go with this..."
- icon = 'icons/obj/food/burgerbread.dmi'
icon_state = "jellysandwich"
trash = /obj/item/trash/plate
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/jellysandwich/slime
- bonus_reagents = list("slimejelly" = 5, "vitamin" = 2)
- list_reagents = list("nutriment" = 2, "slimejelly" = 5, "vitamin" = 2)
+ list_reagents = list("slimejelly" = 5, "vitamin" = 2)
/obj/item/weapon/reagent_containers/food/snacks/jellysandwich/cherry
- bonus_reagents = list("cherryjelly" = 5, "vitamin" = 2)
- list_reagents = list("nutriment" = 2, "cherryjelly" = 5, "vitamin" = 2)
+ list_reagents = list("cherryjelly" = 5, "vitamin" = 2)
/obj/item/weapon/reagent_containers/food/snacks/icecreamsandwich
name = "icecream sandwich"
desc = "Portable Ice-cream in it's own packaging."
- icon = 'icons/obj/food/burgerbread.dmi'
icon_state = "icecreamsandwich"
- bonus_reagents = list("nutriment" = 1, "ice" = 2)
- list_reagents = list("nutriment" = 2, "ice" = 2)
+ list_reagents = list("nutriment" = 1, "ice" = 2)
/obj/item/weapon/reagent_containers/food/snacks/notasandwich
name = "not-a-sandwich"
desc = "Something seems to be wrong with this, you can't quite figure what. Maybe it's his moustache."
- icon = 'icons/obj/food/burgerbread.dmi'
icon_state = "notasandwich"
trash = /obj/item/trash/plate
- bonus_reagents = list("vitamin" = 6)
- list_reagents = list("nutriment" = 6, "vitamin" = 6)
+ list_reagents = list("vitamin" = 6)
/obj/item/weapon/reagent_containers/food/snacks/jelliedtoast
name = "jellied toast"
desc = "A slice of bread covered with delicious jam."
- icon = 'icons/obj/food/burgerbread.dmi'
icon_state = "jellytoast"
trash = /obj/item/trash/plate
bitesize = 3
/obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/cherry
- bonus_reagents = list("cherryjelly" = 5, "vitamin" = 2)
- list_reagents = list("nutriment" = 1, "cherryjelly" = 5, "vitamin" = 2)
+ list_reagents = list("cherryjelly" = 5, "vitamin" = 2)
/obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/slime
- bonus_reagents = list("slimejelly" = 5, "vitamin" = 2)
- list_reagents = list("nutriment" = 1, "slimejelly" = 5, "vitamin" = 2)
+ list_reagents = list("slimejelly" = 5, "vitamin" = 2)
/obj/item/weapon/reagent_containers/food/snacks/twobread
name = "two bread"
desc = "This seems awfully bitter."
- icon = 'icons/obj/food/burgerbread.dmi'
icon_state = "twobread"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 2)
- list_reagents = list("nutriment" = 2, "vitamin" = 2)
+ list_reagents = list("nutriment" = 1, "vitamin" = 2)
diff --git a/code/modules/food&drinks/food/snacks_soup.dm b/code/modules/food&drinks/food/snacks_soup.dm
index 8248ab27aebfd..742f6f0d9b53c 100644
--- a/code/modules/food&drinks/food/snacks_soup.dm
+++ b/code/modules/food&drinks/food/snacks_soup.dm
@@ -1,10 +1,7 @@
/obj/item/weapon/reagent_containers/food/snacks/soup
w_class = 3
- icon = 'icons/obj/food/soupsalad.dmi'
trash = /obj/item/weapon/reagent_containers/glass/bowl
bitesize = 5
- volume = 80
- list_reagents = list("nutriment" = 8, "water" = 5, "vitamin" = 4)
/obj/item/weapon/reagent_containers/food/snacks/soup/New()
..()
@@ -14,7 +11,7 @@
name = "wish soup"
desc = "I wish this was soup."
icon_state = "wishsoup"
- list_reagents = list("water" = 10)
+ list_reagents = list("water" = 1)
/obj/item/weapon/reagent_containers/food/snacks/soup/wish/New()
..()
@@ -22,114 +19,98 @@
desc = "A wish come true!"
reagents.add_reagent("nutriment", 9)
reagents.add_reagent("vitamin", 1)
- bonus_reagents = list("nutriment" = 9, "vitamin" = 1)
+ else
+ reagents.add_reagent("water", 10)
/obj/item/weapon/reagent_containers/food/snacks/soup/meatball
name = "meatball soup"
desc = "You've got balls kid, BALLS!"
icon_state = "meatballsoup"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 5)
+ list_reagents = list("nutriment" = 1, "vitamin" = 5)
/obj/item/weapon/reagent_containers/food/snacks/soup/slime
name = "slime soup"
desc = "If no water is available, you may substitute tears."
icon_state = "slimesoup"
- bonus_reagents = list("nutriment" = 1, "slimejelly" = 5, "vitamin" = 5)
- list_reagents = list("nutriment" = 5, "slimejelly" = 5, "water" = 5, "vitamin" = 4)
+ list_reagents = list("nutriment" = 1, "slimejelly" = 5, "vitamin" = 5)
/obj/item/weapon/reagent_containers/food/snacks/soup/blood
name = "tomato soup"
desc = "Smells like copper."
icon_state = "tomatosoup"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 6)
- list_reagents = list("nutriment" = 2, "blood" = 10, "water" = 5, "vitamin" = 4)
-
-/obj/item/weapon/reagent_containers/food/snacks/soup/wingfangchu
- name = "wing fang chu"
- desc = "A savory dish of alien wing wang in soy."
- icon_state = "wingfangchu"
- trash = /obj/item/weapon/reagent_containers/glass/bowl
- bonus_reagents = list("nutriment" = 1, "vitamin" = 2)
- list_reagents = list("nutriment" = 6, "soysauce" = 5, "vitamin" = 2)
+ list_reagents = list("nutriment" = 1, "vitamin" = 6)
/obj/item/weapon/reagent_containers/food/snacks/soup/clownstears
name = "clown's tears"
desc = "Not very funny."
icon_state = "clownstears"
- bonus_reagents = list("nutriment" = 1, "banana" = 5, "vitamin" = 8)
- list_reagents = list("nutriment" = 4, "banana" = 5, "water" = 5, "vitamin" = 8)
+ list_reagents = list("nutriment" = 1, "banana" = 5, "vitamin" = 8)
/obj/item/weapon/reagent_containers/food/snacks/soup/vegetable
name = "vegetable soup"
desc = "A true vegan meal."
icon_state = "vegetablesoup"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 4)
+ list_reagents = list("nutriment" = 1, "vitamin" = 4)
/obj/item/weapon/reagent_containers/food/snacks/soup/nettle
name = "nettle soup"
desc = "To think, the botanist would've beat you to death with one of these."
icon_state = "nettlesoup"
- bonus_reagents = list("nutriment" = 1, "omnizine" = 5, "vitamin" = 5)
+ list_reagents = list("nutriment" = 1, "omnizine" = 5, "vitamin" = 5)
/obj/item/weapon/reagent_containers/food/snacks/soup/mystery
name = "mystery soup"
desc = "The mystery is, why aren't you eating it?"
icon_state = "mysterysoup"
+ list_reagents = list("nutriment" = 1, "tomatojuice" = 2)
var/extra_reagent = null
- list_reagents = list("nutriment" = 6)
-
/obj/item/weapon/reagent_containers/food/snacks/soup/mystery/New()
..()
+
extra_reagent = pick("capsaicin", "frostoil", "omnizine", "banana", "blood", "slimejelly", "toxin", "banana", "carbon", "oculine")
reagents.add_reagent("[extra_reagent]", 5)
- bonus_reagents = list("[extra_reagent]" = 5, "nutriment" = 6)
/obj/item/weapon/reagent_containers/food/snacks/soup/hotchili
name = "hot chili"
desc = "A five alarm Texan Chili!"
icon_state = "hotchili"
- bonus_reagents = list("nutriment" = 1, "tomatojuice" = 2, "vitamin" = 2)
- list_reagents = list("nutriment" = 5, "capsaicin" = 1, "tomatojuice" = 2, "vitamin" = 2)
+ list_reagents = list("nutriment" = 1, "tomatojuice" = 2, "vitamin" = 2)
/obj/item/weapon/reagent_containers/food/snacks/soup/coldchili
name = "cold chili"
desc = "This slush is barely a liquid!"
icon_state = "coldchili"
- bonus_reagents = list("nutriment" = 1, "tomatojuice" = 2, "vitamin" = 2)
- list_reagents = list("nutriment" = 5, "frostoil" = 1, "tomatojuice" = 2, "vitamin" = 2)
+ list_reagents = list("nutriment" = 1, "tomatojuice" = 2, "vitamin" = 2)
/obj/item/weapon/reagent_containers/food/snacks/soup/monkeysdelight
name = "monkey's delight"
desc = "A delicious soup with dumplings and hunks of monkey meat simmered to perfection, in a broth that tastes faintly of bananas."
icon_state = "monkeysdelight"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 5)
- list_reagents = list("nutriment" = 10, "banana" = 5, "vitamin" = 5)
+ list_reagents = list("nutriment" = 1, "vitamin" = 5)
/obj/item/weapon/reagent_containers/food/snacks/soup/tomato
name = "tomato soup"
desc = "Drinking this feels like being a vampire! A tomato vampire..."
icon_state = "tomatosoup"
- bonus_reagents = list("nutriment" = 1, "tomatojuice" = 10, "vitamin" = 3)
- list_reagents = list("nutriment" = 5, "tomatojuice" = 10, "vitamin" = 3)
+ list_reagents = list("nutriment" = 1, "tomatojuice" = 10, "vitamin" = 3)
/obj/item/weapon/reagent_containers/food/snacks/soup/milo
name = "milosoup"
desc = "The universes best soup! Yum!!!"
icon_state = "milosoup"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 3)
+ list_reagents = list("nutriment" = 1, "vitamin" = 3)
/obj/item/weapon/reagent_containers/food/snacks/soup/mushroom
name = "chantrelle soup"
desc = "A delicious and hearty mushroom soup."
icon_state = "mushroomsoup"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 5)
- list_reagents = list("nutriment" = 8, "vitamin" = 4)
+ list_reagents = list("nutriment" = 1, "vitamin" = 5)
/obj/item/weapon/reagent_containers/food/snacks/soup/beet
name = "beet soup"
desc = "Wait, how do you spell it again..?"
icon_state = "beetsoup"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 5)
+ list_reagents = list("nutriment" = 1, "vitamin" = 5)
/obj/item/weapon/reagent_containers/food/snacks/soup/beet/New()
..()
@@ -141,36 +122,18 @@
desc = "Jello gelatin, from Alfred Hubbard's cookbook."
icon_state = "spacylibertyduff"
bitesize = 3
- bonus_reagents = list("nutriment" = 1, "vitamin" = 5)
- list_reagents = list("nutriment" = 6, "mushroomhallucinogen" = 6)
+ list_reagents = list("nutriment" = 1, "vitamin" = 5)
/obj/item/weapon/reagent_containers/food/snacks/soup/amanitajelly
name = "amanita jelly"
desc = "Looks curiously toxic."
icon_state = "amanitajelly"
bitesize = 3
- bonus_reagents = list("nutriment" = 1, "vitamin" = 5)
- list_reagents = list("nutriment" = 6, "mushroomhallucinogen" = 3, "amatoxin" = 6)
+ list_reagents = list("nutriment" = 1, "vitamin" = 5)
/obj/item/weapon/reagent_containers/food/snacks/soup/stew
name = "stew"
desc = "A nice and warm stew. Healthy and strong."
icon_state = "stew"
- bonus_reagents = list("nutriment" = 1, "tomatojuice" = 5, "vitamin" = 5)
- list_reagents = list("nutriment" = 10, "oculine" = 5, "tomatojuice" = 5, "vitamin" = 5)
+ list_reagents = list("nutriment" = 1, "tomatojuice" = 5, "vitamin" = 5)
bitesize = 7
- volume = 100
-
-/obj/item/weapon/reagent_containers/food/snacks/soup/sweetpotato
- name = "sweet potato soup"
- desc = "Delicious sweet potato in soup form."
- icon_state = "sweetpotatosoup"
- bonus_reagents = list("nutriment" = 4, "vitamin" = 5)
-
-/obj/item/weapon/reagent_containers/food/snacks/soup/beet/red
- name = "red beet soup"
- desc = "Quite a delicacy."
- icon_state = "redbeetsoup"
- bonus_reagents = list("nutriment" = 4, "vitamin" = 6)
-
-
diff --git a/code/modules/food&drinks/food/snacks_spaghetti.dm b/code/modules/food&drinks/food/snacks_spaghetti.dm
index 251217a54eddf..88ae3114c57fd 100644
--- a/code/modules/food&drinks/food/snacks_spaghetti.dm
+++ b/code/modules/food&drinks/food/snacks_spaghetti.dm
@@ -2,7 +2,6 @@
/obj/item/weapon/reagent_containers/food/snacks/spaghetti
name = "spaghetti"
desc = "Now that's a nic'e pasta!"
- icon = 'icons/obj/food/pizzaspaghetti.dmi'
icon_state = "spaghetti"
list_reagents = list("nutriment" = 1, "vitamin" = 1)
cooked_type = /obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti
@@ -11,69 +10,42 @@
/obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti
name = "boiled spaghetti"
desc = "A plain dish of noodles, this needs more ingredients."
- icon = 'icons/obj/food/pizzaspaghetti.dmi'
icon_state = "spaghettiboiled"
trash = /obj/item/trash/plate
- bonus_reagents = list("nutriment" = 2)
- list_reagents = list("nutriment" = 2, "vitamin" = 1)
+ list_reagents = list("nutriment" = 2)
custom_food_type = /obj/item/weapon/reagent_containers/food/snacks/customizable/pasta
filling_color = "#F0E68C"
/obj/item/weapon/reagent_containers/food/snacks/pastatomato
name = "spaghetti"
desc = "Spaghetti and crushed tomatoes. Just like your abusive father used to make!"
- icon = 'icons/obj/food/pizzaspaghetti.dmi'
icon_state = "pastatomato"
trash = /obj/item/trash/plate
bitesize = 4
- bonus_reagents = list("nutriment" = 1, "tomatojuice" = 10, "vitamin" = 4)
- list_reagents = list("nutriment" = 6, "tomatojuice" = 10, "vitamin" = 4)
+ list_reagents = list("nutriment" = 1, "vitamin" = 4)
filling_color = "#DC143C"
/obj/item/weapon/reagent_containers/food/snacks/copypasta
name = "copypasta"
desc = "You probably shouldn't try this, you always hear people talking about how bad it is..."
- icon = 'icons/obj/food/pizzaspaghetti.dmi'
icon_state = "copypasta"
trash = /obj/item/trash/plate
bitesize = 4
- bonus_reagents = list("nutriment" = 1, "vitamin" = 4)
- list_reagents = list("nutriment" = 12, "tomatojuice" = 20, "vitamin" = 8)
+ list_reagents = list("nutriment" = 1, "vitamin" = 4)
filling_color = "#DC143C"
/obj/item/weapon/reagent_containers/food/snacks/meatballspaghetti
name = "spaghetti and meatballs"
desc = "Now that's a nic'e meatball!"
- icon = 'icons/obj/food/pizzaspaghetti.dmi'
icon_state = "meatballspaghetti"
trash = /obj/item/trash/plate
- bonus_reagents = list("nutriment" = 1, "vitamin" = 4)
- list_reagents = list("nutriment" = 8, "vitamin" = 4)
+ list_reagents = list("nutriment" = 1, "vitamin" = 4)
filling_color = "#F0E68C"
/obj/item/weapon/reagent_containers/food/snacks/spesslaw
name = "spesslaw"
desc = "A lawyers favourite."
- icon = 'icons/obj/food/pizzaspaghetti.dmi'
icon_state = "spesslaw"
trash = /obj/item/trash/plate
- bonus_reagents = list("nutriment" = 1, "vitamin" = 6)
- list_reagents = list("nutriment" = 8, "vitamin" = 6)
+ list_reagents = list("nutriment" = 1, "vitamin" = 6)
filling_color = "#F0E68C"
-
-/obj/item/weapon/reagent_containers/food/snacks/chowmein
- name = "chow mein"
- desc = "A nice mix of noodles and fried vegetables."
- icon = 'icons/obj/food/pizzaspaghetti.dmi'
- icon_state = "chowmein"
- trash = /obj/item/trash/plate
- bonus_reagents = list("nutriment" = 3, "vitamin" = 4)
- list_reagents = list("nutriment" = 7, "vitamin" = 6)
-
-/obj/item/weapon/reagent_containers/food/snacks/beefnoodle
- name = "beef noodle"
- desc = "Nutritious, beefy and noodly."
- icon = 'icons/obj/food/pizzaspaghetti.dmi'
- icon_state = "beefnoodle"
- trash = /obj/item/weapon/reagent_containers/glass/bowl
- bonus_reagents = list("nutriment" = 5, "vitamin" = 6)
\ No newline at end of file
diff --git a/code/modules/food&drinks/kitchen machinery/gibber.dm b/code/modules/food&drinks/kitchen machinery/gibber.dm
index 36862c68452cc..640e9d9024ac5 100644
--- a/code/modules/food&drinks/kitchen machinery/gibber.dm
+++ b/code/modules/food&drinks/kitchen machinery/gibber.dm
@@ -136,16 +136,16 @@
var/sourcetotalreagents = src.occupant.reagents.total_volume
var/totalslabs = 3
- var/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/allmeat[totalslabs]
+ var/obj/item/weapon/reagent_containers/food/snacks/meat/human/allmeat[totalslabs]
if(ishuman(occupant))
var/mob/living/carbon/human/gibee = occupant
if(gibee.dna && gibee.dna.species)
typeofmeat = gibee.dna.species.meat
else
- typeofmeat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human
+ typeofmeat = /obj/item/weapon/reagent_containers/food/snacks/meat/human
for (var/i=1 to totalslabs)
- var/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/newmeat = new typeofmeat
+ var/obj/item/weapon/reagent_containers/food/snacks/meat/human/newmeat = new typeofmeat
newmeat.name = sourcename + newmeat.name
newmeat.subjectname = sourcename
newmeat.subjectjob = sourcejob
diff --git a/code/modules/food&drinks/kitchen machinery/juicer.dm b/code/modules/food&drinks/kitchen machinery/juicer.dm
index 712dc0c970da3..3cf4bc60a2a81 100644
--- a/code/modules/food&drinks/kitchen machinery/juicer.dm
+++ b/code/modules/food&drinks/kitchen machinery/juicer.dm
@@ -23,8 +23,6 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/watermelon = "watermelonjuice",
/obj/item/weapon/reagent_containers/food/snacks/watermelonslice = "watermelonjuice",
/obj/item/weapon/reagent_containers/food/snacks/grown/berries/poison = "poisonberryjuice",
- /obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin = "pumpkinjuice",
- /obj/item/weapon/reagent_containers/food/snacks/grown/blumpkin = "blumpkinjuice",
)
/obj/machinery/juicer/New()
diff --git a/code/modules/food&drinks/kitchen machinery/microwave.dm b/code/modules/food&drinks/kitchen machinery/microwave.dm
index 48b0cff7ad58c..432fae10ead67 100644
--- a/code/modules/food&drinks/kitchen machinery/microwave.dm
+++ b/code/modules/food&drinks/kitchen machinery/microwave.dm
@@ -245,7 +245,7 @@
for(var/obj/item/weapon/reagent_containers/food/snacks/F in contents)
if(F.cooked_type)
var/obj/item/weapon/reagent_containers/food/snacks/S = new F.cooked_type (get_turf(src))
- F.initialize_cooked_food(S, efficiency)
+ F.initialize_cooked_food(S)
else
new /obj/item/weapon/reagent_containers/food/snacks/badrecipe(src)
if(dirty < 100)
diff --git a/code/modules/food&drinks/kitchen machinery/processor.dm b/code/modules/food&drinks/kitchen machinery/processor.dm
index 32753bfb10a62..1a3be0f858725 100644
--- a/code/modules/food&drinks/kitchen machinery/processor.dm
+++ b/code/modules/food&drinks/kitchen machinery/processor.dm
@@ -19,15 +19,15 @@
var/input
var/output
var/time = 40
-/datum/food_processor_process/proc/process_food(loc, what)
- if (src.output && loc)
- new src.output(loc)
- if (what)
- qdel(what) // Note to self: Make this safer
+ proc/process(loc, what)
+ if (src.output && loc)
+ new src.output(loc)
+ if (what)
+ qdel(what) // Note to self: Make this safer
/* objs */
/datum/food_processor_process/meat
- input = /obj/item/weapon/reagent_containers/food/snacks/meat/slab
+ input = /obj/item/weapon/reagent_containers/food/snacks/meat
output = /obj/item/weapon/reagent_containers/food/snacks/faggot
/datum/food_processor_process/potato
@@ -46,26 +46,14 @@
input = /obj/item/weapon/reagent_containers/food/snacks/doughslice
output = /obj/item/weapon/reagent_containers/food/snacks/spaghetti
-/datum/food_processor_process/corn
- input = /obj/item/weapon/reagent_containers/food/snacks/grown/corn
- output = /obj/item/weapon/reagent_containers/food/snacks/tortilla
-
-/datum/food_processor_process/parsnip
- input = /obj/item/weapon/reagent_containers/food/snacks/grown/parsnip
- output = /obj/item/weapon/reagent_containers/food/snacks/roastparsnip
-
-/datum/food_processor_process/sweetpotato
- input = /obj/item/weapon/reagent_containers/food/snacks/grown/sweetpotato
- output = /obj/item/weapon/reagent_containers/food/snacks/yakiimo
-
/* mobs */
-/datum/food_processor_process/mob/process_food(loc, what)
+/datum/food_processor_process/mob/process(loc, what)
..()
-/datum/food_processor_process/mob/slime/process_food(loc, what)
- var/mob/living/simple_animal/slime/S = what
+/datum/food_processor_process/mob/slime/process(loc, what)
+ var/mob/living/carbon/slime/S = what
var/C = S.cores
if(S.stat != DEAD)
S.loc = loc
@@ -76,10 +64,10 @@
feedback_add_details("slime_core_harvested","[replacetext(S.colour," ","_")]")
..()
-/datum/food_processor_process/mob/slime/input = /mob/living/simple_animal/slime
+/datum/food_processor_process/mob/slime/input = /mob/living/carbon/slime
/datum/food_processor_process/mob/slime/output = null
-/datum/food_processor_process/mob/monkey/process_food(loc, what)
+/datum/food_processor_process/mob/monkey/process(loc, what)
var/mob/living/carbon/monkey/O = what
if (O.client) //grief-proof
O.loc = loc
@@ -166,7 +154,7 @@
playsound(src.loc, 'sound/machines/blender.ogg', 50, 1)
use_power(500)
sleep(P.time)
- P.process_food(src.loc, O)
+ P.process(src.loc, O)
src.processing = 0
src.visible_message("\the [src] finished processing.")
diff --git a/code/modules/food&drinks/recipes/drinks_recipes.dm b/code/modules/food&drinks/recipes/drinks_recipes.dm
index 6af179bf2f16a..2f23ceee03fc5 100644
--- a/code/modules/food&drinks/recipes/drinks_recipes.dm
+++ b/code/modules/food&drinks/recipes/drinks_recipes.dm
@@ -506,59 +506,3 @@
result = "thirteenloko"
required_reagents = list("vodka" = 1, "coffee" = 1, "limejuice" = 1)
result_amount = 3
-
-/datum/chemical_reaction/chocolatepudding
- name = "Chocolate Pudding"
- id = "chocolatepudding"
- result = "chocolatepudding"
- required_reagents = list("cocoa" = 5, "milk" = 5, "eggyolk" = 5)
- result_amount = 20
-
-/datum/chemical_reaction/vanillapudding
- name = "Vanilla Pudding"
- id = "vanillapudding"
- result = "vanillapudding"
- required_reagents = list("vanilla" = 5, "milk" = 5, "eggyolk" = 5)
- result_amount = 20
-
-/datum/chemical_reaction/cherryshake
- name = "Cherry Shake"
- id = "cherryshake"
- result = "cherryshake"
- required_reagents = list("cherryjelly" = 1, "ice" = 1, "cream" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/bluecherryshake
- name = "Blue Cherry Shake"
- id = "bluecherryshake"
- result = "bluecherryshake"
- required_reagents = list("bluecherryjelly" = 1, "ice" = 1, "cream" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/drunkenblumpkin
- name = "Drunken Blumpkin"
- id = "drunkenblumpkin"
- result = "drunkenblumpkin"
- required_reagents = list("blumpkinjuice" = 1, "irishcream" = 2, "ice" = 1)
- result_amount = 4
-
-/datum/chemical_reaction/pumpkin_latte
- name = "Pumpkin latte"
- id = "pumpkin_latte"
- result = "pumpkin_latte"
- required_reagents = list("pumpkinjuice" = 5, "coffee" = 5, "cream" = 5)
- result_amount = 15
-
-/datum/chemical_reaction/gibbfloats
- name = "Gibb Floats"
- id = "gibbfloats"
- result = "gibbfloats"
- required_reagents = list("dr_gibb" = 5, "ice" = 5, "cream" = 5)
- result_amount = 15
-
-/datum/chemical_reaction/triple_citrus
- name = "triple_citrus"
- id = "triple_citrus"
- result = "triple_citrus"
- required_reagents = list("lemonjuice" = 1, "limejuice" = 1, "orangejuice" = 1)
- result_amount = 5
\ No newline at end of file
diff --git a/code/modules/food&drinks/recipes/food_mixtures.dm b/code/modules/food&drinks/recipes/food_mixtures.dm
index f6d4bf2145fb1..593dce5b8db79 100644
--- a/code/modules/food&drinks/recipes/food_mixtures.dm
+++ b/code/modules/food&drinks/recipes/food_mixtures.dm
@@ -71,14 +71,6 @@
required_reagents = list("soymilk" = 4, "sacid" = 1)
result_amount = 5
-/datum/chemical_reaction/corn_syrup
- name = "corn_syrup"
- id = "corn_syrup"
- result = "corn_syrup"
- required_reagents = list("corn_starch" = 1, "sacid" = 1)
- result_amount = 5
- required_temp = 374
-
/datum/chemical_reaction/cheesewheel
name = "Cheesewheel"
id = "cheesewheel"
@@ -89,7 +81,7 @@
/datum/chemical_reaction/cheesewheel/on_reaction(var/datum/reagents/holder, var/created_volume)
var/location = get_turf(holder.my_atom)
- new /obj/item/weapon/reagent_containers/food/snacks/store/cheesewheel(location)
+ new /obj/item/weapon/reagent_containers/food/snacks/cheesewheel(location)
return
/datum/chemical_reaction/synthmeat
@@ -102,7 +94,7 @@
/datum/chemical_reaction/synthmeat/on_reaction(var/datum/reagents/holder, var/created_volume)
var/location = get_turf(holder.my_atom)
- new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/synthmeat(location)
+ new /obj/item/weapon/reagent_containers/food/snacks/meat/synthmeat(location)
return
/datum/chemical_reaction/hot_ramen
@@ -165,17 +157,3 @@
id = "vegancakebatter"
required_reagents = list("soymilk" = 15, "flour" = 15, "sugar" = 5)
-/datum/chemical_reaction/ricebowl
- name = "Rice Bowl"
- id = "ricebowl"
- result = null
- required_reagents = list("rice" = 10, "water" = 10)
- result_amount = 1
- required_container = /obj/item/weapon/reagent_containers/glass/bowl
- mix_message = "The rice absorbs the water."
-
-/datum/chemical_reaction/ricebowl/on_reaction(var/datum/reagents/holder)
- var/obj/item/weapon/reagent_containers/food/snacks/S = new /obj/item/weapon/reagent_containers/food/snacks/salad/ricebowl
- S.loc = get_turf(holder.my_atom)
- if(holder && holder.my_atom)
- qdel(holder.my_atom)
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_bread.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_bread.dm
index 8dd5494537d32..9e820b3791c39 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_bread.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_bread.dm
@@ -7,7 +7,7 @@
name = "Meat bread"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/store/bread/plain = 1,
- /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/plain = 3,
+ /obj/item/weapon/reagent_containers/food/snacks/cutlet/plain = 3,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 3
)
result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/meat
@@ -16,7 +16,7 @@
name = "Xenomeat bread"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/store/bread/plain = 1,
- /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/xeno = 3,
+ /obj/item/weapon/reagent_containers/food/snacks/cutlet/xeno = 3,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 3
)
result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/xenomeat
@@ -25,7 +25,7 @@
name = "Spidermeat bread"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/store/bread/plain = 1,
- /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/spider = 3,
+ /obj/item/weapon/reagent_containers/food/snacks/cutlet/spider = 3,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 3
)
result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/spidermeat
@@ -58,12 +58,3 @@
)
result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/creamcheese
-/datum/table_recipe/mimanabread
- name = "Mimana bread"
- reqs = list(
- /datum/reagent/consumable/soymilk = 5,
- /obj/item/weapon/reagent_containers/food/snacks/store/bread/plain = 1,
- /obj/item/weapon/reagent_containers/food/snacks/tofu = 3,
- /obj/item/weapon/reagent_containers/food/snacks/grown/mimana = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/store/bread/mimana
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_burger.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_burger.dm
index feafb78594e5a..f25344c9621e1 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_burger.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_burger.dm
@@ -8,14 +8,14 @@
name = "Human burger"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/bun = 1,
- /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain/human = 1
+ /obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain/human = 1
)
result = /obj/item/weapon/reagent_containers/food/snacks/burger/human
/datum/table_recipe/burger
name = "Burger"
reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain = 1,
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
)
@@ -40,19 +40,11 @@
/datum/table_recipe/xenoburger
name = "Xeno burger"
reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/meat/steak/xeno = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/meatsteak/xeno = 1,
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
)
result = /obj/item/weapon/reagent_containers/food/snacks/burger/xeno
-datum/table_recipe/bearger
- name = "Bearger"
- reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/meat/steak/bear = 1,
- /obj/item/weapon/reagent_containers/food/snacks/bun = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/burger/bearger
-
/datum/table_recipe/fishburger
name = "Fish burger"
reqs = list(
@@ -96,7 +88,7 @@ datum/table_recipe/bearger
/datum/table_recipe/redburger
name = "Red burger"
reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain = 1,
/obj/item/toy/crayon/red = 1,
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
)
@@ -105,7 +97,7 @@ datum/table_recipe/bearger
/datum/table_recipe/orangeburger
name = "Orange burger"
reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain = 1,
/obj/item/toy/crayon/orange = 1,
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
)
@@ -114,7 +106,7 @@ datum/table_recipe/bearger
/datum/table_recipe/yellowburger
name = "Yellow burger"
reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain = 1,
/obj/item/toy/crayon/yellow = 1,
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
)
@@ -123,7 +115,7 @@ datum/table_recipe/bearger
/datum/table_recipe/greenburger
name = "Green burger"
reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain = 1,
/obj/item/toy/crayon/green = 1,
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
)
@@ -132,7 +124,7 @@ datum/table_recipe/bearger
/datum/table_recipe/blueburger
name = "Blue burger"
reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain = 1,
/obj/item/toy/crayon/blue = 1,
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
)
@@ -141,7 +133,7 @@ datum/table_recipe/bearger
/datum/table_recipe/purpleburger
name = "Purple burger"
reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain = 1,
/obj/item/toy/crayon/purple = 1,
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
)
@@ -165,7 +157,7 @@ datum/table_recipe/bearger
/datum/table_recipe/bigbiteburger
name = "Big bite burger"
reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 3,
+ /obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain = 3,
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
)
result = /obj/item/weapon/reagent_containers/food/snacks/burger/bigbite
@@ -175,7 +167,7 @@ datum/table_recipe/bearger
reqs = list(
/datum/reagent/consumable/sodiumchloride = 5,
/datum/reagent/consumable/blackpepper = 5,
- /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 5,
+ /obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain = 5,
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 4,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 3,
/obj/item/weapon/reagent_containers/food/snacks/boiledegg = 2,
@@ -198,20 +190,4 @@ datum/table_recipe/bearger
/datum/reagent/consumable/cherryjelly = 5,
/obj/item/weapon/reagent_containers/food/snacks/bun = 1
)
- result = /obj/item/weapon/reagent_containers/food/snacks/burger/jelly/cherry
-
-/datum/table_recipe/fivealarmburger
- name = "Five alarm burger"
- reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chili = 2,
- /obj/item/weapon/reagent_containers/food/snacks/bun = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/burger/fivealarm
-
-/datum/table_recipe/ratburger
- name = "Rat burger"
- reqs = list(
- /obj/item/trash/deadmouse = 1,
- /obj/item/weapon/reagent_containers/food/snacks/bun = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/burger/rat
\ No newline at end of file
+ result = /obj/item/weapon/reagent_containers/food/snacks/burger/jelly/cherry
\ No newline at end of file
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_cake.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_cake.dm
index c5615809633e2..e9fbbdacc7af0 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_cake.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_cake.dm
@@ -81,12 +81,4 @@
/obj/item/slime_extract = 1,
/obj/item/weapon/reagent_containers/food/snacks/store/cake/plain = 1
)
- result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/slimecake
-
-/datum/table_recipe/pumpkinspicecake
- name = "Pumpkin spice cake"
- reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/store/cake/plain = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin = 2
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/pumpkinspice
\ No newline at end of file
+ result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/slimecake
\ No newline at end of file
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_dough.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_dough.dm
new file mode 100644
index 0000000000000..a81fee36e528e
--- /dev/null
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_dough.dm
@@ -0,0 +1,53 @@
+
+
+// see code/module/crafting/table.dm
+
+////////////////////////////////////////////////DOUGH////////////////////////////////////////////////
+
+//these recipes can also be done with attackby.
+
+/datum/table_recipe/cakebatter
+ name = "Cake Batter"
+ reqs = list(
+ /datum/reagent/consumable/milk = 5,
+ /obj/item/weapon/reagent_containers/food/snacks/dough = 1
+ )
+ result = /obj/item/weapon/reagent_containers/food/snacks/cakebatter
+
+/datum/table_recipe/cakebatter/alt
+ reqs = list(
+ /datum/reagent/consumable/soymilk = 5,
+ /obj/item/weapon/reagent_containers/food/snacks/dough = 1
+ )
+
+/datum/table_recipe/piedough
+ name = "Pie Dough"
+ reqs = list(
+ /datum/reagent/consumable/milk = 5,
+ /obj/item/weapon/reagent_containers/food/snacks/flatdough = 1
+ )
+ result = /obj/item/weapon/reagent_containers/food/snacks/piedough
+
+/datum/table_recipe/piedough/alt
+ reqs = list(
+ /datum/reagent/consumable/soymilk = 5,
+ /obj/item/weapon/reagent_containers/food/snacks/flatdough = 1
+ )
+
+/datum/table_recipe/rawpastrybase
+ name = "Raw Pastry Base"
+ reqs = list(
+ /datum/reagent/consumable/milk = 5,
+ /obj/item/weapon/reagent_containers/food/snacks/doughslice = 1
+ )
+ result = /obj/item/weapon/reagent_containers/food/snacks/rawpastrybase
+
+/datum/table_recipe/rawpastrybase/alt
+ reqs = list(
+ /datum/reagent/consumable/soymilk = 5,
+ /obj/item/weapon/reagent_containers/food/snacks/doughslice = 1
+ )
+
+
+
+
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_egg.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_egg.dm
index 4a0dbc40a0798..98dee93aed556 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_egg.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_egg.dm
@@ -32,7 +32,7 @@
name = "Eggs benedict"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/friedegg = 1,
- /obj/item/weapon/reagent_containers/food/snacks/meat/steak = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/meatsteak = 1,
/obj/item/weapon/reagent_containers/food/snacks/breadslice/plain = 1,
)
result = /obj/item/weapon/reagent_containers/food/snacks/benedict
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_meat.dm
index 9681bea3478d4..6f1ec65b1f615 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_meat.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_meat.dm
@@ -6,7 +6,7 @@
name = "Human kebab"
reqs = list(
/obj/item/stack/rods = 1,
- /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain/human = 2
+ /obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain/human = 2
)
result = /obj/item/weapon/reagent_containers/food/snacks/kebab/human
@@ -14,7 +14,7 @@
name = "Kebab"
reqs = list(
/obj/item/stack/rods = 1,
- /obj/item/weapon/reagent_containers/food/snacks/meat/steak = 2
+ /obj/item/weapon/reagent_containers/food/snacks/meatsteak = 2
)
result = /obj/item/weapon/reagent_containers/food/snacks/kebab/monkey
@@ -72,7 +72,7 @@
reqs = list(
/datum/reagent/consumable/sodiumchloride = 1,
/obj/item/weapon/reagent_containers/food/snacks/spidereggs = 1,
- /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/spider = 2
+ /obj/item/weapon/reagent_containers/food/snacks/cutlet/spider = 2
)
result = /obj/item/weapon/reagent_containers/food/snacks/spidereggsham
@@ -82,26 +82,33 @@
name = "Corned beef"
reqs = list(
/datum/reagent/consumable/sodiumchloride = 5,
- /obj/item/weapon/reagent_containers/food/snacks/meat/steak = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/meatsteak = 1,
/obj/item/weapon/reagent_containers/food/snacks/grown/cabbage = 2
)
result = /obj/item/weapon/reagent_containers/food/snacks/cornedbeef
+
+/datum/table_recipe/tendies
+ name = "Chicken Tendies"
+ reqs = list(
+ /datum/reagent/consumable/sodiumchloride = 10,
+ /obj/item/weapon/reagent_containers/food/snacks/faggot = 1
+ )
+ result = /obj/item/weapon/reagent_containers/food/snacks/tendies
-/datum/table_recipe/bearsteak
- name = "Filet migrawr"
+/datum/table_recipe/wingfangchu
+ name = "Wingfangchu"
reqs = list(
- /datum/reagent/consumable/ethanol/manly_dorf = 5,
- /obj/item/weapon/reagent_containers/food/snacks/meat/steak/bear = 1,
+ /datum/reagent/consumable/soysauce = 5,
+ /obj/item/weapon/reagent_containers/food/snacks/cutlet/xeno = 2
)
- tools = list(/obj/item/weapon/lighter)
- result = /obj/item/weapon/reagent_containers/food/snacks/bearsteak
+ result = /obj/item/weapon/reagent_containers/food/snacks/wingfangchu
/datum/table_recipe/enchiladas
name = "Enchiladas"
reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 2,
+ /obj/item/weapon/reagent_containers/food/snacks/cutlet = 2,
/obj/item/weapon/reagent_containers/food/snacks/grown/chili = 2,
- /obj/item/weapon/reagent_containers/food/snacks/tortilla = 2
+ /obj/item/weapon/reagent_containers/food/snacks/grown/corn = 1
)
result = /obj/item/weapon/reagent_containers/food/snacks/enchiladas
@@ -118,6 +125,6 @@
name = "Sausage"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/faggot = 1,
- /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 2
+ /obj/item/weapon/reagent_containers/food/snacks/cutlet = 2
)
result = /obj/item/weapon/reagent_containers/food/snacks/sausage
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_misc.dm
index 77389e002394d..f185b8e5cba58 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_misc.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_misc.dm
@@ -50,7 +50,7 @@
/obj/item/weapon/reagent_containers/food/snacks/friedegg = 1,
/obj/item/weapon/reagent_containers/food/snacks/grown/cabbage = 1,
)
- result = /obj/item/weapon/reagent_containers/food/snacks/eggwrap
+ result = /obj/item/weapon/reagent_containers/food/snacks/wrap
/datum/table_recipe/beans
name = "Beans"
@@ -103,115 +103,3 @@
)
result = /obj/item/weapon/reagent_containers/food/snacks/twobread
-/datum/table_recipe/burrito
- name ="Burrito"
- reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/tortilla = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans = 2
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/burrito
-
-/datum/table_recipe/cheesyburrito
- name ="Cheesy burrito"
- reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/tortilla = 1,
- /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 2,
- /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/cheesyburrito
-
-/datum/table_recipe/carneburrito
- name ="Carne de asada burrito"
- reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/tortilla = 1,
- /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 2,
- /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/carneburrito
-
-/datum/table_recipe/fuegoburrito
- name ="Fuego plasma burrito"
- reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/tortilla = 1,,
- /obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chili = 2,
- /obj/item/weapon/reagent_containers/food/snacks/grown/soybeans = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/fuegoburrito
-
-/datum/table_recipe/melonfruitbowl
- name ="Melon fruit bowl"
- reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/grown/watermelon = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/apple = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lemon = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/banana = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/melonfruitbowl
-
-/datum/table_recipe/spacefreezy
- name ="Space freezy"
- reqs = list(
- /datum/reagent/consumable/bluecherryjelly = 5,
- /datum/reagent/consumable/spacemountainwind = 15,
- /obj/item/weapon/reagent_containers/food/snacks/icecream = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/spacefreezy
-
-/datum/table_recipe/sundae
- name ="Sundae"
- reqs = list(
- /datum/reagent/consumable/cream = 5,
- /obj/item/weapon/reagent_containers/food/snacks/grown/cherries = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/banana = 1,
- /obj/item/weapon/reagent_containers/food/snacks/icecream = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/sundae
-
-/datum/table_recipe/honkdae
- name ="Honkdae"
- reqs = list(
- /datum/reagent/consumable/cream = 5,
- /obj/item/clothing/mask/gas/clown_hat = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/cherries = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/banana = 2,
- /obj/item/weapon/reagent_containers/food/snacks/icecream = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/honkdae
-
-/datum/table_recipe/nachos
- name ="Nachos"
- reqs = list(
- /datum/reagent/consumable/sodiumchloride = 1,
- /obj/item/weapon/reagent_containers/food/snacks/tortilla = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/nachos
-
-/datum/table_recipe/cheesynachos
- name ="Cheesy nachos"
- reqs = list(
- /datum/reagent/consumable/sodiumchloride = 1,
- /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 1,
- /obj/item/weapon/reagent_containers/food/snacks/tortilla = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/cheesynachos
-
-/datum/table_recipe/cubannachos
- name ="Cuban nachos"
- reqs = list(
- /datum/reagent/consumable/ketchup = 5,
- /obj/item/weapon/reagent_containers/food/snacks/grown/chili = 2,
- /obj/item/weapon/reagent_containers/food/snacks/tortilla = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/cubannachos
-
-/datum/table_recipe/melonkeg
- name ="Melon keg"
- reqs = list(
- /datum/reagent/consumable/ethanol/vodka = 25,
- /obj/item/weapon/reagent_containers/food/snacks/grown/holymelon = 1,
- /obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 1
- )
- parts = list(/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 1)
- result = /obj/item/weapon/reagent_containers/food/snacks/melonkeg
\ No newline at end of file
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm
index 7742687f49c46..aba37404d2fa2 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_pastry.dm
@@ -68,7 +68,7 @@
name = "Soylent green"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/pastrybase = 2,
- /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human = 2
+ /obj/item/weapon/reagent_containers/food/snacks/meat/human = 2
)
result = /obj/item/weapon/reagent_containers/food/snacks/soylentgreen
@@ -210,36 +210,3 @@
/obj/item/weapon/reagent_containers/food/snacks/chocolatebar = 1
)
result = /obj/item/weapon/reagent_containers/food/snacks/chococornet
-
-/datum/table_recipe/oatmealcookie
- name = "Oatmeal cookie"
- reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/oat = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/oatmealcookie
-
-/datum/table_recipe/raisincookie
- name = "Raisin cookie"
- reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/no_raisin = 1,
- /obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/oat = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/raisincookie
-
-/datum/table_recipe/cherrycupcake
- name = "Cherry cupcake"
- reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/cherries = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/cherrycupcake
-
-/datum/table_recipe/bluecherrycupcake
- name = "Blue cherry cupcake"
- reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/pastrybase = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/bluecherries = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/bluecherrycupcake
\ No newline at end of file
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_pie.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_pie.dm
index ea19ac642bc53..89793d65b33e8 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_pie.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_pie.dm
@@ -18,7 +18,7 @@
/datum/reagent/consumable/blackpepper = 1,
/datum/reagent/consumable/sodiumchloride = 1,
/obj/item/weapon/reagent_containers/food/snacks/pie/plain = 1,
- /obj/item/weapon/reagent_containers/food/snacks/meat/steak/plain = 1
+ /obj/item/weapon/reagent_containers/food/snacks/meatsteak/plain = 1
)
result = /obj/item/weapon/reagent_containers/food/snacks/pie/meatpie
@@ -34,7 +34,7 @@
name = "Xeno pie"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/pie/plain = 1,
- /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/xeno = 1
+ /obj/item/weapon/reagent_containers/food/snacks/cutlet/xeno = 1
)
result = /obj/item/weapon/reagent_containers/food/snacks/pie/xemeatpie
@@ -54,15 +54,6 @@
)
result = /obj/item/weapon/reagent_containers/food/snacks/pie/berryclafoutis
-/datum/table_recipe/bearypie
- name = "Beary Pie"
- reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/pie/plain = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/berries = 1,
- /obj/item/weapon/reagent_containers/food/snacks/meat/steak/bear = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/pie/bearypie
-
/datum/table_recipe/amanitapie
name = "Amanita pie"
reqs = list(
@@ -95,7 +86,7 @@
/obj/item/weapon/reagent_containers/food/snacks/pie/plain = 1,
/obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin = 1
)
- result = /obj/item/weapon/reagent_containers/food/snacks/pie/pumpkinpie
+ result = /obj/item/weapon/reagent_containers/food/snacks/pumpkinpie
/datum/table_recipe/goldenappletart
name = "Golden apple tart"
@@ -107,29 +98,3 @@
)
result = /obj/item/weapon/reagent_containers/food/snacks/pie/appletart
-/datum/table_recipe/blumpkinpie
- name = "Blumpkin pie"
- reqs = list(
- /datum/reagent/consumable/milk = 5,
- /datum/reagent/consumable/sugar = 5,
- /obj/item/weapon/reagent_containers/food/snacks/pie/plain = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/blumpkin = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/pie/blumpkinpie
-
-/datum/table_recipe/dulcedebatata
- name = "Dulce de batata"
- reqs = list(
- /datum/reagent/consumable/vanilla = 5,
- /datum/reagent/water = 5,
- /obj/item/weapon/reagent_containers/food/snacks/grown/sweetpotato = 2
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/pie/dulcedebatata
-
-/datum/table_recipe/frostypie
- name = "Frosty pie"
- reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/pie/plain = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/bluecherries = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/pie/frostypie
\ No newline at end of file
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_pizza.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_pizza.dm
index 66702272f7b2f..ea7273b45149b 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_pizza.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_pizza.dm
@@ -16,11 +16,11 @@
name = "Meat pizza"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/pizzabread = 1,
- /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 4,
+ /obj/item/weapon/reagent_containers/food/snacks/cutlet = 4,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 1,
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1
)
- result = /obj/item/weapon/reagent_containers/food/snacks/pizza/meat
+ result = /obj/item/weapon/reagent_containers/food/snacks/pizza/meatpizza
/datum/table_recipe/mushroompizza
name = "Mushroom pizza"
@@ -28,7 +28,7 @@
/obj/item/weapon/reagent_containers/food/snacks/pizzabread = 1,
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom = 5
)
- result = /obj/item/weapon/reagent_containers/food/snacks/pizza/mushroom
+ result = /obj/item/weapon/reagent_containers/food/snacks/pizza/mushroompizza
/datum/table_recipe/vegetablepizza
name = "Vegetable pizza"
@@ -39,34 +39,6 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/corn = 1,
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1
)
- result = /obj/item/weapon/reagent_containers/food/snacks/pizza/vegetable
+ result = /obj/item/weapon/reagent_containers/food/snacks/pizza/vegetablepizza
-/datum/table_recipe/donpocketpizza
- name = "Donkpocket pizza"
- reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/pizzabread = 1,
- /obj/item/weapon/reagent_containers/food/snacks/donkpocket/warm = 3,
- /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/pizza/donkpocket
-
-/datum/table_recipe/dankpizza
- name = "Dank pizza"
- reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/pizzabread = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/vulgaris = 3,
- /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/pizza/dank
-/datum/table_recipe/sassysagepizza
- name = "Sassysage pizza"
- reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/pizzabread = 1,
- /obj/item/weapon/reagent_containers/food/snacks/faggot = 3,
- /obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/pizza/sassysage
\ No newline at end of file
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_salad.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_salad.dm
index 900b636be07d8..3121f865b8119 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_salad.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_salad.dm
@@ -42,74 +42,3 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/banana = 1
)
result = /obj/item/weapon/reagent_containers/food/snacks/soup/monkeysdelight
-
-/datum/table_recipe/oatmeal
- name = "Oatmeal"
- reqs = list(
- /datum/reagent/consumable/milk = 10,
- /obj/item/weapon/reagent_containers/glass/bowl = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/oat = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/salad/oatmeal
-
-/datum/table_recipe/fruitsalad
- name = "Fruit salad"
- reqs = list(
- /obj/item/weapon/reagent_containers/glass/bowl = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/apple = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/grapes = 1,
- /obj/item/weapon/reagent_containers/food/snacks/watermelonslice = 2
-
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/salad/fruit
-
-/datum/table_recipe/junglesalad
- name = "Jungle salad"
- reqs = list(
- /obj/item/weapon/reagent_containers/glass/bowl = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/apple = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/grapes = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/banana = 2,
- /obj/item/weapon/reagent_containers/food/snacks/watermelonslice = 2
-
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/salad/jungle
-
-/datum/table_recipe/citrusdelight
- name = "Citrus delight"
- reqs = list(
- /obj/item/weapon/reagent_containers/glass/bowl = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lime = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/lemon = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/citrus/orange = 1
-
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/salad/citrusdelight
-
-/datum/table_recipe/ricepork
- name = "Rice and pork"
- reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/salad/boiledrice = 1,
- /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 2
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/salad/ricepork
-
-/datum/table_recipe/eggbowl
- name = "Egg bowl"
- reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/salad/boiledrice = 1,
- /obj/item/weapon/reagent_containers/food/snacks/boiledegg = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/carrot = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/corn = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/salad/eggbowl
-
-/datum/table_recipe/ricepudding
- name = "Rice pudding"
- reqs = list(
- /datum/reagent/consumable/milk = 5,
- /datum/reagent/consumable/sugar = 5,
- /obj/item/weapon/reagent_containers/food/snacks/salad/boiledrice = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/salad/ricepudding
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_sandwich.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_sandwich.dm
index e95748af7222e..57e1a1f661418 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_sandwich.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_sandwich.dm
@@ -10,7 +10,7 @@
name = "Sandwich"
reqs = list(
/obj/item/weapon/reagent_containers/food/snacks/breadslice/plain = 2,
- /obj/item/weapon/reagent_containers/food/snacks/meat/steak = 1,
+ /obj/item/weapon/reagent_containers/food/snacks/meatsteak = 1,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge = 1
)
result = /obj/item/weapon/reagent_containers/food/snacks/sandwich
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_soup.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_soup.dm
index b6e1617356231..dbbb223303505 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_soup.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_soup.dm
@@ -37,15 +37,6 @@
)
result = /obj/item/weapon/reagent_containers/food/snacks/soup/nettle
-/datum/table_recipe/wingfangchu
- name = "Wingfangchu"
- reqs = list(
- /obj/item/weapon/reagent_containers/glass/bowl = 1,
- /datum/reagent/consumable/soysauce = 5,
- /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet/xeno = 2
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/soup/wingfangchu
-
/datum/table_recipe/wishsoup
name = "Wish soup"
reqs = list(
@@ -58,7 +49,7 @@
name = "Hot chili"
reqs = list(
/obj/item/weapon/reagent_containers/glass/bowl = 1,
- /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 2,
+ /obj/item/weapon/reagent_containers/food/snacks/cutlet = 2,
/obj/item/weapon/reagent_containers/food/snacks/grown/chili = 1,
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1
)
@@ -68,7 +59,7 @@
name = "Cold chili"
reqs = list(
/obj/item/weapon/reagent_containers/glass/bowl = 1,
- /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 2,
+ /obj/item/weapon/reagent_containers/food/snacks/cutlet = 2,
/obj/item/weapon/reagent_containers/food/snacks/grown/icepepper = 1,
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1
)
@@ -159,7 +150,7 @@
/datum/reagent/water = 10,
/obj/item/weapon/reagent_containers/glass/bowl = 1,
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato = 1,
- /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 3,
+ /obj/item/weapon/reagent_containers/food/snacks/cutlet = 3,
/obj/item/weapon/reagent_containers/food/snacks/grown/potato = 1,
/obj/item/weapon/reagent_containers/food/snacks/grown/carrot = 1,
/obj/item/weapon/reagent_containers/food/snacks/grown/eggplant = 1,
@@ -185,22 +176,5 @@
)
result = /obj/item/weapon/reagent_containers/food/snacks/soup/amanitajelly
-/datum/table_recipe/sweetpotatosoup
- name = "Sweet potato soup"
- reqs = list(
- /datum/reagent/water = 10,
- /datum/reagent/consumable/sugar = 5,
- /obj/item/weapon/reagent_containers/glass/bowl = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/sweetpotato = 2
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/soup/sweetpotato
-/datum/table_recipe/redbeetsoup
- name = "Red beet soup"
- reqs = list(
- /datum/reagent/water = 10,
- /obj/item/weapon/reagent_containers/glass/bowl = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/redbeet = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/soup/beet/red
+
diff --git a/code/modules/food&drinks/recipes/tablecraft/recipes_spaghetti.dm b/code/modules/food&drinks/recipes/tablecraft/recipes_spaghetti.dm
index a23c2b09c2ded..c33b2cd7a5b95 100644
--- a/code/modules/food&drinks/recipes/tablecraft/recipes_spaghetti.dm
+++ b/code/modules/food&drinks/recipes/tablecraft/recipes_spaghetti.dm
@@ -34,22 +34,4 @@
)
result = /obj/item/weapon/reagent_containers/food/snacks/spesslaw
-/datum/table_recipe/beefnoodle
- name = "Beef noodle"
- reqs = list(
- /obj/item/weapon/reagent_containers/glass/bowl = 1,
- /obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti = 1,
- /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 2,
- /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/beefnoodle
-/datum/table_recipe/chowmein
- name = "Chowmein"
- reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/boiledspaghetti = 1,
- /obj/item/weapon/reagent_containers/food/snacks/meat/cutlet = 1,
- /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage = 2,
- /obj/item/weapon/reagent_containers/food/snacks/grown/carrot = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/chowmein
\ No newline at end of file
diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm
deleted file mode 100644
index 36c2065040059..0000000000000
--- a/code/modules/holiday/easter.dm
+++ /dev/null
@@ -1,235 +0,0 @@
-//Easter start
-/datum/holiday/easter/greet()
- return "Greetings! Have a Happy Easter and keep an eye out for Easter Bunnies!"
-
-/datum/round_event_control/easter
- name = "Easter Eggselence"
- holidayID = EASTER
- typepath = /datum/round_event/easter
- weight = -1
- max_occurrences = 1
- earliest_start = 0
-
-/datum/round_event/easter/announce()
- priority_announce(pick("Hip-hop into Easter!","Find some Bunny's stash!","Today is National 'Hunt a Wabbit' Day.","Be kind, give Chocolate Eggs!"))
-
-
-/datum/round_event_control/rabbitrelease
- name = "Release the Rabbits!"
- typepath = /datum/round_event/rabbitrelease
- weight = 5
- max_occurrences = 10
-
-/datum/round_event/rabbitrelease/announce()
- priority_announce("Unidentified furry objects detected coming aboard [station_name()]. Beware of Adorable-ness.", "Fluffy Alert", 'sound/AI/aliens.ogg')
-
-
-/datum/round_event/rabbitrelease/start()
- for(var/obj/effect/landmark/R in landmarks_list)
- if(R.name != "blobspawn")
- if(prob(35))
- if(istype(R.loc,/turf/space))
- new /mob/living/simple_animal/chicken/rabbit/space(R.loc)
- else
- new /mob/living/simple_animal/chicken/rabbit(R.loc)
-
-/mob/living/simple_animal/chicken/rabbit
- name = "\improper rabbit"
- desc = "The hippiest hop around."
- icon = 'icons/mob/Easter.dmi'
- icon_state = "rabbit"
- icon_living = "rabbit"
- icon_dead = "rabbit_dead"
- speak = list("Hop into Easter!","Come get your eggs!","Prizes for everyone!")
- speak_emote = list("sniffles","twitches")
- emote_hear = list("hops.")
- emote_see = list("hops around","bounces up and down")
- meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/slab
- egg_type = /obj/item/weapon/reagent_containers/food/snacks/egg/loaded
- food_type = /obj/item/weapon/reagent_containers/food/snacks/grown/carrot
- meat_amount = 1
- eggsleft = 10
- eggsFertile = FALSE
- icon_prefix = "rabbit"
- feedMessages = list("It nibbles happily.","It noms happily.")
- layMessage = list("hides an egg.","scampers around suspiciously.","begins making a huge racket.","begins shuffling.")
-
-/mob/living/simple_animal/chicken/rabbit/space
- icon_prefix = "s_rabbit"
- icon_state = "s_rabbit"
- icon_living = "s_rabbit"
- icon_dead = "s_rabbit_dead"
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- minbodytemp = 0
- maxbodytemp = 1500
- unsuitable_atmos_damage = 0 //This damage is taken when atmos doesn't fit all the requirements above
-
-//Easter Baskets
-/obj/item/weapon/storage/bag/easterbasket
- name = "Easter Basket"
- icon = 'icons/mob/Easter.dmi'
- icon_state = "basket"
- can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/egg,/obj/item/weapon/reagent_containers/food/snacks/chocolateegg,/obj/item/weapon/reagent_containers/food/snacks/boiledegg)
-
-/obj/item/weapon/storage/bag/easterbasket/proc/countEggs()
- overlays.Cut()
- overlays += image("icon" = icon, "icon_state" = "basket-grass", "layer" = -1)
- overlays += image("icon" = icon, "icon_state" = "basket-egg[contents.len <= 5 ? contents.len : 5]", "layer" = -1)
-
-/obj/item/weapon/storage/bag/easterbasket/remove_from_storage(obj/item/W as obj, atom/new_location)
- ..()
- countEggs()
-
-/obj/item/weapon/storage/bag/easterbasket/handle_item_insertion(obj/item/I, prevent_warning = 0)
- ..()
- countEggs()
-
-//Bunny Suit
-/obj/item/clothing/head/bunnyhead
- name = "Easter Bunny Head"
- icon_state = "bunnyhead"
- item_state = "bunnyhead"
- desc = "Considerably more cute than 'Frank'"
- slowdown = -1
- flags = BLOCKHAIR
- flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
-
-/obj/item/clothing/suit/bunnysuit
- name = "Easter Bunny Suit"
- desc = "Hop Hop Hop!"
- icon_state = "bunnysuit"
- item_state = "bunnysuit"
- slowdown = -1
- body_parts_covered = CHEST|GROIN|LEGS|ARMS
- flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
-
-//Egg prizes and egg spawns!
-/obj/item/weapon/reagent_containers/food/snacks/egg
- var/containsPrize = FALSE
-
-/obj/item/weapon/reagent_containers/food/snacks/egg/loaded
- containsPrize = TRUE
-
-/obj/item/weapon/reagent_containers/food/snacks/egg/loaded/New()
- ..()
- var/color = pick("blue","green","mime","orange","purple","rainbow","red","yellow")
- icon_state = "egg-[color]"
- item_color = "[color]"
-
-/obj/item/weapon/reagent_containers/food/snacks/egg/proc/dispensePrize(var/turf/where)
- var/won = pick(/obj/item/clothing/head/bunnyhead,
- /obj/item/clothing/suit/bunnysuit,
- /obj/item/weapon/reagent_containers/food/snacks/grown/carrot,
- /obj/item/weapon/reagent_containers/food/snacks/chocolateegg,
- /obj/item/toy/balloon,
- /obj/item/toy/gun,
- /obj/item/toy/sword,
- /obj/item/toy/foamblade,
- /obj/item/toy/prize/ripley,
- /obj/item/toy/prize/honk,
- /obj/item/toy/carpplushie,
- /obj/item/toy/redbutton,
- /obj/item/clothing/head/collectable/rabbitears)
- new won(where)
- new/obj/item/weapon/reagent_containers/food/snacks/chocolateegg(where)
-
-/obj/item/weapon/reagent_containers/food/snacks/egg/attack_self(mob/user as mob)
- ..()
- if(containsPrize)
- user << "You unwrap the [src] and find a prize inside!"
- dispensePrize(get_turf(user))
- containsPrize = FALSE
- qdel(src)
-
-/obj/effect/spawner/lootdrop/maintenance/New()
- ..()
- loot += list(/obj/item/weapon/reagent_containers/food/snacks/egg/loaded = 15, /obj/item/weapon/storage/bag/easterbasket = 15)
-
-//Easter Recipes + food
-/obj/item/weapon/reagent_containers/food/snacks/hotcrossbun
- bitesize = 2
- name = "hot-cross bun"
- desc = "The Cross represents the Assistants that died for your sins."
- icon_state = "hotcrossbun"
-
-/datum/table_recipe/hotcrossbun
- name = "Hot-Cross Bun"
- reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/store/bread/plain = 1,
- /datum/reagent/consumable/sugar = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/hotcrossbun
-
-
-/obj/item/weapon/reagent_containers/food/snacks/store/cake/brioche
- name = "brioche cake"
- desc = "A ring of sweet, glazed buns."
- icon_state = "briochecake"
- slice_path = /obj/item/weapon/reagent_containers/food/snacks/cakeslice/brioche
- slices_num = 6
- bonus_reagents = list("nutriment" = 10, "vitamin" = 2)
-
-/obj/item/weapon/reagent_containers/food/snacks/cakeslice/brioche
- name = "brioche cake slice"
- desc = "Delicious sweet-bread. Who needs anything else?"
- icon_state = "briochecake_slice"
- filling_color = "#FFD700"
-
-/datum/table_recipe/briochecake
- name = "Brioche cake"
- reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/store/cake/plain = 1,
- /datum/reagent/consumable/sugar = 2
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/store/cake/brioche
-
-/obj/item/weapon/reagent_containers/food/snacks/scotchegg
- name = "scotch egg"
- desc = "A boiled egg wrapped in a delicious, seasoned meatball."
- icon_state = "scotchegg"
- bonus_reagents = list("nutriment" = 2, "vitamin" = 2)
- bitesize = 3
- filling_color = "#FFFFF0"
- list_reagents = list("nutriment" = 6)
-
-/datum/table_recipe/scotchegg
- name = "Scotch egg"
- reqs = list(
- /datum/reagent/consumable/sodiumchloride = 1,
- /datum/reagent/consumable/blackpepper = 1,
- /obj/item/weapon/reagent_containers/food/snacks/boiledegg = 1,
- /obj/item/weapon/reagent_containers/food/snacks/faggot = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/scotchegg
-
-/obj/item/weapon/reagent_containers/food/snacks/soup/mammi
- name = "Mämmi"
- desc = "A bowl of mushy bread and milk. It reminds you, not too fondly, of a bowel movement."
- icon_state = "mammi"
- bonus_reagents = list("nutriment" = 3, "vitamin" = 1)
- list_reagents = list("nutriment" = 8, "vitamin" = 1)
-
-/datum/table_recipe/mammi
- name = "Mämmi"
- reqs = list(
- /obj/item/weapon/reagent_containers/food/snacks/store/bread/plain = 1,
- /obj/item/weapon/reagent_containers/food/snacks/chocolatebar = 1,
- /datum/reagent/consumable/milk = 5
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/soup/mammi
-
-/obj/item/weapon/reagent_containers/food/snacks/chocolatebunny
- name = "chocolate bunny"
- desc = "Contains less than 10% real rabbit!"
- icon_state = "chocolatebunny"
- bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
- list_reagents = list("nutriment" = 4, "sugar" = 2, "cocoa" = 2)
- filling_color = "#A0522D"
-
-/datum/table_recipe/chocolatebunny
- name = "Chocolate bunny"
- reqs = list(
- /datum/reagent/consumable/sugar = 2,
- /obj/item/weapon/reagent_containers/food/snacks/chocolatebar = 1
- )
- result = /obj/item/weapon/reagent_containers/food/snacks/chocolatebunny
diff --git a/code/modules/holiday/halloween.dm b/code/modules/holiday/halloween.dm
index 1f74c911de08f..8850b6e3f4d0d 100644
--- a/code/modules/holiday/halloween.dm
+++ b/code/modules/holiday/halloween.dm
@@ -234,6 +234,8 @@
maxHealth = 1e6
health = 1e6
emote_see = list("silently stares")
+ heat_damage_per_tick = 0
+ cold_damage_per_tick = 0
unsuitable_atmos_damage = 0
var/timer
@@ -286,6 +288,3 @@
visible_message("[src] seems to be resisting the effect!")
else
..()
-
-/mob/living/simple_animal/hostile/retaliate/clown/insane/handle_temperature_damage()
- return
\ No newline at end of file
diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm
deleted file mode 100644
index 4aa5c710d8fed..0000000000000
--- a/code/modules/holiday/holidays.dm
+++ /dev/null
@@ -1,325 +0,0 @@
-/datum/holiday
- var/name = "Bugsgiving"
- //Right now, only holidays that take place on a certain day or within a time period are supported
- //It would be nice to support things like "the second monday in march" or "the first sunday after the second sunday in june"
- var/begin_day = 1
- var/begin_month = 0
- var/end_day = 0 // Default of 0 means the holiday lasts a single day
- var/end_month = 0
-
-// This proc gets run before the game starts when the holiday is activated. Do festive shit here.
-/datum/holiday/proc/celebrate()
-
-// When the round starts, this proc is ran to get a text message to display to everyone to wish them a happy holiday
-/datum/holiday/proc/greet()
- return "Have a happy [name]!"
-
-// Returns special prefixes for the station name on certain days. You wind up with names like "Christmas Object Epsilon". See new_station_name()
-/datum/holiday/proc/getStationPrefix()
- //get the first word of the Holiday and use that
- var/i = findtext(name," ",1,0)
- return copytext(name,1,i)
-
-// Return 1 if this holidy should be celebrated today
-/datum/holiday/proc/shouldCelebrate(dd, mm, yy)
- if(!end_day)
- end_day = begin_day
- if(!end_month)
- end_month = begin_month
-
- if(end_month > begin_month) //holiday spans multiple months in one year
- if(mm == end_month) //in final month
- if(dd <= end_day)
- return 1
-
- else if(mm == begin_month)//in first month
- if(dd >= begin_day)
- return 1
-
- else if(mm in begin_month to end_month) //holiday spans 3+ months and we're in the middle, day doesn't matter at all
- return 1
-
- else if(end_month == begin_month) // starts and stops in same month, simplest case
- if(mm == begin_month && (dd in begin_day to end_day))
- return 1
-
- else // starts in one year, ends in the next
- if(mm >= begin_month && dd >= begin_day) // Holiday ends next year
- return 1
- if(mm <= end_month && dd <= end_day) // Holiday started last year
- return 1
-
- return 0
-
-// The actual holidays
-
-/datum/holiday/new_year
- name = NEW_YEAR
- begin_day = 30 // 1 day early
- begin_month = DECEMBER
- end_day = 5 //4 days extra
- end_month = JANUARY
-
-/datum/holiday/groundhog
- name = "Groundhog Day"
- begin_day = 2
- begin_month = FEBRUARY
-
-/datum/holiday/valentines
- name = VALENTINES
- begin_day = 9 //6 days early
- begin_month = FEBRUARY
- end_day = 15 //1 day extra
-
-
-/datum/holiday/birthday
- name = "Birthday of Space Station 13"
- begin_day = 16
- begin_month = FEBRUARY
-
-/datum/holiday/birthday/greet()
- return "Say 'Happy Birthday' to Space Station 13, first publicly playable on February 16th, 2003!"
-
-/datum/holiday/random_kindness
- name = "Random Acts of Kindness Day"
- begin_day = 17
- begin_month = FEBRUARY
-
-/datum/holiday/random_kindness/greet()
- return "Go do some random acts of kindness for a stranger!" //haha yeah right
-
-/datum/holiday/pi
- name = "Pi Day"
- begin_day = 14
- begin_month = MARCH
-
-/datum/holiday/no_this_is_patrick
- name = "St. Patrick's Day"
- begin_day = 17
- begin_month = MARCH
-
-/datum/holiday/april_fools
- name = APRIL_FOOLS
- begin_day = 1
- begin_month = APRIL
- end_day = 2 //1 day extra only because this shit just gets annoying fast
-
-/datum/holiday/fourtwenty
- name = "Four-Twenty"
- begin_day = 20
- begin_month = APRIL
-
-/datum/holiday/earth
- name = "Earth Day"
- begin_day = 22
- begin_month = APRIL
-
-/datum/holiday/labor
- name = "Labor Day"
- begin_day = 1
- begin_month = MAY
-
-/datum/holiday/firefighter
- name = "Firefighter's Day"
- begin_day = 4
- begin_month = MAY
-
-// No holidays in June :'(
-
-/datum/holiday/doctor
- name = "Doctor's Day"
- begin_day = 1
- begin_month = JULY
-
-/datum/holiday/UFO
- name = "UFO Day"
- begin_day = 2
- begin_month = JULY
-
-/datum/holiday/writer
- name = "Writer's Day"
- begin_day = 8
- begin_month = JULY
-
-/datum/holiday/friendship
- name = "Friendship Day"
- begin_day = 30
- begin_month = JULY
-
-/datum/holiday/friendship/greet()
- return "Have a magical [name]!"
-
-/datum/holiday/beer
- name = "Beer Day"
- begin_day = 5
- begin_month = AUGUST
-
-/datum/holiday/pirate
- name = "Talk-Like-a-Pirate Day"
- begin_day = 19
- begin_month = SEPTEMBER
-
-/datum/holiday/pirate/greet()
- return "Ye be talkin' like a pirate today or else ye'r walkin' tha plank, matey!"
-
-/datum/holiday/questions
- name = "Stupid-Questions Day"
- begin_day = 28
- begin_month = SEPTEMBER
-
-/datum/holiday/questions/greet()
- return "Are you having a happy [name]?"
-
-/datum/holiday/animal
- name = "Animal's Day"
- begin_day = 4
- begin_month = OCTOBER
-
-/datum/holiday/smile
- name = "Smiling Day"
- begin_day = 7
- begin_month = OCTOBER
-
-/datum/holiday/boss
- name = "Boss' Day"
- begin_day = 16
- begin_month = OCTOBER
-
-/datum/holiday/halloween
- name = HALLOWEEN
- begin_day = 24 //7 days early
- begin_month = OCTOBER
- end_day = 7 //7 days extra
- end_month = NOVEMBER
-
-/datum/holiday/halloween/greet()
- return "Have a spooky Halloween!"
-
-/datum/holiday/vegan
- name = "Vegan Day"
- begin_day = 1
- begin_month = NOVEMBER
-
-/datum/holiday/kindness
- name = "Kindness Day"
- begin_day = 13
- begin_month = NOVEMBER
-
-/datum/holiday/flowers
- name = "Flowers Day"
- begin_day = 19
- begin_month = NOVEMBER
-
-/datum/holiday/hello
- name = "Saying-'Hello' Day"
- begin_day = 21
- begin_month = NOVEMBER
-
-/datum/holiday/hello/greet()
- return "[pick(list("Aloha", "Bonjour", "Hello", "Hi", "Greetings", "Salutations", "Bienvenidos", "Hola", "Howdy"))]! " + ..()
-
-/datum/holiday/human_rights
- name = "Human-Rights Day"
- begin_day = 10
- begin_month = DECEMBER
-
-/datum/holiday/monkey
- name = "Monkey Day"
- begin_day = 14
- begin_month = DECEMBER
-
-/datum/holiday/xmas
- name = CHRISTMAS
- begin_day = 18 //7 days early
- begin_month = DECEMBER
- end_day = 8 //14 days extra, christmas is important
- end_month = JANUARY
-
-/datum/holiday/xmas/greet()
- return "Have a merry Christmas!"
-
-/datum/holiday/boxing
- name = "Boxing Day"
- begin_day = 26
- begin_month = DECEMBER
-
-/datum/holiday/friday_thirteenth
- name = "Friday the 13th"
-
-/datum/holiday/friday_thirteenth/shouldCelebrate(dd, mm, yy)
- if(dd == 13)
- if(time2text(world.timeofday, "DDD") == "Fri")
- return 1
- return 0
-
-/datum/holiday/friday_thirteenth/getStationPrefix()
- return pick("Mike","Friday","Evil","Myers","Murder","Deathly","Stabby")
-
-/datum/holiday/easter
- name = EASTER
- var/const/days_early = 1 //to make editing the holiday easier
- var/const/days_extra = 6
-
-/datum/holiday/easter/shouldCelebrate(dd, mm, yy)
-// Easter's celebration day is as snowflakey as Uhangi's code
-
- if(!begin_month)
-
- var/yy_string = "[yy]"
-// year = days after March 22that Easter falls on that year.
-// For 2015 Easter is on April 5th, so 2015 = 14 since the 5th is 14 days past the 22nd
-// If it's 2040 and this is still in use, invent a time machine and teach me a better way to do this. Also tell us about HL3.
- var/list/easters = list(
- "15" = 14,\
- "16" = 6,\
- "17" = 25,\
- "18" = 10,\
- "19" = 30,\
- "20" = 22,\
- "21" = 13,\
- "22" = 26,\
- "23" = 18,\
- "24" = 9,\
- "25" = 29,\
- "26" = 14,\
- "27" = 6,\
- "28" = 25,\
- "29" = 10,\
- "30" = 30,\
- "31" = 23,\
- "32" = 6,\
- "33" = 26,\
- "34" = 18,\
- "35" = 3,\
- "36" = 22,\
- "37" = 14,\
- "38" = 34,\
- "39" = 19,\
- "40" = 9,\
- )
-
- begin_day = easters[yy_string]
- if(begin_day <= 9)
- begin_day += 22
- begin_month = MARCH
- else
- begin_day -= 9
- begin_month = APRIL
-
- end_day = begin_day + days_extra
- end_month = begin_month
- if(end_day >= 32 && end_month == MARCH) //begins in march, ends in april
- end_day -= 31
- end_month++
- if(end_day >= 31 && end_month == APRIL) //begins in april, ends in june
- end_day -= 30
- end_month++
-
- begin_day -= days_early
- if(begin_day <= 0)
- if(begin_month == APRIL)
- begin_day += 31
- begin_month-- //begins in march, ends in april
-
-// world << "Easter calculates to be on [begin_day] of [begin_month] ([days_early] early) to [end_day] of [end_month] ([days_extra] extra) for 20[yy]"
- return ..()
\ No newline at end of file
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 200846f6c52f8..0d873c95e8ced 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -148,7 +148,7 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/poppy/add_juice()
if(..())
reagents.add_reagent("nutriment", 1 + round((potency / 20), 1))
- reagents.add_reagent("salglu_solution", 1 + round((potency / 20), 1))
+ reagents.add_reagent("hotline", 3 + round((potency / 10), 1))
bitesize = 1 + round(reagents.total_volume / 3, 1)
/obj/item/weapon/reagent_containers/food/snacks/grown/poppy/lily
@@ -466,8 +466,6 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/holymelon/add_juice()
if(..())
- reagents.add_reagent("nutriment", 1 + round((potency / 15), 1))
- reagents.add_reagent("vitamin", 1 + round((potency / 25), 1))
reagents.add_reagent("holywater", 1 + round((potency / 6), 1))
bitesize = 1 + round(reagents.total_volume / 2, 1)
@@ -495,7 +493,7 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/blumpkin
seed = /obj/item/seeds/blumpkinseed
name = "blumpkin"
- desc = "The pumpkin's toxic sibling."
+ desc = "When you're making a mess this blumpkin's there to clean you up."
icon_state = "blumpkin"
filling_color = "#87CEFA"
@@ -621,7 +619,6 @@
name = "mimana"
desc = "It's an excellent prop for a mime."
icon_state = "mimana"
- trash = /obj/item/weapon/grown/bananapeel/mimanapeel
filling_color = "#FFFFEE"
/obj/item/weapon/reagent_containers/food/snacks/grown/mimana/add_juice()
@@ -653,7 +650,7 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/icepepper
seed = /obj/item/seeds/icepepperseed
- name = "ice pepper"
+ name = "ice-pepper"
desc = "It's a mutant strain of chili"
icon_state = "icepepper"
filling_color = "#0000CD"
@@ -668,7 +665,7 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/icepepper/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
. = ..()
if (istype(O, /obj/item/device/analyzer/plant_analyzer))
- user << "- Frost Oil: [reagents.get_reagent_amount("frostoil")]%"
+ user << "- Frostoil: [reagents.get_reagent_amount("frostoil")]%"
/obj/item/weapon/reagent_containers/food/snacks/grown/ghost_chili
@@ -1033,8 +1030,6 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy/add_juice()
reagents.add_reagent("oculine", 3+round(potency / 5, 1))
bitesize = 1 + round(reagents.total_volume / 2, 1)
-/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom
- name = "mushroom"
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/reishi
seed = /obj/item/seeds/reishimycelium
@@ -1231,21 +1226,21 @@ obj/item/weapon/reagent_containers/food/snacks/grown/shell/eggy/add_juice()
bitesize = 1 + round(reagents.total_volume / 2, 1)
switch(potency)
if(0 to 10)
- inside_type = /obj/item/stack/spacecash/
+ inside_type = /obj/item/weapon/spacecash/
if(11 to 20)
- inside_type = /obj/item/stack/spacecash/c10
+ inside_type = /obj/item/weapon/spacecash/c10
if(21 to 30)
- inside_type = /obj/item/stack/spacecash/c20
+ inside_type = /obj/item/weapon/spacecash/c20
if(31 to 40)
- inside_type = /obj/item/stack/spacecash/c50
+ inside_type = /obj/item/weapon/spacecash/c50
if(41 to 50)
- inside_type = /obj/item/stack/spacecash/c100
+ inside_type = /obj/item/weapon/spacecash/c100
if(51 to 60)
- inside_type = /obj/item/stack/spacecash/c200
+ inside_type = /obj/item/weapon/spacecash/c200
if(61 to 80)
- inside_type = /obj/item/stack/spacecash/c500
+ inside_type = /obj/item/weapon/spacecash/c500
else
- inside_type = /obj/item/stack/spacecash/c1000
+ inside_type = /obj/item/weapon/spacecash/c1000
/obj/item/weapon/reagent_containers/food/snacks/grown/gatfruit
diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm
index f3993846124c5..0fe9d609cb7e7 100644
--- a/code/modules/hydroponics/growninedible.dm
+++ b/code/modules/hydroponics/growninedible.dm
@@ -222,7 +222,7 @@
/obj/item/weapon/grown/nettle/death
seed = /obj/item/seeds/deathnettleseed
name = "deathnettle"
- desc = "The glowing \black nettle incites rage\black in you just from looking at it!"
+ desc = "The glowing \black nettle incites rage\black in you just from looking at it!"
icon_state = "deathnettle"
force = 30
throwforce = 15
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index d3a74ed88be0b..7294b80611223 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -405,8 +405,7 @@ obj/machinery/hydroponics/proc/mutatepest()
obj/machinery/hydroponics/proc/applyChemicals(var/datum/reagents/S)
- if(myseed)
- myseed.on_chem_reaction(S) //In case seeds have some special interactions with special chems, currently only used by vines
+ myseed.on_chem_reaction(S) //In case seeds have some special interactions with special chems, currently only used by vines
// Requires 5 mutagen to possibly change species.// Poor man's mutagen.
if(S.has_reagent("mutagen", 5) || S.has_reagent("radium", 10) || S.has_reagent("uranium", 10))
diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm
index 56c309a95fc58..8ab942b1dbce7 100644
--- a/code/modules/hydroponics/seeds.dm
+++ b/code/modules/hydroponics/seeds.dm
@@ -477,11 +477,11 @@
growthstages = 4
/obj/item/seeds/icepepperseed
- name = "pack of ice pepper seeds"
- desc = "These seeds grow into ice pepper plants."
+ name = "pack of ice-pepper seeds"
+ desc = "These seeds grow into ice-pepper plants."
icon_state = "seed-icepepper"
species = "chiliice"
- plantname = "Ice Pepper Plants"
+ plantname = "Ice-Pepper Plants"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/icepepper
lifespan = 25
endurance = 15
@@ -550,7 +550,7 @@
desc = "These may, or may not, grow into oat."
icon_state = "seed-oat"
species = "oat"
- plantname = "Oat Stalks"
+ plantname = "oat Stalks"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/oat
lifespan = 25
endurance = 15
@@ -567,7 +567,7 @@
desc = "These may, or may not, grow into rice."
icon_state = "seed-rice"
species = "rice"
- plantname = "Rice Stalks"
+ plantname = "rice Stalks"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/rice
lifespan = 25
endurance = 15
@@ -577,7 +577,7 @@
potency = 15
oneharvest = 1
plant_type = 0
- growthstages = 3
+ growthstages = 6
/obj/item/seeds/carrotseed
name = "pack of carrot seeds"
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
index 2bc127de6db3c..2e10f1d241b26 100644
--- a/code/modules/library/lib_machines.dm
+++ b/code/modules/library/lib_machines.dm
@@ -162,9 +162,6 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums
name = "book inventory management console"
var/arcanecheckout = 0
screenstate = 0 // 0 - Main Menu, 1 - Inventory, 2 - Checked Out, 3 - Check Out a Book
- verb_say = "beeps"
- verb_ask = "beeps"
- verb_exclaim = "beeps"
var/buffer_book
var/buffer_mob
var/upload_category = "Fiction"
@@ -433,6 +430,11 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums
src.updateUsrDialog()
return
+/obj/machinery/computer/libraryconsole/bookmanagement/say_quote(text)
+ return "flashes, \"[text]\""
+
+
+
/*
* Library Scanner
*/
diff --git a/code/modules/lighting/lighting_system.dm b/code/modules/lighting/lighting_system.dm
deleted file mode 100644
index 7c7eb7264a581..0000000000000
--- a/code/modules/lighting/lighting_system.dm
+++ /dev/null
@@ -1,382 +0,0 @@
-/*
- This is /tg/'s 'newer' lighting system. It's basically a combination of Forum_Account's and ShadowDarke's
- respective lighting libraries heavily modified by Carnwennan for /tg/station with further edits by
- MrPerson. Credits, where due, to them.
-
- Originally, like all other lighting libraries on BYOND, we used areas to render different hard-coded light levels.
- The idea was that this was cheaper than using objects. Well as it turns out, the cost of the system is primarily from the
- massive loops the system has to run, not from the areas or objects actually doing any work. Thus the newer system uses objects
- so we can have more lighting states and smooth transitions between them.
-
- This is a queueing system. Everytime we call a change to opacity or luminosity throwgh SetOpacity() or SetLuminosity(),
- we are simply updating variables and scheduling certain lights/turfs for an update. Actual updates are handled
- periodically by the SSlighting subsystem. Specifically, it runs check() on every light datum that ran changed().
- Then it runs redraw_lighting() on every turf that ran update_lumcount().
-
- Unlike our older system, there are hardcoded maximum luminosities (different for certain atoms).
- This is to cap the cost of creating lighting effects.
- (without this, an atom with luminosity of 20 would have to update 41^2 turfs!) :s
-
- Each light remembers the effect it casts on each turf. It reduces cost of removing lighting effects by a lot!
-
- Known Issues/TODO:
- Shuttles still do not have support for dynamic lighting (I hope to fix this at some point) -probably trivial now
- No directional lighting support. (prototype looked ugly)
- Allow lights to be weaker than 'cap' radius
- Colored lights
-*/
-
-#define LIGHTING_CIRCULAR 1 //comment this out to use old square lighting effects.
-#define LIGHTING_LAYER 15 //Drawing layer for lighting
-#define LIGHTING_CAP 10 //The lumcount level at which alpha is 0 and we're fully lit.
-#define LIGHTING_CAP_FRAC (255/LIGHTING_CAP) //A precal'd variable we'll use in turf/redraw_lighting()
-#define LIGHTING_ICON 'icons/effects/alphacolors.dmi'
-#define LIGHTING_ICON_STATE "white"
-#define LIGHTING_TIME 1.2 //Time to do any lighting change. Actual number pulled out of my ass
-#define LIGHTING_DARKEST_VISIBLE_ALPHA 230 //Anything darker than this is so dark, we'll just consider the whole tile unlit
-
-/datum/light_source
- var/atom/owner
- var/radius = 0
- var/changed = 1
- var/list/effect = list()
- var/__x = 0 //x coordinate at last update
- var/__y = 0 //y coordinate at last update
-
-/datum/light_source/New(atom/A)
- if(!istype(A))
- CRASH("The first argument to the light object's constructor must be the atom that is the light source. Expected atom, received '[A]' instead.")
- ..()
- owner = A
- radius = A.luminosity
- __x = owner.x
- __y = owner.y
- SSlighting.changed_lights |= src
-
-/datum/light_source/Destroy()
- if(owner && owner.light == src)
- remove_effect()
- owner.light = null
- owner = null
- return ..()
-
-//Check a light to see if its effect needs reprocessing. If it does, remove any old effect and create a new one
-/datum/light_source/proc/check()
- if(!owner)
- remove_effect()
- return 0
-
- if(changed)
- changed = 0
- remove_effect()
- return add_effect()
-
- return 1
-
-//Tell the lighting subsystem to check() next fire
-/datum/light_source/proc/changed()
- if(owner)
- __x = owner.x
- __y = owner.y
- if(!changed)
- changed = 1
- SSlighting.changed_lights |= src
-
-//Remove current effect
-/datum/light_source/proc/remove_effect().
- for(var/turf/T in effect)
- T.update_lumcount(-effect[T])
-
- if(T.affecting_lights && T.affecting_lights.len)
- T.affecting_lights -= src
-
- effect.Cut()
-
-//Apply a new effect
-/datum/light_source/proc/add_effect()
- // only do this if the light is turned on and is on the map
- if(owner && owner.loc && radius > 0)
- effect = list()
- var/turf/To = get_turf(owner)
- var/range = owner.get_light_range(radius)
- for(var/atom/movable/AM in To)
- if(AM == owner)
- continue
- if(AM.opacity)
- range = 0
- break
-
- for(var/turf/T in view(range, To))
- var/delta_lumcount = T.lumen(src)
- if(delta_lumcount > 0)
- effect[T] = delta_lumcount
- T.update_lumcount(delta_lumcount)
-
- if(!T.affecting_lights)
- T.affecting_lights = list()
- T.affecting_lights |= src
-
- return 1
- else
- return 0
-
-//How much light light_source L should apply to src
-/turf/proc/lumen(datum/light_source/L)
- var/distance = 0
-#ifdef LIGHTING_CIRCULAR
- distance = cheap_hypotenuse(x, y, L.__x, L.__y)
-#else
- distance = max(abs(x - L.__x), abs(y - L.__y))
-#endif
- return LIGHTING_CAP * (L.radius - distance) / L.radius
-//LIGHTING_CAP == strength for now
-
-
-/atom
- var/datum/light_source/light
-
-
-//Turfs with opacity when they are constructed will trigger nearby lights to update
-//Turfs and atoms with luminosity when they are constructed will create a light_source automatically
-/turf/New()
- ..()
- if(luminosity)
- light = new(src)
-// luminosity = 0
-
-//Movable atoms with opacity when they are constructed will trigger nearby lights to update
-//Movable atoms with luminosity when they are constructed will create a light_source automatically
-/atom/movable/New()
- ..()
- if(opacity)
- UpdateAffectingLights()
- if(luminosity)
- light = new(src)
-// luminosity = 0
-
-//Objects with opacity will trigger nearby lights to update at next SSlighting fire
-/atom/movable/Destroy()
- qdel(light)
- if(opacity)
- UpdateAffectingLights()
- return ..()
-
-//Objects with opacity will trigger nearby lights of the old location to update at next SSlighting fire
-/atom/movable/Moved(atom/OldLoc, Dir)
- if(isturf(loc))
- if(opacity)
- OldLoc.UpdateAffectingLights()
- else
- if(light)
- light.changed()
- return ..()
-
-//Sets our luminosity.
-//If we have no light it will create one.
-//If we are setting luminosity to 0 the light will be cleaned up by the controller and garbage collected once all its
-//queues are complete.
-//if we have a light already it is merely updated, rather than making a new one.
-/atom/proc/SetLuminosity(new_luminosity)
- if(new_luminosity < 0)
- new_luminosity = 0
-
- if(!light)
- if(!new_luminosity)
- return
- light = new(src)
- else
- if(light.radius == new_luminosity)
- return
- light.radius = new_luminosity
- luminosity = new_luminosity
- light.changed()
-
-/atom/proc/AddLuminosity(delta_luminosity)
- if(light)
- SetLuminosity(light.radius + delta_luminosity)
- else
- SetLuminosity(delta_luminosity)
-
-/area/SetLuminosity(new_luminosity) //we don't want dynamic lighting for areas
- luminosity = !!new_luminosity
-
-
-//change our opacity (defaults to toggle), and then update all lights that affect us.
-/atom/proc/SetOpacity(new_opacity)
- if(new_opacity == null)
- new_opacity = !opacity //default = toggle opacity
- else if(opacity == new_opacity)
- return 0 //opacity hasn't changed! don't bother doing anything
- opacity = new_opacity //update opacity, the below procs now call light updates.
- UpdateAffectingLights()
- return 1
-
-/atom/movable/light
- icon = LIGHTING_ICON
- icon_state = LIGHTING_ICON_STATE
- layer = LIGHTING_LAYER
- mouse_opacity = 0
- blend_mode = BLEND_OVERLAY
- invisibility = INVISIBILITY_LIGHTING
- color = "#000"
- luminosity = 0
- infra_luminosity = 1
- anchored = 1
-
-/atom/movable/light/Destroy()
- return 1
-
-/atom/movable/light/Move()
- return 0
-
-/turf
- var/lighting_lumcount = 0
- var/lighting_changed = 0
- var/atom/movable/light/lighting_object //Will be null for space turfs and anything in a static lighting area
- var/list/affecting_lights //not initialised until used (even empty lists reserve a fair bit of memory)
-
-/turf/ChangeTurf(var/path)
- if(!path || path == type) //Sucks this is here but it would cause problems otherwise.
- return ..()
-
- for(var/obj/effect/decal/cleanable/decal in src.contents)
- qdel(decal)
-
- if(light)
- qdel(light)
-
- var/old_lumcount = lighting_lumcount - initial(lighting_lumcount)
-
- var/list/our_lights //reset affecting_lights if needed
- if(opacity != initial(path:opacity) && old_lumcount)
- UpdateAffectingLights()
-
- if(affecting_lights)
- our_lights = affecting_lights.Copy()
-
- . = ..() //At this point the turf has changed
-
- affecting_lights = our_lights
-
- lighting_changed = 1 //Don't add ourself to SSlighting.changed_turfs
- update_lumcount(old_lumcount)
- lighting_object = locate() in src
- init_lighting()
-
- for(var/turf/space/S in orange(src,1))
- S.update_starlight()
-
-/turf/proc/update_lumcount(amount)
- lighting_lumcount += amount
- if(!lighting_changed)
- SSlighting.changed_turfs += src
- lighting_changed = 1
-
-/turf/space/update_lumcount(amount) //Keep track in case the turf becomes a floor at some point, but don't process.
- lighting_lumcount += amount
-
-/turf/proc/init_lighting()
- var/area/A = loc
- if(!A.lighting_use_dynamic || istype(src, /turf/space))
- lighting_changed = 0
- if(lighting_object)
- lighting_object.alpha = 0
- lighting_object = null
- else
- if(!lighting_object)
- lighting_object = new (src)
- redraw_lighting(1)
-
-/turf/space/init_lighting()
- . = ..()
- if(config.starlight)
- update_starlight()
-
-/turf/proc/redraw_lighting(var/instantly = 0)
- if(lighting_object)
- var/newalpha
- if(lighting_lumcount <= 0)
- newalpha = 255
- else
- lighting_object.luminosity = 1
- if(lighting_lumcount < LIGHTING_CAP)
- var/num = Clamp(lighting_lumcount * LIGHTING_CAP_FRAC, 0, 255)
- newalpha = 255-num
- else //if(lighting_lumcount >= LIGHTING_CAP)
- newalpha = 0
-
- if(lighting_object.alpha != newalpha)
- var/change_time = LIGHTING_TIME
- if(instantly)
- change_time = 0
- animate(lighting_object, alpha = newalpha, time = change_time)
- if(newalpha >= LIGHTING_DARKEST_VISIBLE_ALPHA) //Doesn't actually make it darker or anything, just tells byond you can't see the tile
- animate(luminosity = 0, time = 0)
-
- lighting_changed = 0
-
-/area
- var/lighting_use_dynamic = 1 //Turn this flag off to make the area fullbright
-
-/area/New()
- . = ..()
- if(!lighting_use_dynamic)
- luminosity = 1
-
-/area/proc/SetDynamicLighting()
- lighting_use_dynamic = 1
- luminosity = 0
- for(var/turf/T in src.contents)
- T.init_lighting()
- T.update_lumcount(0)
-
-#undef LIGHTING_LAYER
-#undef LIGHTING_CIRCULAR
-#undef LIGHTING_ICON
-#undef LIGHTING_ICON_STATE
-#undef LIGHTING_TIME
-#undef LIGHTING_CAP
-#undef LIGHTING_CAP_FRAC
-#undef LIGHTING_DARKEST_VISIBLE_ALPHA
-
-
-//set the changed status of all lights which could have possibly lit this atom.
-//We don't need to worry about lights which lit us but moved away, since they will have change status set already
-//This proc can cause lots of lights to be updated. :(
-/atom/proc/UpdateAffectingLights()
-
-/atom/movable/UpdateAffectingLights()
- if(isturf(loc))
- loc.UpdateAffectingLights()
-
-/turf/UpdateAffectingLights()
- if(affecting_lights)
- for(var/datum/light_source/thing in affecting_lights)
- thing.changed() //force it to update at next process()
-
-
-#define LIGHTING_MAX_LUMINOSITY_STATIC 8 //Maximum luminosity to reduce lag.
-#define LIGHTING_MAX_LUMINOSITY_MOBILE 5 //Moving objects have a lower max luminosity since these update more often. (lag reduction)
-#define LIGHTING_MAX_LUMINOSITY_MOB 5
-#define LIGHTING_MAX_LUMINOSITY_TURF 8 //turfs are static too, why was this 1?!
-
-//caps luminosity effects max-range based on what type the light's owner is.
-/atom/proc/get_light_range(radius)
- return min(radius, LIGHTING_MAX_LUMINOSITY_STATIC)
-
-/atom/movable/get_light_range(radius)
- return min(radius, LIGHTING_MAX_LUMINOSITY_MOBILE)
-
-/mob/get_light_range(radius)
- return min(radius, LIGHTING_MAX_LUMINOSITY_MOB)
-
-/obj/machinery/light/get_light_range(radius)
- return min(radius, LIGHTING_MAX_LUMINOSITY_STATIC)
-
-/turf/get_light_range(radius)
- return min(radius, LIGHTING_MAX_LUMINOSITY_TURF)
-
-#undef LIGHTING_MAX_LUMINOSITY_STATIC
-#undef LIGHTING_MAX_LUMINOSITY_MOBILE
-#undef LIGHTING_MAX_LUMINOSITY_MOB
-#undef LIGHTING_MAX_LUMINOSITY_TURF
diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
index 62e7c97d47fe6..4ce35c8a06ee7 100644
--- a/code/modules/mining/equipment_locker.dm
+++ b/code/modules/mining/equipment_locker.dm
@@ -171,8 +171,6 @@
if(out.amount >= 1)
inp.amount -= out.amount
unload_mineral(out)
- if(inp.amount < 1)
- stack_list -= text2path(href_list["release"])
else
usr << "Required access not found."
if(href_list["plasteel"])
@@ -241,13 +239,12 @@
new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300),
new /datum/data/mining_equipment("Advanced Scanner", /obj/item/device/t_scanner/adv_mining_scanner, 400),
new /datum/data/mining_equipment("Mining Drone", /mob/living/simple_animal/hostile/mining_drone, 500),
- new /datum/data/mining_equipment("GAR mesons", /obj/item/clothing/glasses/meson/gar, 500),
new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator, 750),
new /datum/data/mining_equipment("Resonator", /obj/item/weapon/resonator, 800),
new /datum/data/mining_equipment("Lazarus Injector", /obj/item/weapon/lazarus_injector, 1000),
new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/weapon/pickaxe/diamond, 1200),
new /datum/data/mining_equipment("Jetpack", /obj/item/weapon/tank/jetpack/carbondioxide/mining, 1500),
- new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000),
+ new /datum/data/mining_equipment("Space Cash", /obj/item/weapon/spacecash/c1000, 2000),
new /datum/data/mining_equipment("Point Transfer Card", /obj/item/weapon/card/mining_point_card, 500),
)
@@ -353,8 +350,10 @@
new /obj/item/weapon/stock_parts/cell/high(src.loc)
if("Kinetic Accelerator")
new /obj/item/weapon/gun/energy/kinetic_accelerator(src.loc)
+ new /obj/item/weapon/screwdriver(src.loc)
if("Resonator")
new /obj/item/weapon/resonator(src.loc)
+ new /obj/item/weapon/screwdriver(src.loc)
if("Mining Drone")
new /mob/living/simple_animal/hostile/mining_drone(src.loc)
new /obj/item/weapon/weldingtool/hugetank(src.loc)
@@ -376,7 +375,7 @@
/obj/item/weapon/mining_voucher
name = "mining voucher"
desc = "A token to redeem a piece of equipment. Use it on a mining equipment vendor."
- icon = 'icons/obj/mining.dmi'
+ icon = 'icons/obj/items.dmi'
icon_state = "mining_voucher"
w_class = 1
@@ -408,7 +407,7 @@
/obj/item/device/wormhole_jaunter
name = "wormhole jaunter"
desc = "A single use device harnessing outdated wormhole technology, Nanotrasen has since turned its eyes to blue space for more accurate teleportation. The wormholes it creates are unpleasant to travel through, to say the least."
- icon = 'icons/obj/mining.dmi'
+ icon = 'icons/obj/items.dmi'
icon_state = "Jaunter"
item_state = "electronic"
throwforce = 0
@@ -468,7 +467,7 @@
/obj/item/weapon/resonator
name = "resonator"
- icon = 'icons/obj/mining.dmi'
+ icon = 'icons/obj/items.dmi'
icon_state = "resonator"
item_state = "resonator"
desc = "A handheld device that creates small fields of energy that resonate until they detonate, crushing rock. It can also be activated without a target to create a field at the user's location, to act as a delayed time trap. It's more effective in a vacuum."
@@ -481,23 +480,36 @@
var/fieldlimit = 3
/obj/item/weapon/resonator/proc/CreateResonance(var/target, var/creator)
- var/turf/T = get_turf(target)
- if(locate(/obj/effect/resonance) in T)
- return
if(fieldsactive < fieldlimit)
playsound(src,'sound/weapons/resonator_fire.ogg',50,1)
- new /obj/effect/resonance(T, creator, burst_time)
+ new /obj/effect/resonance(get_turf(target), creator, burst_time)
fieldsactive++
- spawn(burst_time)
+ spawn(50)
fieldsactive--
/obj/item/weapon/resonator/attack_self(mob/user as mob)
- if(burst_time == 50)
- burst_time = 30
- user << "You set the resonator's fields to detonate after 3 seconds."
- else
- burst_time = 50
- user << "You set the resonator's fields to detonate after 5 seconds."
+ CreateResonance(src, user)
+ ..()
+
+/obj/item/weapon/resonator/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(istype(W, /obj/item/weapon/screwdriver))
+ if(burst_time == 50)
+ burst_time = 30
+ user << "You set the resonator's fields to detonate after 3 seconds."
+ else
+ burst_time = 50
+ user << "You set the resonator's fields to detonate after 5 seconds."
+
+ else if(istype(W, /obj/item/stack))
+ var/obj/item/stack/S = W
+
+ if(istype(S, /obj/item/stack/sheet/mineral/diamond))
+ if(fieldlimit < 8)
+ fieldlimit++
+ user << "You upgrade [src]'s field generator with diamonds."
+ S.use(1)
+ else
+ user << "The [src.name]'s field generator is at the limit."
/obj/item/weapon/resonator/afterattack(atom/target, mob/user, proximity_flag)
if(proximity_flag)
@@ -556,7 +568,7 @@
/**********************Mining drone**********************/
-/mob/living/simple_animal/hostile/mining_drone
+/mob/living/simple_animal/hostile/mining_drone/
name = "nanotrasen minebot"
desc = "The instructions printed on the side read: This is a small robot used to support miners, can be set to search and collect loose ore, or to help fend off wildlife. A mining scanner can instruct it to drop loose ore. Field repairs can be done with a welder."
icon = 'icons/obj/aibots.dmi'
@@ -567,7 +579,14 @@
mouse_opacity = 1
faction = list("neutral")
a_intent = "harm"
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ min_oxy = 0
+ max_oxy = 0
+ min_tox = 0
+ max_tox = 0
+ min_co2 = 0
+ max_co2 = 0
+ min_n2 = 0
+ max_n2 = 0
minbodytemp = 0
wander = 0
idle_vision_range = 5
@@ -586,7 +605,6 @@
ranged_cooldown_cap = 3
projectiletype = /obj/item/projectile/kinetic
projectilesound = 'sound/weapons/Gunshot4.ogg'
- speak_emote = list("states")
wanted_objects = list(/obj/item/weapon/ore/diamond, /obj/item/weapon/ore/gold, /obj/item/weapon/ore/silver,
/obj/item/weapon/ore/plasma, /obj/item/weapon/ore/uranium, /obj/item/weapon/ore/iron,
/obj/item/weapon/ore/bananium)
@@ -610,7 +628,7 @@
return
..()
-/mob/living/simple_animal/hostile/mining_drone/death()
+/mob/living/simple_animal/hostile/mining_drone/Die()
..()
visible_message("[src] is destroyed!")
new /obj/effect/decal/cleanable/robot_debris(src.loc)
@@ -769,7 +787,7 @@
else
for(M in L)
var/turf/T = get_turf(M)
- var/image/I = image('icons/turf/mining.dmi', loc = T, icon_state = M.scan_state, layer = 18)
+ var/image/I = image('icons/turf/walls.dmi', loc = T, icon_state = M.scan_state, layer = 18)
C.images += I
spawn(30)
if(C)
@@ -797,7 +815,7 @@
/obj/item/device/t_scanner/adv_mining_scanner/scan()
if(!cooldown)
cooldown = 1
- spawn(35)
+ spawn(60)
cooldown = 0
var/turf/t = get_turf(src)
var/list/mobs = recursive_mob_check(t, 1,0,0)
@@ -814,7 +832,7 @@
var/client/C = user.client
for(M in L)
var/turf/T = get_turf(M)
- var/image/I = image('icons/turf/mining.dmi', loc = T, icon_state = M.scan_state, layer = 18)
+ var/image/I = image('icons/turf/walls.dmi', loc = T, icon_state = M.scan_state, layer = 18)
C.images += I
spawn(30)
if(C)
diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm
index e9dc6f7d14ffb..8bfe24ce149c4 100644
--- a/code/modules/mining/laborcamp/laborstacker.dm
+++ b/code/modules/mining/laborcamp/laborstacker.dm
@@ -105,7 +105,7 @@
else
Radio.set_frequency(SEC_FREQ)
Radio.talk_into(src, "[inserted_id.registered_name] has returned to the station. Minerals and Prisoner ID card ready for retrieval.", SEC_FREQ)
- usr << "Shuttle received message and will be sent shortly."
+ usr << "Shuttle recieved message and will be sent shortly."
if(href_list["choice"] == "release")
if(alone_in_area(get_area(loc), usr))
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 717d2ea65123f..fffb61016e5bf 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -11,7 +11,12 @@
/obj/structure/closet/secure_closet/miner
name = "miner's equipment"
- icon_state = "mining"
+ icon_state = "miningsec1"
+ icon_closed = "miningsec"
+ icon_locked = "miningsec1"
+ icon_opened = "miningsecopen"
+ icon_broken = "miningsecbroken"
+ icon_off = "miningsecoff"
req_access = list(access_mining)
/obj/structure/closet/secure_closet/miner/New()
@@ -45,7 +50,7 @@
/obj/item/weapon/pickaxe
name = "pickaxe"
- icon = 'icons/obj/mining.dmi'
+ icon = 'icons/obj/items.dmi'
icon_state = "pickaxe"
flags = CONDUCT
slot_flags = SLOT_BELT
@@ -74,12 +79,12 @@
name = "mining drill"
icon_state = "handdrill"
item_state = "jackhammer"
- digspeed = 25 //available from roundstart, faster than a pickaxe but needs recharging or cell replacements
+ digspeed = 30 //available from roundstart, faster than a pickaxe but needs recharging or cell replacements
digsound = list('sound/weapons/drill.ogg')
hitsound = 'sound/weapons/drill.ogg'
origin_tech = "materials=2;powerstorage=3;engineering=2"
desc = "An electric mining drill for the especially scrawny."
- var/drillcost = 15 //666 mineral walls by default
+ var/drillcost = 125 //80 mineral walls by default
var/obj/item/weapon/stock_parts/cell/high/bcell = null
/obj/item/weapon/pickaxe/drill/New() //this one starts with a cell pre-installed.
@@ -105,18 +110,16 @@
bcell = W
user << "You install a cell in [src]."
update_icon()
- else
+ else if(istype(W, /obj/item/weapon/screwdriver))
+ if(bcell)
+ bcell.updateicon()
+ bcell.loc = get_turf(src.loc)
+ bcell = null
+ user << "You remove the cell from [src]."
+ update_icon()
+ return
..()
-
-/obj/item/weapon/pickaxe/drill/attack_self(mob/user)
- if(bcell)
- bcell.updateicon()
- bcell.loc = get_turf(src.loc)
- bcell = null
- user << "You remove the cell from [src]."
- update_icon()
- else
- user << "There is no cell in [src]."
+ return
/obj/item/weapon/pickaxe/drill/examine(mob/user)
..()
@@ -127,22 +130,6 @@
/obj/item/weapon/pickaxe/drill/cyborg
name = "cyborg mining drill"
- desc = "An integrated electric mining drill."
- var/warned = 0
-
-/obj/item/weapon/pickaxe/drill/cyborg/attack_self(mob/user)
- return //can't remove the drill's cell
-
-/obj/item/weapon/pickaxe/drill/cyborg/proc/use_robot_power(var/mob/living/silicon/robot/R)
- if(!bcell.use(drillcost))
- if(!warned)
- usr << "Drill internal battery depleted, power will be drawn from user's power supply."
- playsound(src, 'sound/weapons/smg_empty_alarm.ogg',50,1)
- warned = 1
- if(!R.cell.use(drillcost))
- R << "You don't have enough charge to drill."
- return 0
- return 1
/obj/item/weapon/pickaxe/drill/diamonddrill
name = "diamond-tipped mining drill"
@@ -150,7 +137,7 @@
digspeed = 10 //it's a fast drill with a relatively low power cost. what more could you ask for?
origin_tech = "materials=6;powerstorage=4;engineering=5"
desc = "Yours is the drill that will pierce the heavens!"
- drillcost = 25 //400 mineral walls by default, but very quickly
+ drillcost = 150 //66 mineral walls by default, but very quickly
/obj/item/weapon/pickaxe/drill/jackhammer
name = "sonic jackhammer"
@@ -160,15 +147,29 @@
origin_tech = "materials=3;powerstorage=2;engineering=2"
digsound = list('sound/weapons/sonic_jackhammer.ogg')
hitsound = 'sound/weapons/sonic_jackhammer.ogg'
- desc = "Cracks rocks with sonic blasts, and doubles as a demolition power tool for smashing walls."
- drillcost = 30 //333 mineral walls by default, but very quickly
+ desc = "Cracks rocks with sonic blasts, and doubles as a demolition power tool for smashing walls.."
+ drillcost = 200
+
+/obj/item/weapon/pickaxe/plasmacutter
+ name = "plasma cutter"
+ icon_state = "plasmacutter"
+ item_state = "gun"
+ w_class = 3 //it is smaller than the pickaxe
+ damtype = "fire"
+ throwforce = 8
+ digspeed = 30 //Mines slightly faster than a normal pickaxe, but doubles as an unlimited-ammo welding tool in some cases such as wall deconstruction
+ digsound = list('sound/weapons/plasma_cutter.ogg')
+ hitsound = 'sound/weapons/plasma_cutter.ogg'
+ origin_tech = "materials=4;plasmatech=3;engineering=3"
+ desc = "A rock cutter that uses bursts of hot plasma. You could use it to cut limbs off of xenos! Or, you know, mine stuff."
+
/*****************************Shovel********************************/
/obj/item/weapon/shovel
name = "shovel"
desc = "A large tool for digging and moving dirt."
- icon = 'icons/obj/mining.dmi'
+ icon = 'icons/obj/items.dmi'
icon_state = "shovel"
flags = CONDUCT
slot_flags = SLOT_BELT
@@ -195,5 +196,8 @@
/obj/structure/closet/crate/miningcar
desc = "A mining car. This one doesn't work on rails, but has to be dragged."
name = "Mining car (not for rails)"
- icon_crate = "miningcar"
+ icon = 'icons/obj/storage.dmi'
icon_state = "miningcar"
+ density = 1
+ icon_opened = "miningcaropen"
+ icon_closed = "miningcar"
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index cdde315c9c57f..38afd36308c8f 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -2,7 +2,7 @@
/turf/simulated/mineral //wall piece
name = "rock"
- icon = 'icons/turf/mining.dmi'
+ icon = 'icons/turf/walls.dmi'
icon_state = "rock_nochance"
oxygen = 0
nitrogen = 0
@@ -10,7 +10,7 @@
density = 1
blocks_air = 1
temperature = TCMB
- var/mineralType = null
+ var/mineralName = ""
var/mineralAmt = 3
var/spread = 0 //will the seam spread?
var/spreadChance = 0 //the percentual chance of an ore spreading to the neighbouring tiles
@@ -38,21 +38,21 @@
if((istype(get_step(src, NORTH), /turf/simulated/floor)) || (istype(get_step(src, NORTH), /turf/space)) || (istype(get_step(src, NORTH), /turf/simulated/shuttle/floor)))
T = get_step(src, NORTH)
if (T)
- T.overlays += image('icons/turf/mining.dmi', "rock_side_s")
+ T.overlays += image('icons/turf/walls.dmi', "rock_side_s")
if((istype(get_step(src, SOUTH), /turf/simulated/floor)) || (istype(get_step(src, SOUTH), /turf/space)) || (istype(get_step(src, SOUTH), /turf/simulated/shuttle/floor)))
T = get_step(src, SOUTH)
if (T)
- T.overlays += image('icons/turf/mining.dmi', "rock_side_n", layer=6)
+ T.overlays += image('icons/turf/walls.dmi', "rock_side_n", layer=6)
if((istype(get_step(src, EAST), /turf/simulated/floor)) || (istype(get_step(src, EAST), /turf/space)) || (istype(get_step(src, EAST), /turf/simulated/shuttle/floor)))
T = get_step(src, EAST)
if (T)
- T.overlays += image('icons/turf/mining.dmi', "rock_side_w", layer=6)
+ T.overlays += image('icons/turf/walls.dmi', "rock_side_w", layer=6)
if((istype(get_step(src, WEST), /turf/simulated/floor)) || (istype(get_step(src, WEST), /turf/space)) || (istype(get_step(src, WEST), /turf/simulated/shuttle/floor)))
T = get_step(src, WEST)
if (T)
- T.overlays += image('icons/turf/mining.dmi', "rock_side_e", layer=6)
+ T.overlays += image('icons/turf/walls.dmi', "rock_side_e", layer=6)
- if (mineralType && mineralAmt && spread && spreadChance)
+ if (mineralName && mineralAmt && spread && spreadChance)
for(var/dir in cardinal)
if(prob(spreadChance))
var/turf/T = get_step(src, dir)
@@ -73,12 +73,7 @@
/turf/simulated/mineral/random
name = "mineral deposit"
icon_state = "rock"
- var/mineralSpawnChanceList = list(
- "Uranium" = 5, "Diamond" = 1, "Gold" = 10,
- "Silver" = 12, "Plasma" = 20, "Iron" = 40,
- "Gibtonite" = 4, "Cave" = 2, "BScrystal" = 1,
- /*, "Adamantine" =5*/)
- //Currently, Adamantine won't spawn as it has no uses. -Durandan
+ var/mineralSpawnChanceList = list("Uranium" = 5, "Diamond" = 1, "Gold" = 10, "Silver" = 12, "Plasma" = 20, "Iron" = 40, "Gibtonite" = 4/*, "Adamantine" =5*/, "Cave" = 2)//Currently, Adamantine won't spawn as it has no uses. -Durandan
var/mineralChance = 13
/turf/simulated/mineral/random/New()
@@ -107,8 +102,6 @@
M = new/turf/simulated/mineral/gibtonite(src)
if("Bananium")
M = new/turf/simulated/mineral/clown(src)
- if("BScrystal")
- M = new/turf/simulated/mineral/bscrystal(src)
/*if("Adamantine")
M = new/turf/simulated/mineral/adamantine(src)*/
if(M)
@@ -119,10 +112,7 @@
/turf/simulated/mineral/random/high_chance
icon_state = "rock_highchance"
mineralChance = 25
- mineralSpawnChanceList = list(
- "Uranium" = 35, "Diamond" = 30,
- "Gold" = 45, "Silver" = 50, "Plasma" = 50,
- "BScrystal" = 20)
+ mineralSpawnChanceList = list("Uranium" = 35, "Diamond" = 30, "Gold" = 45, "Silver" = 50, "Plasma" = 50)
/turf/simulated/mineral/random/high_chance/New()
icon_state = "rock"
@@ -131,34 +121,31 @@
/turf/simulated/mineral/random/low_chance
icon_state = "rock_lowchance"
mineralChance = 6
- mineralSpawnChanceList = list(
- "Uranium" = 2, "Diamond" = 1, "Gold" = 4,
- "Silver" = 6, "Plasma" = 15, "Iron" = 40,
- "Gibtonite" = 2, "BScrystal" = 1)
+ mineralSpawnChanceList = list("Uranium" = 2, "Diamond" = 1, "Gold" = 4, "Silver" = 6, "Plasma" = 15, "Iron" = 40, "Gibtonite" = 2)
/turf/simulated/mineral/random/low_chance/New()
icon_state = "rock"
..()
-/turf/simulated/mineral/iron
- name = "iron deposit"
- icon_state = "rock_Iron"
- mineralType = /obj/item/weapon/ore/iron
- spreadChance = 20
- spread = 1
- hidden = 0
-
/turf/simulated/mineral/uranium
name = "uranium deposit"
- mineralType = /obj/item/weapon/ore/uranium
+ mineralName = "Uranium"
spreadChance = 5
spread = 1
hidden = 1
scan_state = "rock_Uranium"
+/turf/simulated/mineral/iron
+ name = "iron deposit"
+ icon_state = "rock_Iron"
+ mineralName = "Iron"
+ spreadChance = 20
+ spread = 1
+ hidden = 0
+
/turf/simulated/mineral/diamond
name = "diamond deposit"
- mineralType = /obj/item/weapon/ore/diamond
+ mineralName = "Diamond"
spreadChance = 0
spread = 1
hidden = 1
@@ -166,7 +153,7 @@
/turf/simulated/mineral/gold
name = "gold deposit"
- mineralType = /obj/item/weapon/ore/gold
+ mineralName = "Gold"
spreadChance = 5
spread = 1
hidden = 1
@@ -174,7 +161,7 @@
/turf/simulated/mineral/silver
name = "silver deposit"
- mineralType = /obj/item/weapon/ore/silver
+ mineralName = "Silver"
spreadChance = 5
spread = 1
hidden = 1
@@ -183,7 +170,7 @@
/turf/simulated/mineral/plasma
name = "plasma deposit"
icon_state = "rock_Plasma"
- mineralType = /obj/item/weapon/ore/plasma
+ mineralName = "Plasma"
spreadChance = 8
spread = 1
hidden = 1
@@ -192,26 +179,17 @@
/turf/simulated/mineral/clown
name = "bananium deposit"
icon_state = "rock_Clown"
- mineralType = /obj/item/weapon/ore/bananium
+ mineralName = "Bananium"
mineralAmt = 3
spreadChance = 0
spread = 0
hidden = 0
-/turf/simulated/mineral/bscrystal
- name = "bluespace crystal deposit"
- icon_state = "rock_BScrystal"
- mineralType = /obj/item/bluespace_crystal
- mineralAmt = 1
- spreadChance = 0
- spread = 0
- hidden = 1
- scan_state = "rock_BScrystal"
-
////////////////////////////////Gibtonite
/turf/simulated/mineral/gibtonite
name = "gibtonite deposit"
icon_state = "rock_Gibtonite"
+ mineralName = "Gibtonite"
mineralAmt = 1
spreadChance = 0
spread = 0
@@ -417,10 +395,11 @@
if(istype(P, /obj/item/weapon/pickaxe/drill))
var/obj/item/weapon/pickaxe/drill/D = P
if(isrobot(user))
- var/obj/item/weapon/pickaxe/drill/cyborg/RD = D
- if(!RD.use_robot_power(user))
+ var/mob/living/silicon/robot/R = user
+ if(!R.cell.use(D.drillcost))
+ R << "Your [D.name] doesn't have enough charge."
return
- else if(!D.bcell.use(D.drillcost))
+ if(!D.bcell.use(D.drillcost))
user << "Your [D.name] doesn't have enough charge."
return
@@ -440,10 +419,23 @@
return
/turf/simulated/mineral/proc/gets_drilled()
- if (mineralType && (src.mineralAmt > 0) && (src.mineralAmt < 11))
+ if ((src.mineralName != "") && (src.mineralAmt > 0) && (src.mineralAmt < 11))
var/i
for (i=0;i[user] attaches [I] to [src]!")
- wires = new(src)
- attacher = key_name(user)
- qdel(I)
- overlays += "Gibtonite_igniter"
- return
-
- if(wires && !primed)
- if(istype(I, /obj/item/weapon/wirecutters) || istype(I, /obj/item/device/multitool) || istype(I, /obj/item/device/assembly/signaler))
- wires.Interact(user)
- return
-
- if(istype(I, /obj/item/weapon/pickaxe) || istype(I, /obj/item/weapon/resonator) || I.force >= 10)
+ if(istype(I, /obj/item/weapon/pickaxe) || istype(I, /obj/item/weapon/resonator))
GibtoniteReaction(user)
return
- if(primed)
- if(istype(I, /obj/item/device/mining_scanner) || istype(I, /obj/item/device/t_scanner/adv_mining_scanner) || istype(I, /obj/item/device/multitool))
- primed = 0
- user.visible_message("The chain reaction was stopped! ...The ore's quality went down.")
- icon_state = "Gibtonite ore"
- quality = 1
- return
+ if(istype(I, /obj/item/device/mining_scanner) || istype(I, /obj/item/device/t_scanner/adv_mining_scanner) && primed)
+ primed = 0
+ user.visible_message("The chain reaction was stopped! ...The ore's quality went down.")
+ icon_state = "Gibtonite ore"
+ quality = 1
+ return
..()
-/obj/item/weapon/twohanded/required/gibtonite/attack_self(user)
- if(wires)
- wires.Interact(user)
- else
- ..()
-
/obj/item/weapon/twohanded/required/gibtonite/bullet_act(var/obj/item/projectile/P)
- GibtoniteReaction(P.firer)
+ if(istype(P, /obj/item/projectile/kinetic))
+ GibtoniteReaction(P.firer)
..()
/obj/item/weapon/twohanded/required/gibtonite/ex_act()
GibtoniteReaction(null, 1)
-
-
-/obj/item/weapon/twohanded/required/gibtonite/proc/GibtoniteReaction(mob/user, triggered_by = 0)
+/obj/item/weapon/twohanded/required/gibtonite/proc/GibtoniteReaction(mob/user, triggered_by_explosive = 0)
if(!primed)
playsound(src,'sound/effects/hit_on_shattered_glass.ogg',50,1)
primed = 1
@@ -172,18 +149,13 @@
var/notify_admins = 0
if(z != 5)//Only annoy the admins ingame if we're triggered off the mining zlevel
notify_admins = 1
-
if(notify_admins)
- if(triggered_by == 1)
+ if(triggered_by_explosive)
message_admins("An explosion has triggered a [name] to detonate at [A.name] (JMP).")
- else if(triggered_by == 2)
- message_admins("A signal has triggered a [name] to detonate at [A.name] (JMP). Igniter attacher: [attacher]")
else
message_admins("[key_name(user)]? has triggered a [name] to detonate at [A.name] (JMP).")
- if(triggered_by == 1)
+ if(triggered_by_explosive)
log_game("An explosion has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])")
- else if(triggered_by == 2)
- log_game("A signal has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z]). Igniter attacher: [attacher].")
else
user.visible_message("[user] strikes \the [src], causing a chain reaction!")
log_game("[key_name(user)] has primed a [name] for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])")
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index e569986704fba..850f4d63cf771 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -61,8 +61,9 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi
verbs -= /mob/dead/observer/verb/possess
animate(src, pixel_y = 2, time = 10, loop = -1)
- ..()
+
+ ..()
/mob/dead/observer/Destroy()
if (ghostimage)
ghost_darkness_images -= ghostimage
@@ -101,6 +102,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
else
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you may not play again this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
if(response != "Ghost") return //didn't want to ghost after-all
+ resting = 1
ghostize(0) //0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3
return
@@ -349,15 +351,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
src << browse(dat, "window=manifest;size=387x420;can_close=1")
-//this is called when a ghost is drag clicked to something.
-/mob/dead/observer/MouseDrop(atom/over)
- if(!usr || !over) return
- if (isobserver(usr) && usr.client.holder && isliving(over))
- if (usr.client.holder.cmd_ghost_drag(src,over))
- return
-
- return ..()
-
/mob/dead/observer/Topic(href, href_list)
if(href_list["follow"])
var/atom/movable/target = locate(href_list["follow"])
diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm
index bab94a00cacff..039a69b6e9ef3 100644
--- a/code/modules/mob/dead/observer/say.dm
+++ b/code/modules/mob/dead/observer/say.dm
@@ -16,7 +16,7 @@
. = src.say_dead(message)
-/mob/dead/observer/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans)
+/mob/dead/observer/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq)
if(radio_freq)
var/atom/movable/virtualspeaker/V = speaker
speaker = V.source
diff --git a/code/modules/mob/interactive.dm b/code/modules/mob/interactive.dm
index b23a2d439ece8..243534fb3c831 100644
--- a/code/modules/mob/interactive.dm
+++ b/code/modules/mob/interactive.dm
@@ -1,3 +1,24 @@
+#define INTERACTING 2
+#define TRAVEL 4
+#define FIGHTING 8
+
+//TRAITS
+
+#define TRAIT_ROBUST 2
+#define TRAIT_UNROBUST 4
+#define TRAIT_SMART 8
+#define TRAIT_DUMB 16
+#define TRAIT_MEAN 32
+#define TRAIT_FRIENDLY 64
+#define TRAIT_THIEVING 128
+
+//defines
+#define MAX_RANGE_FIND 32
+#define MIN_RANGE_FIND 16
+#define FUZZY_CHANCE_HIGH 85
+#define FUZZY_CHANCE_LOW 50
+#define CHANCE_TALK 15
+
/*
NPC VAR EXPLANATIONS (for modules and other things)
@@ -48,7 +69,6 @@
var/obj/item/other_hand
var/TRAITS = 0
var/datum/job/myjob
- faction = list("station")
//trait vars
var/robustness = 50
var/smartness = 50
@@ -59,31 +79,6 @@
//modules
var/list/functions = list("nearbyscan","combat","doorscan","shitcurity","chatter")
-//botPool funcs
-/mob/living/carbon/human/interactive/proc/takeDelegate(var/mob/living/carbon/human/interactive/from,var/doReset=TRUE)
- eye_color = "red"
- if(from == src)
- return FALSE
- TARGET = from.TARGET
- LAST_TARGET = from.LAST_TARGET
- retal = from.retal
- retal_target = from.retal_target
- doing = from.doing
- //
- timeout = 0
- inactivity_period = 0
- interest = 100
- //
- if(doReset)
- from.TARGET = null
- from.LAST_TARGET = null
- from.retal = 0
- from.retal_target = null
- from.doing = 0
- return TRUE
-
-//end pool funcs
-
/mob/living/carbon/human/interactive/proc/random()
//this is here because this has no client/prefs/brain whatever.
underwear = random_underwear(gender)
@@ -92,7 +87,7 @@
facial_hair_style = random_facial_hair_style(gender)
hair_color = random_short_color()
facial_hair_color = hair_color
- eye_color = "blue"
+ eye_color = random_eye_color()
age = rand(AGE_MIN,AGE_MAX)
ready_dna(src,random_blood_type())
//job handling
@@ -111,12 +106,6 @@
retal = 1
retal_target = user
-/mob/living/carbon/human/interactive/bullet_act(var/obj/item/projectile/P)
- var/potentialAssault = locate(/mob/living) in view(2,P.starting)
- if(potentialAssault)
- attacked_by(P,potentialAssault)
- ..()
-
/mob/living/carbon/human/interactive/New()
..()
gender = pick(MALE,FEMALE)
@@ -142,31 +131,31 @@
zone_sel.selecting = "chest"
if(prob(10)) //my x is augmented
//arms
- if(prob((FUZZY_CHANCE_LOW+FUZZY_CHANCE_HIGH)/2))
+ if(prob(rand(FUZZY_CHANCE_LOW,FUZZY_CHANCE_HIGH)))
var/obj/item/organ/limb/r_arm/R = locate(/obj/item/organ/limb/r_arm) in organs
- qdel(R)
+ del(R)
organs += new /obj/item/organ/limb/robot/r_arm
else
var/obj/item/organ/limb/l_arm/L = locate(/obj/item/organ/limb/l_arm) in organs
- qdel(L)
+ del(L)
organs += new /obj/item/organ/limb/robot/l_arm
//legs
- if(prob((FUZZY_CHANCE_LOW+FUZZY_CHANCE_HIGH)/2))
+ if(prob(rand(FUZZY_CHANCE_LOW,FUZZY_CHANCE_HIGH)))
var/obj/item/organ/limb/r_leg/R = locate(/obj/item/organ/limb/r_leg) in organs
- qdel(R)
+ del(R)
organs += new /obj/item/organ/limb/robot/r_leg
else
var/obj/item/organ/limb/l_leg/L = locate(/obj/item/organ/limb/l_leg) in organs
- qdel(L)
+ del(L)
organs += new /obj/item/organ/limb/robot/l_leg
//chest and head
- if(prob((FUZZY_CHANCE_LOW+FUZZY_CHANCE_HIGH)/2))
+ if(prob(rand(FUZZY_CHANCE_LOW,FUZZY_CHANCE_HIGH)))
var/obj/item/organ/limb/chest/R = locate(/obj/item/organ/limb/chest) in organs
- qdel(R)
+ del(R)
organs += new /obj/item/organ/limb/robot/chest
else
var/obj/item/organ/limb/head/L = locate(/obj/item/organ/limb/head) in organs
- qdel(L)
+ del(L)
organs += new /obj/item/organ/limb/robot/head
for(var/obj/item/organ/limb/LIMB in organs)
LIMB.owner = src
@@ -196,8 +185,6 @@
if(TRAITS & TRAIT_THIEVING)
slyness = 75
- SSbp.insertBot(src)
-
/mob/living/carbon/human/interactive/attack_hand(mob/living/carbon/human/M as mob)
..()
@@ -233,10 +220,10 @@
toReturn = "Excited"
return toReturn
//END DEBUG
-/mob/living/carbon/human/interactive/proc/isnotfunc(var/checkDead = TRUE)
+/mob/living/carbon/human/interactive/proc/isnotfunc()
if(!canmove)
return 1
- if(health <= 0 && checkDead)
+ if(health <= 0)
return 1
if(restrained())
return 1
@@ -286,9 +273,6 @@
else
unEquip(I,TRUE)
update_hands = 1
-
-/mob/living/carbon/human/interactive/proc/targetRange(var/towhere)
- return get_dist(get_turf(towhere), get_turf(src))
/mob/living/carbon/human/interactive/Life()
..()
@@ -357,14 +341,14 @@
//---------TOOLS
if(istype(TARGET, /obj/item/weapon))
var/obj/item/weapon/W = TARGET
- if(W.force >= best_force || prob((FUZZY_CHANCE_LOW+FUZZY_CHANCE_HIGH)/2))
+ if(W.force >= best_force || prob(rand(FUZZY_CHANCE_LOW,FUZZY_CHANCE_HIGH)))
if(!l_hand || !r_hand)
take_to_slot(W)
else
insert_into_backpack()
//---------FASHION
if(istype(TARGET,/obj/item/clothing))
- if(prob((FUZZY_CHANCE_LOW+FUZZY_CHANCE_HIGH)/2))
+ if(prob(rand(FUZZY_CHANCE_LOW,FUZZY_CHANCE_HIGH)))
if(!l_hand || !r_hand)
var/obj/item/clothing/C = TARGET
take_to_slot(C)
@@ -411,15 +395,15 @@
if(nearby.len > 4)
//i'm crowded, time to leave
TARGET = pick(target_filter(orange(MAX_RANGE_FIND,src)))
- else if(prob((FUZZY_CHANCE_LOW+FUZZY_CHANCE_HIGH)/2))
+ else if(prob(rand(FUZZY_CHANCE_LOW,FUZZY_CHANCE_HIGH)))
//chance to chase an item
TARGET = locate(/obj/item) in orange(MIN_RANGE_FIND,src)
- else if(prob((FUZZY_CHANCE_LOW+FUZZY_CHANCE_HIGH)/2))
+ else if(prob(rand(FUZZY_CHANCE_LOW,FUZZY_CHANCE_HIGH)))
//chance to leave
TARGET = locate(/obj/machinery/door) in orange(MIN_RANGE_FIND,src) // this is a sort of fix for the current pathing.
else
//else, target whatever, or go to our department
- if(prob((FUZZY_CHANCE_LOW+FUZZY_CHANCE_HIGH)/2))
+ if(prob(rand(FUZZY_CHANCE_LOW,FUZZY_CHANCE_HIGH)))
TARGET = pick(target_filter(orange(MIN_RANGE_FIND,src)))
else
TARGET = pick(get_area_turfs(job2area(myjob)))
@@ -582,7 +566,7 @@
if((TARGET && (doing & FIGHTING)) || graytide) // this is a redundancy check
var/mob/living/M = TARGET
if(istype(M,/mob/living))
- if(targetRange(M) <= FUZZY_CHANCE_LOW)
+ if(M in range(FUZZY_CHANCE_LOW,src))
if(M.health > 1)
if(main_hand)
if(main_hand.force != 0)
@@ -612,14 +596,14 @@
W.attack(TARGET,src)
sleep(1)
else
- if(targetRange(TARGET) > 2)
+ if(get_dist(src,TARGET) > 2)
tryWalk(TARGET)
else
if(Adjacent(TARGET))
M.attack_hand(src)
sleep(1)
timeout++
- else if(timeout >= 10 || M.health <= 1 || !(targetRange(M) > 14))
+ else if(timeout >= 10 || M.health <= 1 || !(M in range(14,src)))
doing = doing & ~FIGHTING
timeout = 0
TARGET = null
@@ -650,14 +634,12 @@
New()
TRAITS |= TRAIT_ROBUST
TRAITS |= TRAIT_MEAN
- faction = list("bot_angry")
..()
/mob/living/carbon/human/interactive/friendly
New()
TRAITS |= TRAIT_FRIENDLY
TRAITS |= TRAIT_UNROBUST
- faction = list("bot_friendly")
..()
/mob/living/carbon/human/interactive/greytide
@@ -666,6 +648,16 @@
TRAITS |= TRAIT_MEAN
TRAITS |= TRAIT_THIEVING
TRAITS |= TRAIT_DUMB
- faction = list("bot_grey")
graytide = 1
..()
+
+#undef INTERACTING
+#undef TRAVEL
+#undef FIGHTING
+#undef TRAIT_ROBUST
+#undef TRAIT_UNROBUST
+#undef TRAIT_SMART
+#undef TRAIT_DUMB
+#undef TRAIT_MEAN
+#undef TRAIT_FRIENDLY
+#undef TRAIT_THIEVING
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index 79c1960f3a823..1cd79aff95d2c 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -5,13 +5,13 @@
/mob/living/carbon/alien
name = "alien"
voice_name = "alien"
+ say_message = "hisses"
icon = 'icons/mob/alien.dmi'
gender = NEUTER
dna = null
faction = list("alien")
ventcrawler = 2
languages = ALIEN
- verb_say = "hisses"
var/nightvision = 1
var/storedPlasma = 250
var/max_plasma = 500
@@ -27,13 +27,12 @@
var/heat_protection = 0.5
var/leaping = 0
- var/list/obj/effect/proc_holder/alien/abilities = list()
/mob/living/carbon/alien/New()
verbs += /mob/living/proc/mob_sleep
verbs += /mob/living/proc/lay_down
internal_organs += new /obj/item/organ/brain/alien
- AddAbility(new/obj/effect/proc_holder/alien/nightvisiontoggle(null))
+
..()
/mob/living/carbon/alien/adjustToxLoss(amount)
@@ -137,6 +136,9 @@
/mob/living/carbon/alien/IsAdvancedToolUser()
return has_fine_manipulation
+/mob/living/carbon/alien/SpeciesCanConsume()
+ return 1 // Aliens can eat, and they can be fed food/drink
+
/mob/living/carbon/alien/Stat()
..()
@@ -145,26 +147,6 @@
stat(null, "Move Mode: [m_intent]")
stat(null, "Plasma Stored: [getPlasma()]/[max_plasma]")
- add_abilities_to_panel()
-
-/mob/living/carbon/alien/proc/AddAbility(var/obj/effect/proc_holder/alien/A)
- abilities.Add(A)
- A.on_gain(src)
- if(A.has_action)
- if(!A.action)
- A.action = new/datum/action/spell_action/alien
- A.action.target = A
- A.action.name = A.name
- A.action.button_icon = A.action_icon
- A.action.button_icon_state = A.action_icon_state
- A.action.background_icon_state = A.action_background_icon_state
- A.action.Grant(src)
-
-
-/mob/living/carbon/alien/proc/add_abilities_to_panel()
- for(var/obj/effect/proc_holder/alien/A in abilities)
- statpanel("[A.panel]",A.plasma_cost > 0?"([A.plasma_cost])":"",A)
-
/mob/living/carbon/alien/Stun(amount)
if(status_flags & CANSTUN)
stunned = max(max(stunned,amount),0) //can't go below 0, getting a low amount of stun doesn't lower your current stun
@@ -176,6 +158,25 @@
/mob/living/carbon/alien/getTrail()
return "xltrails"
+/mob/living/carbon/alien/cuff_break(obj/item/I, mob/living/carbon/C)
+ playsound(C, 'sound/voice/hiss5.ogg', 40, 1, 1) //Alien roars when breaking free.
+ ..()
+
+/mob/living/carbon/alien/verb/nightvisiontoggle()
+ set name = "Toggle Night Vision"
+ set category = "Alien"
+
+ if(!nightvision)
+ see_in_dark = 8
+ see_invisible = SEE_INVISIBLE_MINIMUM
+ nightvision = 1
+ hud_used.nightvisionicon.icon_state = "nightvision1"
+ else if(nightvision == 1)
+ see_in_dark = 4
+ see_invisible = 45
+ nightvision = 0
+ hud_used.nightvisionicon.icon_state = "nightvision0"
+
/*----------------------------------------
Proc: AddInfectionImages()
Des: Gives the client of the alien an image on each infected mob.
@@ -184,7 +185,7 @@ Des: Gives the client of the alien an image on each infected mob.
if (client)
for (var/mob/living/C in mob_list)
if(C.status_flags & XENO_HOST)
- var/obj/item/body_egg/alien_embryo/A = locate() in C
+ var/obj/item/alien_embryo/A = locate() in C
var/I = image('icons/mob/alien.dmi', loc = C, icon_state = "infected[A.stage]")
client.images += I
return
@@ -204,10 +205,6 @@ Des: Removes all infected images from the alien.
/mob/living/carbon/alien/canBeHandcuffed()
return 1
-/mob/living/carbon/alien/get_standard_pixel_y_offset(lying = 0)
- return initial(pixel_y)
-
-
#undef HEAT_DAMAGE_LEVEL_1
#undef HEAT_DAMAGE_LEVEL_2
#undef HEAT_DAMAGE_LEVEL_3
diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm
index 51e086ae669a1..bb032d309efed 100644
--- a/code/modules/mob/living/carbon/alien/alien_defense.dm
+++ b/code/modules/mob/living/carbon/alien/alien_defense.dm
@@ -76,11 +76,3 @@ In all, this is a lot like the monkey code. /N
adjustBruteLoss(damage)
updatehealth()
-/mob/living/carbon/alien/attack_slime(mob/living/simple_animal/slime/M as mob)
- if(..()) //successful slime attack
- var/damage = rand(5, 35)
- if(M.is_adult)
- damage = rand(10, 40)
- adjustBruteLoss(damage)
- add_logs(M, src, "attacked", admin=0)
- updatehealth()
diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
index f5fa526654fd6..c758e3e4f7a02 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm
@@ -5,282 +5,171 @@ These are general powers. Specific powers are stored under the appropriate alien
/*Alien spit now works like a taser shot. It won't home in on the target but will act the same once it does hit.
Doesn't work on other aliens/AI.*/
-/datum/action/spell_action/alien
-/datum/action/spell_action/alien/UpdateName()
- var/obj/effect/proc_holder/alien/ab = target
- return ab.name
-
-/datum/action/spell_action/alien/IsAvailable()
- if(!target)
- return 0
- var/obj/effect/proc_holder/alien/ab = target
-
- if(usr)
- return ab.cost_check(ab.check_turf,usr,1)
- else
- if(owner)
- return ab.cost_check(ab.check_turf,owner,1)
- return 1
-
-/datum/action/spell_action/alien/CheckRemoval()
- return !isalien(owner)
-
-
-/obj/effect/proc_holder/alien
- name = "Alien Power"
- panel = "Alien"
- var/plasma_cost = 0
- var/check_turf = 0
-
- var/has_action = 1
- var/datum/action/spell_action/alien/action = null
- var/action_icon = 'icons/mob/actions.dmi'
- var/action_icon_state = "spell_default"
- var/action_background_icon_state = "bg_alien"
-
-/obj/effect/proc_holder/alien/Click()
- if(!istype(usr,/mob/living/carbon/alien))
- return 1
- var/mob/living/carbon/alien/user = usr
- if(cost_check(check_turf,user))
- if(fire(user) && user) // Second check to prevent runtimes when evolving
- user.adjustToxLoss(-plasma_cost)
- return 1
-
-/obj/effect/proc_holder/alien/proc/on_gain(var/mob/living/carbon/alien/user)
- return
-
-/obj/effect/proc_holder/alien/proc/fire(var/mob/living/carbon/alien/user)
- return 1
-
-/obj/effect/proc_holder/alien/proc/cost_check(check_turf=0,var/mob/living/carbon/alien/user,var/silent = 0)
- if(user.stat)
- if(!silent)
- user << "You must be conscious to do this."
+/mob/living/carbon/alien/proc/powerc(X, Y)//Y is optional, checks for weed planting. X can be null.
+ if(stat)
+ src << "You must be conscious to do this."
return 0
- if(user.getPlasma() < plasma_cost)
- if(!silent)
- user << "Not enough plasma stored."
+ else if(X && getPlasma() < X)
+ src << "Not enough plasma stored."
return 0
- if(check_turf && (!isturf(user.loc) || istype(user.loc, /turf/space)))
- if(!silent)
- user << "Bad place for a garden!"
+ else if(Y && (!isturf(src.loc) || istype(src.loc, /turf/space)))
+ src << "Bad place for a garden!"
return 0
- return 1
-
-/obj/effect/proc_holder/alien/plant
- name = "Plant Weeds"
- desc = "Plants some alien weeds"
- plasma_cost = 50
- check_turf = 1
+ else return 1
- action_icon_state = "alien_plant"
+/mob/living/carbon/alien/humanoid/verb/plant()
+ set name = "Plant Weeds (50)"
+ set desc = "Plants some alien weeds"
+ set category = "Alien"
-/obj/effect/proc_holder/alien/plant/fire(var/mob/living/carbon/alien/user)
- if(locate(/obj/structure/alien/weeds/node) in get_turf(user))
+ if(locate(/obj/structure/alien/weeds/node) in get_turf(src))
src << "There's already a weed node here."
- return 0
- for(var/mob/O in viewers(user, null))
- O.show_message(text("[user] has planted some alien weeds!"), 1)
- new/obj/structure/alien/weeds/node(user.loc)
- return 1
-
-/obj/effect/proc_holder/alien/whisper
- name = "Whisper"
- desc = "Whisper to someone"
- plasma_cost = 10
-
- action_icon_state = "alien_whisper"
+ return
-/obj/effect/proc_holder/alien/whisper/fire(var/mob/living/carbon/alien/user)
- var/mob/M = input("Select who to whisper to:","Whisper to?",null) as mob in oview(user)
- if(!M)
- return 0
- var/msg = sanitize(input("Message:", "Alien Whisper") as text|null)
- if(msg)
- log_say("AlienWhisper: [key_name(user)]->[M.key] : [msg]")
- M << "You hear a strange, alien voice in your head...[msg]"
- user << {"You said: "[msg]" to [M]"}
- else
- return 0
- return 1
+ if(powerc(50,1))
+ adjustToxLoss(-50)
+ for(var/mob/O in viewers(src, null))
+ O.show_message(text("[src] has planted some alien weeds!"), 1)
+ new /obj/structure/alien/weeds/node(loc)
+ return
-/obj/effect/proc_holder/alien/transfer
- name = "Transfer Plasma"
- desc = "Transfer Plasma to another alien"
- plasma_cost = 0
+/*
+/mob/living/carbon/alien/humanoid/verb/ActivateHuggers()
+ set name = "Activate facehuggers (5)"
+ set desc = "Makes all nearby facehuggers activate"
+ set category = "Alien"
+
+ if(powerc(5))
+ adjustToxLoss(-5)
+ for(var/obj/item/clothing/mask/facehugger/F in range(8,src))
+ F.GoActive()
+ emote("roar")
+ return
+*/
+/mob/living/carbon/alien/humanoid/verb/whisp(mob/M as mob in oview())
+ set name = "Whisper (10)"
+ set desc = "Whisper to someone"
+ set category = "Alien"
+
+ if(powerc(10))
+ adjustToxLoss(-10)
+ var/msg = sanitize(input("Message:", "Alien Whisper") as text|null)
+ if(msg)
+ log_say("AlienWhisper: [key_name(src)]->[M.key] : [msg]")
+ M << "You hear a strange, alien voice in your head...[msg]"
+ src << {"You said: "[msg]" to [M]"}
+ return
- action_icon_state = "alien_transfer"
+/mob/living/carbon/alien/humanoid/verb/transfer_plasma(mob/living/carbon/alien/M as mob in oview())
+ set name = "Transfer Plasma"
+ set desc = "Transfer Plasma to another alien"
+ set category = "Alien"
-/obj/effect/proc_holder/alien/transfer/fire(var/mob/living/carbon/alien/user)
- var/list/mob/living/carbon/alien/aliens_around = list()
- for(var/mob/living/carbon/alien/A in oview(user))
- aliens_around.Add(A)
- var/mob/living/carbon/alien/M = input("Select who to transfer to:","Transfer plasma to?",null) as mob in aliens_around
- if(!M)
- return 0
if(isalien(M))
var/amount = input("Amount:", "Transfer Plasma to [M]") as num
if (amount)
amount = abs(round(amount))
- if(user.getPlasma() > amount)
- if (get_dist(user,M) <= 1)
+ if(powerc(amount))
+ if (get_dist(src,M) <= 1)
M.adjustToxLoss(amount)
- user.adjustToxLoss(-amount)
- M << "[user] has transfered [amount] plasma to you."
- user << {"You have trasferred [amount] plasma to [M]"}
+ adjustToxLoss(-amount)
+ M << "[src] has transfered [amount] plasma to you."
+ src << {"You have trasferred [amount] plasma to [M]"}
else
- user << "You need to be closer."
+ src << "You need to be closer."
return
-/obj/effect/proc_holder/alien/acid
- name = "Corrossive Acid"
- desc = "Drench an object in acid, destroying it over time."
- plasma_cost = 200
-
- action_icon_state = "alien_acid"
-
-/obj/effect/proc_holder/alien/acid/on_gain(var/mob/living/carbon/alien/user)
- user.verbs.Add(/mob/living/carbon/alien/humanoid/proc/corrosive_acid)
-
-/obj/effect/proc_holder/alien/acid/proc/corrode(var/target,var/mob/living/carbon/alien/user = usr)
- if(target in oview(1,user))
- // OBJ CHECK
- if(isobj(target))
- var/obj/I = target
- if(I.unacidable) //So the aliens don't destroy energy fields/singularies/other aliens/etc with their acid.
- user << "You cannot dissolve this object."
- return 0
- // TURF CHECK
- else if(istype(target, /turf/simulated))
- var/turf/T = target
- // R WALL
- if(istype(T, /turf/simulated/wall/r_wall))
- user << "You cannot dissolve this object."
- return 0
- // R FLOOR
- if(istype(T, /turf/simulated/floor/engine))
- user << "You cannot dissolve this object."
- return 0
- else// Not a type we can acid.
- return 0
- new /obj/effect/acid(get_turf(target), target)
- user.visible_message("[user] vomits globs of vile stuff all over [target]. It begins to sizzle and melt under the bubbling mess of acid!")
- return 1
- else
- src << "Target is too far away."
- return 0
-
-
-/obj/effect/proc_holder/alien/acid/fire(var/mob/living/carbon/alien/user)
- var/O = input("Select what to dissolve:","Dissolve",null) as obj|turf in oview(1,user)
- if(!O)
- return 0
- return corrode(O,user)
-
-/mob/living/carbon/alien/humanoid/proc/corrosive_acid(O as obj|turf in oview(1)) // right click menu verb ugh
- set name = "Corrossive Acid"
-
- if(!isalien(usr))
- return
- var/mob/living/carbon/alien/humanoid/user = usr
- var/obj/effect/proc_holder/alien/acid/A = locate() in user.abilities
- if(!A)
- return
- if(user.getPlasma() > A.plasma_cost && A.corrode(O))
- user.adjustToxLoss(-A.plasma_cost)
-
-
-/obj/effect/proc_holder/alien/neurotoxin
- name = "Spit Neurotoxin"
- desc = "Spits neurotoxin at someone, paralyzing them for a short time."
- plasma_cost = 50
-
- action_icon_state = "alien_neurotoxin"
-
-/obj/effect/proc_holder/alien/neurotoxin/fire(var/mob/living/carbon/alien/user)
- user.visible_message("[user] spits neurotoxin!", "You spit neurotoxin.")
-
- var/turf/T = user.loc
- var/turf/U = get_step(user, user.dir) // Get the tile infront of the move, based on their direction
- if(!isturf(U) || !isturf(T))
- return 0
-
- var/obj/item/projectile/bullet/neurotoxin/A = new /obj/item/projectile/bullet/neurotoxin(user.loc)
- A.current = U
- A.yo = U.y - T.y
- A.xo = U.x - T.x
- A.fire()
-
- return 1
+/mob/living/carbon/alien/humanoid/proc/corrosive_acid(O as obj|turf in oview(1)) //If they right click to corrode, an error will flash if its an invalid target./N
+ set name = "Corrossive Acid (200)"
+ set desc = "Drench an object in acid, destroying it over time."
+ set category = "Alien"
+
+ if(powerc(200))
+ if(O in oview(1))
+ // OBJ CHECK
+ if(isobj(O))
+ var/obj/I = O
+ if(I.unacidable) //So the aliens don't destroy energy fields/singularies/other aliens/etc with their acid.
+ src << "You cannot dissolve this object."
+ return
+ // TURF CHECK
+ else if(istype(O, /turf/simulated))
+ var/turf/T = O
+ // R WALL
+ if(istype(T, /turf/simulated/wall/r_wall))
+ src << "You cannot dissolve this object."
+ return
+ // R FLOOR
+ if(istype(T, /turf/simulated/floor/engine))
+ src << "You cannot dissolve this object."
+ return
+ else// Not a type we can acid.
+ return
+
+ adjustToxLoss(-200)
+ new /obj/effect/acid(get_turf(O), O)
+ visible_message("[src] vomits globs of vile stuff all over [O]. It begins to sizzle and melt under the bubbling mess of acid!")
+ else
+ src << "Target is too far away."
+ return
-/obj/effect/proc_holder/alien/resin
- name = "Secrete Resin"
- desc = "Secrete tough malleable resin."
- plasma_cost = 55
- check_turf = 1
- action_icon_state = "alien_resin"
+/mob/living/carbon/alien/humanoid/proc/neurotoxin() // ok
+ set name = "Spit Neurotoxin (50)"
+ set desc = "Spits neurotoxin at someone, paralyzing them for a short time."
+ set category = "Alien"
-/obj/effect/proc_holder/alien/resin/fire(var/mob/living/carbon/alien/user)
- if(locate(/obj/structure/alien/resin) in user.loc.contents)
- user << "There is already a resin structure there."
- return 0
- var/choice = input("Choose what you wish to shape.","Resin building") as null|anything in list("resin wall","resin membrane","resin nest") //would do it through typesof but then the player choice would have the type path and we don't want the internal workings to be exposed ICly - Urist
+ if(powerc(50))
+ adjustToxLoss(-50)
+ src.visible_message("[src] spits neurotoxin!", "You spit neurotoxin.")
- if(!choice)
- return 0
+ var/turf/T = loc
+ var/turf/U = get_step(src, dir) // Get the tile infront of the move, based on their direction
+ if(!isturf(U) || !isturf(T))
+ return
- user << "You shape a [choice]."
- user.visible_message("[user] vomits up a thick purple substance and begins to shape it.")
-
- switch(choice)
- if("resin wall")
- new /obj/structure/alien/resin/wall(user.loc)
- if("resin membrane")
- new /obj/structure/alien/resin/membrane(user.loc)
- if("resin nest")
- new /obj/structure/stool/bed/nest(user.loc)
- return 1
+ var/obj/item/projectile/bullet/neurotoxin/A = new /obj/item/projectile/bullet/neurotoxin(usr.loc)
+ A.current = U
+ A.yo = U.y - T.y
+ A.xo = U.x - T.x
+ A.fire()
+ return
-/obj/effect/proc_holder/alien/regurgitate
- name = "Regurgitate"
- desc = "Empties the contents of your stomach"
- plasma_cost = 0
+/mob/living/carbon/alien/humanoid/proc/resin()
+ set name = "Secrete Resin (55)"
+ set desc = "Secrete tough malleable resin."
+ set category = "Alien"
+
+ if(powerc(55,1))
+ if(locate(/obj/structure/alien/resin) in loc.contents)
+ src << "There is already a resin structure there."
+ return
+ var/choice = input("Choose what you wish to shape.","Resin building") as null|anything in list("resin wall","resin membrane","resin nest") //would do it through typesof but then the player choice would have the type path and we don't want the internal workings to be exposed ICly - Urist
+ if(!choice || !powerc(55)) return
+ adjustToxLoss(-55)
+ src << "You shape a [choice]."
+ visible_message("[src] vomits up a thick purple substance and begins to shape it.")
+ switch(choice)
+ if("resin wall")
+ new /obj/structure/alien/resin/wall(loc)
+ if("resin membrane")
+ new /obj/structure/alien/resin/membrane(loc)
+ if("resin nest")
+ new /obj/structure/stool/bed/nest(loc)
+ return
- action_icon_state = "alien_barf"
+/mob/living/carbon/alien/humanoid/verb/regurgitate()
+ set name = "Regurgitate"
+ set desc = "Empties the contents of your stomach"
+ set category = "Alien"
-/obj/effect/proc_holder/alien/regurgitate/fire(var/mob/living/carbon/alien/user)
- if(user.stomach_contents.len)
- for(var/atom/movable/A in user.stomach_contents)
- if(A in user.stomach_contents)
- user.stomach_contents.Remove(A)
- A.loc = user.loc
+ if(powerc() && stomach_contents.len)
+ for(var/atom/movable/A in stomach_contents)
+ if(A in stomach_contents)
+ stomach_contents.Remove(A)
+ A.loc = loc
//Paralyse(10)
- user.visible_message("[user] hurls out the contents of their stomach!")
+ src.visible_message("[src] hurls out the contents of their stomach!")
return
-
-/obj/effect/proc_holder/alien/nightvisiontoggle
- name = "Toggle Night Vision"
- desc = "Toggles Night Vision"
- plasma_cost = 0
-
- has_action = 0 // Has dedicated GUI button already
-
-/obj/effect/proc_holder/alien/nightvisiontoggle/fire(var/mob/living/carbon/alien/user)
-
- if(!user.nightvision)
- user.see_in_dark = 8
- user.see_invisible = SEE_INVISIBLE_MINIMUM
- user.nightvision = 1
- user.hud_used.nightvisionicon.icon_state = "nightvision1"
- else if(user.nightvision == 1)
- user.see_in_dark = 4
- user.see_invisible = 45
- user.nightvision = 0
- user.hud_used.nightvisionicon.icon_state = "nightvision0"
-
- return 1
-
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm
index a18f4b2ee00d4..bae52d99d01e6 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm
@@ -12,11 +12,7 @@
if(src.name == "alien drone")
src.name = text("alien drone ([rand(1, 1000)])")
src.real_name = src.name
-
- AddAbility(new/obj/effect/proc_holder/alien/resin(null))
- AddAbility(new/obj/effect/proc_holder/alien/acid(null))
- AddAbility(new/obj/effect/proc_holder/alien/evolve(null))
-
+ verbs.Add(/mob/living/carbon/alien/humanoid/proc/resin,/mob/living/carbon/alien/humanoid/proc/corrosive_acid)
..()
//Drones use the same base as generic humanoids.
@@ -24,26 +20,29 @@
. = ..()
. += 1
-/obj/effect/proc_holder/alien/evolve
- name = "Evolve"
- desc = "Produce an interal egg sac capable of spawning children. Only one queen can exist at a time."
- plasma_cost = 500
-
- action_icon_state = "alien_evolve_drone"
-/obj/effect/proc_holder/alien/evolve/fire(var/mob/living/carbon/alien/user)
- var/no_queen = 1
- for(var/mob/living/carbon/alien/humanoid/queen/Q in living_mob_list)
- if(!Q.key || !Q.getorgan(/obj/item/organ/brain))
- continue
- no_queen = 0
- if(no_queen)
- user << "You begin to evolve!"
- user.visible_message("[user] begins to twist and contort!")
- var/mob/living/carbon/alien/humanoid/queen/new_xeno = new (user.loc)
- user.mind.transfer_to(new_xeno)
- qdel(user)
- return 1
- else
- user << "We already have an alive queen."
- return 0
\ No newline at end of file
+//Drone verbs
+/mob/living/carbon/alien/humanoid/drone/verb/evolve()
+ set name = "Evolve (500)"
+ set desc = "Produce an interal egg sac capable of spawning children. Only one queen can exist at a time."
+ set category = "Alien"
+
+ if(powerc(500))
+ // Queen check
+ var/no_queen = 1
+ for(var/mob/living/carbon/alien/humanoid/queen/Q in living_mob_list)
+ if(!Q.key || !Q.getorgan(/obj/item/organ/brain))
+ continue
+ no_queen = 0
+
+ if(no_queen)
+ adjustToxLoss(-500)
+ src << "You begin to evolve!"
+ for(var/mob/O in viewers(src, null))
+ O.show_message(text("[src] begins to twist and contort!"), 1)
+ var/mob/living/carbon/alien/humanoid/queen/new_xeno = new (loc)
+ mind.transfer_to(new_xeno)
+ qdel(src)
+ else
+ src << "We already have an alive queen."
+ return
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
index 4ace45627ab7c..98067011363ed 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
@@ -54,7 +54,6 @@
/mob/living/carbon/alien/humanoid/hunter/proc/toggle_leap(var/message = 1)
leap_on_click = !leap_on_click
leap_icon.icon_state = "leap_[leap_on_click ? "on":"off"]"
- update_icons()
if(message)
src << "You will now [leap_on_click ? "leap at":"slash at"] enemies!"
else
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm
index ecd8a193a3396..c277695df7c43 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/sentinel.dm
@@ -14,10 +14,7 @@
if(name == "alien sentinel")
name = text("alien sentinel ([rand(1, 1000)])")
real_name = name
-
- AddAbility(new/obj/effect/proc_holder/alien/acid(null))
- AddAbility(new/obj/effect/proc_holder/alien/neurotoxin(null))
-
+ verbs.Add(/mob/living/carbon/alien/humanoid/proc/corrosive_acid,/mob/living/carbon/alien/humanoid/proc/neurotoxin)
..()
/mob/living/carbon/alien/humanoid/sentinel/handle_hud_icons_health()
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index 9640f75e09122..3734ea7ea076a 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -4,12 +4,9 @@
var/obj/item/r_store = null
var/obj/item/l_store = null
var/caste = ""
- var/alt_icon = 'icons/mob/alienleap.dmi' //used to switch between the two alien icon files.
var/leap_on_click = 0
var/pounce_cooldown = 0
var/pounce_cooldown_time = 30
- var/custom_pixel_x_offset = 0 //for admin fuckery.
- var/custom_pixel_y_offset = 0
//This is fine right now, if we're adding organ specific damage this needs to be updated
/mob/living/carbon/alien/humanoid/New()
@@ -17,12 +14,6 @@
if(name == "alien")
name = text("alien ([rand(1, 1000)])")
real_name = name
-
- AddAbility(new/obj/effect/proc_holder/alien/plant(null))
- AddAbility(new/obj/effect/proc_holder/alien/whisper(null))
- AddAbility(new/obj/effect/proc_holder/alien/transfer(null))
- AddAbility(new/obj/effect/proc_holder/alien/regurgitate(null))
-
..()
/mob/living/carbon/alien/humanoid/movement_delay()
@@ -36,6 +27,16 @@
if(l_store) l_store.emp_act(severity)
..()
+/mob/living/carbon/alien/humanoid/attack_slime(mob/living/carbon/slime/M as mob)
+ ..()
+ var/damage = rand(5, 35)
+ if(M.is_adult)
+ damage = rand(10, 40)
+ adjustBruteLoss(damage)
+ add_logs(M, src, "attacked", admin=0)
+ updatehealth()
+ return
+
/mob/living/carbon/alien/humanoid/attack_hulk(mob/living/carbon/human/user)
if(user.a_intent == "harm")
..(user, 1)
@@ -125,27 +126,4 @@
unEquip(l_store)
/mob/living/carbon/alien/humanoid/reagent_check(var/datum/reagent/R)
- return 0
-
-/mob/living/carbon/alien/humanoid/cuff_resist(obj/item/I)
- playsound(src, 'sound/voice/hiss5.ogg', 40, 1, 1) //Alien roars when starting to break free
- ..(I, cuff_break = 1)
-
-/mob/living/carbon/alien/humanoid/get_standard_pixel_y_offset(lying = 0)
- if(leaping)
- return -32
- else if(custom_pixel_y_offset)
- return custom_pixel_y_offset
- else
- return initial(pixel_y)
-
-/mob/living/carbon/alien/humanoid/get_standard_pixel_x_offset(lying = 0)
- if(leaping)
- return -32
- else if(custom_pixel_x_offset)
- return custom_pixel_x_offset
- else
- return initial(pixel_x)
-
-/mob/living/carbon/alien/humanoid/check_ear_prot()
- return 1
+ return 0
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
index 9670240e4aa60..e1aae3cc6e284 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm
@@ -22,12 +22,7 @@
break
real_name = src.name
-
- AddAbility(new/obj/effect/proc_holder/alien/acid(null))
- AddAbility(new/obj/effect/proc_holder/alien/neurotoxin(null))
- AddAbility(new/obj/effect/proc_holder/alien/resin(null))
- AddAbility(new/obj/effect/proc_holder/alien/lay_egg(null))
-
+ verbs.Add(/mob/living/carbon/alien/humanoid/proc/corrosive_acid,/mob/living/carbon/alien/humanoid/proc/neurotoxin,/mob/living/carbon/alien/humanoid/proc/resin)
..()
/mob/living/carbon/alien/humanoid/queen/handle_hud_icons_health()
@@ -57,21 +52,23 @@
//Queen verbs
-/obj/effect/proc_holder/alien/lay_egg
- name = "Lay Egg"
- desc = "Lay an egg to produce huggers to impregnate prey with."
- plasma_cost = 75
- check_turf = 1
+/mob/living/carbon/alien/humanoid/queen/verb/lay_egg()
+
+ set name = "Lay Egg (75)"
+ set desc = "Lay an egg to produce huggers to impregnate prey with."
+ set category = "Alien"
+
+ if(locate(/obj/structure/alien/egg) in get_turf(src))
+ src << "There's already an egg here."
+ return
- action_icon_state = "alien_egg"
+ if(powerc(75,1))//Can't plant eggs on spess tiles. That's silly.
+ adjustToxLoss(-75)
+ for(var/mob/O in viewers(src, null))
+ O.show_message(text("[src] has laid an egg!"), 1)
+ new /obj/structure/alien/egg(loc)
+ return
-/obj/effect/proc_holder/alien/lay_egg/fire(var/mob/living/carbon/alien/user)
- if(locate(/obj/structure/alien/egg) in get_turf(user))
- user << "There's already an egg here."
- return 0
- user.visible_message("[user] has laid an egg!")
- new /obj/structure/alien/egg(user.loc)
- return 1
/mob/living/carbon/alien/humanoid/queen/large
icon = 'icons/mob/alienqueen.dmi'
diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
index 85a6333891918..7f0418c5faab1 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm
@@ -14,19 +14,23 @@
for(var/image/I in overlays_standing)
overlays += I
+
if(stat == DEAD)
//If we mostly took damage from fire
if(fireloss > 125)
icon_state = "alien[caste]_husked"
+ pixel_y = 0
else
icon_state = "alien[caste]_dead"
+ pixel_y = 0
- else if((stat == UNCONSCIOUS && !sleeping) || weakened)
+ else if(stat == UNCONSCIOUS || weakened)
icon_state = "alien[caste]_unconscious"
+ pixel_y = 0
else if(leap_on_click)
icon_state = "alien[caste]_pounce"
- else if(lying || resting || sleeping)
+ else if(lying || resting)
icon_state = "alien[caste]_sleep"
else if(m_intent == "run")
icon_state = "alien[caste]_running"
@@ -34,20 +38,16 @@
icon_state = "alien[caste]_s"
if(leaping)
- if(alt_icon == initial(alt_icon))
- var/old_icon = icon
- icon = alt_icon
- alt_icon = old_icon
+ icon = 'icons/mob/alienleap.dmi'
icon_state = "alien[caste]_leap"
pixel_x = -32
pixel_y = -32
else
- if(alt_icon != initial(alt_icon))
- var/old_icon = icon
- icon = alt_icon
- alt_icon = old_icon
- pixel_x = get_standard_pixel_x_offset(lying)
- pixel_y = get_standard_pixel_y_offset(lying)
+ icon = initial(icon)
+ pixel_x = initial(pixel_x)
+ pixel_y = initial(pixel_y)
+
+
/mob/living/carbon/alien/humanoid/regenerate_icons()
..()
@@ -63,9 +63,8 @@
/mob/living/carbon/alien/humanoid/update_transform() //The old method of updating lying/standing was update_icons(). Aliens still expect that.
if(lying > 0)
lying = 90 //Anything else looks retarded
- ..()
update_icons()
-
+ ..()
/mob/living/carbon/alien/humanoid/update_hud()
diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm
index 096f1e353a8ba..9a01954a6d961 100644
--- a/code/modules/mob/living/carbon/alien/larva/larva.dm
+++ b/code/modules/mob/living/carbon/alien/larva/larva.dm
@@ -4,7 +4,6 @@
icon_state = "larva0"
pass_flags = PASSTABLE | PASSMOB
mob_size = MOB_SIZE_SMALL
- density = 0
maxHealth = 25
health = 25
@@ -22,8 +21,6 @@
name = "alien larva ([rand(1, 1000)])"
real_name = name
regenerate_icons()
- AddAbility(new/obj/effect/proc_holder/alien/hide(null))
- AddAbility(new/obj/effect/proc_holder/alien/larva_evolve(null))
..()
//This needs to be fixed
@@ -41,6 +38,17 @@
/mob/living/carbon/alien/larva/attack_ui(slot_id)
return
+/mob/living/carbon/alien/larva/attack_slime(mob/living/carbon/slime/M as mob)
+
+ ..()
+ var/damage = rand(5, 35)
+ if(M.is_adult)
+ damage = rand(20, 40)
+ adjustBruteLoss(damage)
+ add_logs(M, src, "attacked", admin=0)
+ updatehealth()
+ return
+
/mob/living/carbon/alien/larva/attack_hulk(mob/living/carbon/human/user)
if(user.a_intent == "harm")
..(user, 1)
diff --git a/code/modules/mob/living/carbon/alien/larva/login.dm b/code/modules/mob/living/carbon/alien/larva/login.dm
new file mode 100644
index 0000000000000..c98df1af7f54f
--- /dev/null
+++ b/code/modules/mob/living/carbon/alien/larva/login.dm
@@ -0,0 +1,3 @@
+/mob/living/carbon/alien/larva/Login()
+ return ..()
+
diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm
index cf2c73a96c66b..efbdcdafe9bae 100644
--- a/code/modules/mob/living/carbon/alien/larva/powers.dm
+++ b/code/modules/mob/living/carbon/alien/larva/powers.dm
@@ -1,61 +1,51 @@
-/obj/effect/proc_holder/alien/hide
- name = "Hide"
- desc = "Allows to hide beneath tables or certain items. Toggled on or off."
- plasma_cost = 0
- action_icon_state = "alien_hide"
+/mob/living/carbon/alien/larva/verb/hide()
+ set name = "Hide"
+ set desc = "Allows to hide beneath tables or certain items. Toggled on or off."
+ set category = "Alien"
-/obj/effect/proc_holder/alien/hide/fire(var/mob/living/carbon/alien/user)
- if(user.stat != CONSCIOUS)
+ if(stat != CONSCIOUS)
return
- if (user.layer != TURF_LAYER+0.2)
- user.layer = TURF_LAYER+0.2
- user.visible_message("[user] scurries to the ground!", \
+ if (layer != TURF_LAYER+0.2)
+ layer = TURF_LAYER+0.2
+ visible_message("[src] scurries to the ground!", \
"You are now hiding.")
else
- user.layer = MOB_LAYER
- user.visible_message("[user.] slowly peaks up from the ground...", \
+ layer = MOB_LAYER
+ visible_message("[src] slowly peaks up from the ground...", \
"You have stopped hiding.")
- return 1
+/mob/living/carbon/alien/larva/verb/evolve()
+ set name = "Evolve"
+ set desc = "Evolve into a fully grown Alien."
+ set category = "Alien"
-/obj/effect/proc_holder/alien/larva_evolve
- name = "Evolve"
- desc = "Evolve into a fully grown Alien."
- plasma_cost = 0
-
- action_icon_state = "alien_evolve_larva"
-
-/obj/effect/proc_holder/alien/larva_evolve/fire(var/mob/living/carbon/alien/user)
- if(!islarva(user))
+ if(stat != CONSCIOUS)
return
- var/mob/living/carbon/alien/larva/L = user
- if(L.stat != CONSCIOUS)
- return
- if(L.handcuffed || L.legcuffed) // Cuffing larvas ? Eh ?
- user << "You cannot evolve when you are cuffed."
+ if(handcuffed || legcuffed)
+ src << "You cannot evolve when you are cuffed."
- if(L.amount_grown >= L.max_grown) //TODO ~Carn
- L << "You are growing into a beautiful alien! It is time to choose a caste."
- L << "There are three to choose from:"
- L << "Hunters are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves."
- L << "Sentinels are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters."
- L << "Drones are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen."
- var/alien_caste = alert(L, "Please choose which alien caste you shall belong to.",,"Hunter","Sentinel","Drone")
+ if(amount_grown >= max_grown) //TODO ~Carn
+ src << "You are growing into a beautiful alien! It is time to choose a caste."
+ src << "There are three to choose from:"
+ src << "Hunters are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves."
+ src << "Sentinels are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters."
+ src << "Drones are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen."
+ var/alien_caste = alert(src, "Please choose which alien caste you shall belong to.",,"Hunter","Sentinel","Drone")
var/mob/living/carbon/alien/humanoid/new_xeno
switch(alien_caste)
if("Hunter")
- new_xeno = new /mob/living/carbon/alien/humanoid/hunter(L.loc)
+ new_xeno = new /mob/living/carbon/alien/humanoid/hunter(loc)
if("Sentinel")
- new_xeno = new /mob/living/carbon/alien/humanoid/sentinel(L.loc)
+ new_xeno = new /mob/living/carbon/alien/humanoid/sentinel(loc)
if("Drone")
- new_xeno = new /mob/living/carbon/alien/humanoid/drone(L.loc)
- if(L.mind) L.mind.transfer_to(new_xeno)
- qdel(L)
- return 0
+ new_xeno = new /mob/living/carbon/alien/humanoid/drone(loc)
+ if(mind) mind.transfer_to(new_xeno)
+ qdel(src)
+ return
else
- user << "You are not fully grown."
- return 0
\ No newline at end of file
+ src << "You are not fully grown."
+ return
diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm
index acdbfd4d05563..6654abf55f9ec 100644
--- a/code/modules/mob/living/carbon/alien/life.dm
+++ b/code/modules/mob/living/carbon/alien/life.dm
@@ -31,21 +31,25 @@
handle_breath_temperature(breath)
-/mob/living/carbon/alien/handle_status_effects()
+/mob/living/carbon/alien/handle_regular_status_updates()
..()
//natural reduction of movement delay due to stun.
if(move_delay_add > 0)
move_delay_add = max(0, move_delay_add - rand(1, 2))
-/mob/living/carbon/alien/update_sight()
+ return 1
- if(stat == DEAD)
+/mob/living/carbon/alien/handle_vision()
+
+ client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask)
+
+ if (stat == 2)
sight |= SEE_TURFS
sight |= SEE_MOBS
sight |= SEE_OBJS
see_in_dark = 8
see_invisible = SEE_INVISIBLE_LEVEL_TWO
- else
+ else if (stat != 2)
sight |= SEE_MOBS
sight &= ~SEE_TURFS
sight &= ~SEE_OBJS
@@ -58,6 +62,30 @@
if(see_override)
see_invisible = see_override
+ if ((blind && stat != 2))
+ if((eye_blind))
+ blind.layer = 18
+ else
+ blind.layer = 0
+
+ if (disabilities & NEARSIGHT)
+ client.screen += global_hud.vimpaired
+
+ if (eye_blurry)
+ client.screen += global_hud.blurry
+
+ if (druggy)
+ client.screen += global_hud.druggy
+
+ if (stat != 2)
+ if(machine)
+ if (!( machine.check_eye(src) ))
+ reset_view(null)
+ else
+ if(!client.adminobs)
+ reset_view(null)
+
+
/mob/living/carbon/alien/handle_hud_icons()
handle_hud_icons_health()
diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
index d7c223124b638..19d37221c19e5 100644
--- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
+++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
@@ -2,11 +2,50 @@
// It functions almost identically (see code/datums/diseases/alien_embryo.dm)
var/const/ALIEN_AFK_BRACKET = 450 // 45 seconds
-/obj/item/body_egg/alien_embryo
+/obj/item/alien_embryo
name = "alien embryo"
+ desc = "All slimy and yuck."
+ icon = 'icons/mob/alien.dmi'
+ icon_state = "larva0_dead"
+ var/mob/living/affected_mob
var/stage = 0
-/obj/item/body_egg/alien_embryo/egg_process()
+/obj/item/alien_embryo/New()
+ if(istype(loc, /mob/living))
+ affected_mob = loc
+ affected_mob.status_flags |= XENO_HOST
+ SSobj.processing |= src
+ if(istype(affected_mob,/mob/living/carbon))
+ var/mob/living/carbon/H = affected_mob
+ H.med_hud_set_status()
+ spawn(0)
+ AddInfectionImages(affected_mob)
+ else
+ qdel(src)
+
+/obj/item/alien_embryo/Destroy()
+ if(affected_mob)
+ affected_mob.status_flags &= ~(XENO_HOST)
+ if(istype(affected_mob,/mob/living/carbon))
+ var/mob/living/carbon/H = affected_mob
+ H.med_hud_set_status()
+ spawn(0)
+ RemoveInfectionImages(affected_mob)
+ ..()
+
+/obj/item/alien_embryo/process()
+ if(!affected_mob) return
+ if(loc != affected_mob)
+ affected_mob.status_flags &= ~(XENO_HOST)
+ SSobj.processing.Remove(src)
+ if(istype(affected_mob,/mob/living/carbon))
+ var/mob/living/carbon/H = affected_mob
+ H.med_hud_set_status()
+ spawn(0)
+ RemoveInfectionImages(affected_mob)
+ affected_mob = null
+ return
+
if(stage < 5 && prob(3))
stage++
spawn(0)
@@ -48,9 +87,7 @@ var/const/ALIEN_AFK_BRACKET = 450 // 45 seconds
if(prob(50))
AttemptGrow()
-
-
-/obj/item/body_egg/alien_embryo/proc/AttemptGrow(var/gib_on_success = 1)
+/obj/item/alien_embryo/proc/AttemptGrow(var/gib_on_success = 1)
var/list/candidates = get_candidates(BE_ALIEN, ALIEN_AFK_BRACKET)
var/client/C = null
@@ -86,7 +123,7 @@ var/const/ALIEN_AFK_BRACKET = 450 // 45 seconds
Proc: RefreshInfectionImage()
Des: Removes the current icons located in the infected mob adds the current stage
----------------------------------------*/
-/obj/item/body_egg/alien_embryo/RefreshInfectionImage()
+/obj/item/alien_embryo/proc/RefreshInfectionImage()
RemoveInfectionImages()
AddInfectionImages()
@@ -94,7 +131,7 @@ Des: Removes the current icons located in the infected mob adds the current stag
Proc: AddInfectionImages(C)
Des: Adds the infection image to all aliens for this embryo
----------------------------------------*/
-/obj/item/body_egg/alien_embryo/AddInfectionImages()
+/obj/item/alien_embryo/proc/AddInfectionImages()
for(var/mob/living/carbon/alien/alien in player_list)
if(alien.client)
var/I = image('icons/mob/alien.dmi', loc = affected_mob, icon_state = "infected[stage]")
@@ -104,7 +141,7 @@ Des: Adds the infection image to all aliens for this embryo
Proc: RemoveInfectionImage(C)
Des: Removes all images from the mob infected by this embryo
----------------------------------------*/
-/obj/item/body_egg/alien_embryo/RemoveInfectionImages()
+/obj/item/alien_embryo/proc/RemoveInfectionImages()
for(var/mob/living/carbon/alien/alien in player_list)
if(alien.client)
for(var/image/I in alien.client.images)
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index f24f47f8f65dc..6749b8d210836 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -48,11 +48,11 @@ var/const/MAX_ACTIVE_TIME = 400
return
switch(stat)
if(DEAD,UNCONSCIOUS)
- user << "[src] is not moving."
+ user << "[src] is not moving."
if(CONSCIOUS)
- user << "[src] seems to be active!"
+ user << "[src] seems to be active!"
if (sterile)
- user << "It looks like the proboscis has been removed."
+ user << "It looks like the proboscis has been removed."
/obj/item/clothing/mask/facehugger/attackby(var/obj/item/O,var/mob/m, params)
if(O.force)
@@ -115,7 +115,7 @@ var/const/MAX_ACTIVE_TIME = 400
if(loc == L) return 0
if(stat != CONSCIOUS) return 0
- if(locate(/obj/item/body_egg/alien_embryo) in L) return 0
+ if(locate(/obj/item/alien_embryo) in L) return 0
if(!sterile) L.take_organ_damage(strength,0) //done here so that even borgs and humans in helmets take damage
L.visible_message("[src] leaps at [L]'s face!", \
@@ -123,7 +123,7 @@ var/const/MAX_ACTIVE_TIME = 400
if(ishuman(L))
var/mob/living/carbon/human/H = L
- if(H.is_mouth_covered(head_only = 1))
+ if(H.head && H.head.flags & HEADCOVERSMOUTH)
H.visible_message("[src] smashes against [H]'s [H.head]!", \
"[src] smashes against [H]'s [H.head]!")
Die()
@@ -145,7 +145,7 @@ var/const/MAX_ACTIVE_TIME = 400
if(!sterile) L.Paralyse(MAX_IMPREGNATION_TIME/6) //something like 25 ticks = 20 seconds with the default settings
else if (iscorgi(M))
- var/mob/living/simple_animal/pet/corgi/C = M
+ var/mob/living/simple_animal/corgi/C = M
loc = C
C.facehugger = src
@@ -174,11 +174,11 @@ var/const/MAX_ACTIVE_TIME = 400
icon_state = "[initial(icon_state)]_impregnated"
if(!target.getlimb(/obj/item/organ/limb/robot/chest) && !(target.status_flags & XENO_HOST))
- new /obj/item/body_egg/alien_embryo(target)
+ new /obj/item/alien_embryo(target)
if(iscorgi(target))
- var/mob/living/simple_animal/pet/corgi/C = target
+ var/mob/living/simple_animal/corgi/C = target
src.loc = get_turf(C)
C.facehugger = null
else
@@ -223,7 +223,7 @@ var/const/MAX_ACTIVE_TIME = 400
icon_state = "[initial(icon_state)]_dead"
stat = DEAD
- visible_message("[src] curls up into a ball!")
+ src.visible_message("[src] curls up into a ball!")
return
@@ -239,7 +239,7 @@ var/const/MAX_ACTIVE_TIME = 400
var/mob/living/carbon/C = M
if(ishuman(C))
var/mob/living/carbon/human/H = C
- if(H.is_mouth_covered(head_only = 1))
+ if(H.head && H.head.flags & HEADCOVERSMOUTH)
return 0
return 1
return 0
diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm
index 2197876bc1c27..3600cdc4de95f 100644
--- a/code/modules/mob/living/carbon/brain/brain.dm
+++ b/code/modules/mob/living/carbon/brain/brain.dm
@@ -6,7 +6,6 @@
var/timeofhostdeath = 0
var/emp_damage = 0//Handles a type of MMI damage
var/alert = null
- has_limbs = 0
/mob/living/carbon/brain/New()
create_reagents(1000)
@@ -29,11 +28,11 @@
/mob/living/carbon/brain/ex_act() //you cant blow up brainmobs because it makes transfer_to() freak out when borgs blow up.
return
-
+
/mob/living/carbon/brain/blob_act()
return
-
-/mob/living/carbon/brain/on_forcemove(var/atom/newloc)
+
+/mob/living/carbon/brain/on_forcemove(var/atom/newloc)
if(container)
container.loc = newloc
else //something went very wrong.
diff --git a/code/modules/mob/living/carbon/brain/death.dm b/code/modules/mob/living/carbon/brain/death.dm
index 05cc69ba948ff..51b17b8e7fa91 100644
--- a/code/modules/mob/living/carbon/brain/death.dm
+++ b/code/modules/mob/living/carbon/brain/death.dm
@@ -1,8 +1,8 @@
/mob/living/carbon/brain/death(gibbed)
if(stat == DEAD) return
if(!gibbed && container && istype(container, /obj/item/device/mmi))//If not gibbed but in a container.
- container.visible_message("[src]'s MMI flatlines!", \
- "You hear something flatline.")
+ for(var/mob/O in viewers(container, null))
+ O.show_message(text("[]'s MMI flatlines!", src), 1, "You hear something flatline.", 2)
if(istype(src,/obj/item/organ/brain/alien))
container.icon_state = "mmi_alien_dead"
else
diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm
index be2b01d873244..0f1ef27541f84 100644
--- a/code/modules/mob/living/carbon/brain/life.dm
+++ b/code/modules/mob/living/carbon/brain/life.dm
@@ -64,7 +64,10 @@
death()
eye_blind = max(eye_blind, 1)
silent = 0
- return
+ return 1
+ if(health < config.health_threshold_crit)
+ stat = UNCONSCIOUS
+ eye_blind = max(eye_blind, 1)
else
stat = CONSCIOUS
@@ -121,13 +124,8 @@
else
eye_blind = 0
- return 1
-
-/mob/living/carbon/brain/handle_disabilities()
- return
+ return 1
-/mob/living/carbon/brain/handle_status_effects()
- return
/mob/living/carbon/brain/handle_regular_hud_updates()
diff --git a/code/modules/mob/living/carbon/brain/say.dm b/code/modules/mob/living/carbon/brain/say.dm
index ac45baaf3381f..a5bb0a956d55f 100644
--- a/code/modules/mob/living/carbon/brain/say.dm
+++ b/code/modules/mob/living/carbon/brain/say.dm
@@ -9,11 +9,11 @@
message = Gibberish(message, (emp_damage*6))//scrambles the message, gets worse when emp_damage is higher
..()
-/mob/living/carbon/brain/radio(message, message_mode, list/spans)
+/mob/living/carbon/brain/radio(message, message_mode)
if(message_mode && istype(container, /obj/item/device/mmi/radio_enabled))
var/obj/item/device/mmi/radio_enabled/R = container
if(R.radio)
- R.radio.talk_into(src, message, , spans)
+ R.radio.talk_into(src, message)
return ITALICS | REDUCE_RANGE
/mob/living/carbon/brain/lingcheck()
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index e8ee8511136bc..c63f1a9142204 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -86,8 +86,6 @@
"You feel a powerful shock coursing through your body!", \
"You hear a heavy electrical crack." \
)
- if(prob(25) && heart_attack)
- heart_attack = 0
jitteriness += 1000 //High numbers for violent convulsions
do_jitter_animation(jitteriness)
stuttering += 2
@@ -157,8 +155,6 @@
/mob/living/carbon/flash_eyes(intensity = 1, override_blindness_check = 0)
var/damage = intensity - check_eye_prot()
if(..()) // we've been flashed
- if(weakeyes)
- Stun(2)
switch(damage)
if(1)
src << "Your eyes sting a little."
@@ -192,15 +188,15 @@
if(prob(20))
src << "Something bright flashes in the corner of your vision!"
+/mob/living/carbon/proc/tintcheck()
+ return 0
+
/mob/living/carbon/proc/eyecheck()
var/obj/item/cybernetic_implant/eyes/EFP = locate() in src
if(EFP)
return EFP.flash_protect
return 0
-/mob/living/carbon/proc/tintcheck()
- return 0
-
/mob/living/carbon/clean_blood()
if(ishuman(src))
var/mob/living/carbon/human/H = src
@@ -294,6 +290,55 @@
/mob/living/carbon/proc/canBeHandcuffed()
return 0
+/mob/living/carbon/unEquip(obj/item/I) //THIS PROC DID NOT CALL ..() AND THAT COST ME AN ENTIRE DAY OF DEBUGGING.
+ . = ..() //Sets the default return value to what the parent returns.
+ if(!. || !I) //We don't want to set anything to null if the parent returned 0.
+ return
+
+ if(I == back)
+ back = null
+ update_inv_back(0)
+ else if(I == wear_mask)
+ if(istype(src, /mob/living/carbon/human)) //If we don't do this hair won't be properly rebuilt.
+ return
+ wear_mask = null
+ update_inv_wear_mask(0)
+ else if(I == handcuffed)
+ handcuffed = null
+ if(buckled && buckled.buckle_requires_restraints)
+ buckled.unbuckle_mob()
+ update_inv_handcuffed(0)
+ else if(I == legcuffed)
+ legcuffed = null
+ update_inv_legcuffed(0)
+
+
+/mob/living/carbon/proc/get_temperature(var/datum/gas_mixture/environment)
+ var/loc_temp = T0C
+ if(istype(loc, /obj/mecha))
+ var/obj/mecha/M = loc
+ loc_temp = M.return_temperature()
+
+ else if(istype(loc, /obj/structure/transit_tube_pod))
+ loc_temp = environment.temperature
+
+ else if(istype(get_turf(src), /turf/space))
+ var/turf/heat_turf = get_turf(src)
+ loc_temp = heat_turf.temperature
+
+ else if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
+ var/obj/machinery/atmospherics/unary/cryo_cell/C = loc
+
+ if(C.air_contents.total_moles() < 10)
+ loc_temp = environment.temperature
+ else
+ loc_temp = C.air_contents.temperature
+
+ else
+ loc_temp = environment.temperature
+
+ return loc_temp
+
/mob/living/carbon/show_inv(mob/user)
user.set_machine(src)
@@ -301,7 +346,6 @@
[name]
- Head: [(head && !(head.flags&ABSTRACT)) ? head : "Nothing"] Mask: [(wear_mask && !(wear_mask.flags&ABSTRACT)) ? wear_mask : "Nothing"] Left Hand: [(l_hand && !(l_hand.flags&ABSTRACT)) ? l_hand : "Nothing"] Right Hand: [(r_hand && !(r_hand.flags&ABSTRACT)) ? r_hand : "Nothing"]"}
@@ -370,138 +414,9 @@ var/const/GALOSHES_DONT_HELP = 8
/mob/living/carbon/is_muzzled()
return(istype(src.wear_mask, /obj/item/clothing/mask/muzzle))
-
-/mob/living/carbon/revive()
- heart_attack = 0
- ..()
- return
-
/mob/living/carbon/blob_act()
if (stat == DEAD)
return
else
show_message("The blob attacks!")
adjustBruteLoss(10)
-
-/mob/living/carbon/proc/spin(spintime, speed)
- spawn()
- var/D = dir
- while(spintime >= speed)
- sleep(speed)
- switch(D)
- if(NORTH)
- D = EAST
- if(SOUTH)
- D = WEST
- if(EAST)
- D = SOUTH
- if(WEST)
- D = NORTH
- dir = D
- spintime -= speed
- return
-
-/mob/living/carbon/resist_buckle()
- if(handcuffed)
- changeNext_move(CLICK_CD_BREAKOUT)
- last_special = world.time + CLICK_CD_BREAKOUT
- visible_message("[src] attempts to unbuckle themself!", \
- "You attempt to unbuckle yourself. (This will take around one minute and you need to stay still.)")
- if(do_after(src, 600, needhand = 0))
- if(!buckled)
- return
- buckled.user_unbuckle_mob(src,src)
- else
- if(src && buckled)
- src << "You fail to unbuckle yourself!"
- else
- buckled.user_unbuckle_mob(src,src)
-
-/mob/living/carbon/resist_fire()
- fire_stacks -= 5
- Weaken(3,1)
- spin(32,2)
- visible_message("[src] rolls on the floor, trying to put themselves out!", \
- "You stop, drop, and roll!")
- sleep(30)
- if(fire_stacks <= 0)
- visible_message("[src] has successfully extinguished themselves!", \
- "You extinguish yourself.")
- ExtinguishMob()
- return
-
-/mob/living/carbon/resist_restraints()
- var/obj/item/I = null
- if(handcuffed)
- I = handcuffed
- else if(legcuffed)
- I = legcuffed
- if(I)
- changeNext_move(CLICK_CD_BREAKOUT)
- last_special = world.time + CLICK_CD_BREAKOUT
- cuff_resist(I)
-
-
-/mob/living/carbon/proc/cuff_resist(obj/item/I, var/breakouttime = 600, cuff_break = 0)
- if(istype(I, /obj/item/weapon/restraints))
- var/obj/item/weapon/restraints/R = I
- breakouttime = R.breakouttime
- var/displaytime = breakouttime / 600
- if(!cuff_break)
- visible_message("[src] attempts to remove [I]!")
- src << "You attempt to remove [I]. (This will take around [displaytime] minutes and you need to stand still.)"
- if(do_after(src, breakouttime, 10, 0))
- if(I.loc != src || buckled)
- return
- visible_message("[src] manages to remove [I]!")
- src << "You successfully remove [I]."
-
- if(handcuffed)
- handcuffed.loc = loc
- handcuffed.dropped(src)
- handcuffed = null
- if(buckled && buckled.buckle_requires_restraints)
- buckled.unbuckle_mob()
- update_inv_handcuffed(0)
- return
- if(legcuffed)
- legcuffed.loc = loc
- legcuffed = null
- update_inv_legcuffed(0)
- else
- src << "You fail to remove [I]!"
-
- else
- breakouttime = 50
- visible_message("[src] is trying to break [I]!")
- src << "You attempt to break [I]. (This will take around 5 seconds and you need to stand still.)"
- if(do_after(src, breakouttime, needhand = 0))
- if(!I.loc || buckled)
- return
- visible_message("[src] manages to break [I]!")
- src << "You successfully break [I]."
- qdel(I)
-
- if(handcuffed)
- handcuffed = null
- update_inv_handcuffed(0)
- return
- else
- legcuffed = null
- update_inv_legcuffed(0)
- else
- src << "You fail to break [I]!"
-
-/mob/living/carbon/proc/is_mouth_covered(head_only = 0, mask_only = 0)
- if( (!mask_only && head && (head.flags & HEADCOVERSMOUTH)) || (!head_only && wear_mask && (wear_mask.flags & MASKCOVERSMOUTH)) )
- return 1
-
-/mob/living/carbon/get_standard_pixel_y_offset(lying = 0)
- if(lying)
- return -6
- else
- return initial(pixel_y)
-
-/mob/living/carbon/check_ear_prot()
- if(head && (head.flags & HEADBANGPROTECT))
- return 1
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 49e93256442e0..6e6516ccd0f2e 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -13,9 +13,9 @@
/mob/living/carbon/attackby(obj/item/I, mob/user, params)
- if(lying)
+ if(lying || isslime(src))
if(surgeries.len)
- if(user != src && user.a_intent == "help")
+ if(user.a_intent == "help")
for(var/datum/surgery/S in surgeries)
if(S.next_step(user, src))
return 1
@@ -34,7 +34,7 @@
if(D.IsSpreadByTouch())
ContractDisease(D)
- if(lying)
+ if(lying || isslime(src))
if(user.a_intent == "help")
if(surgeries.len)
for(var/datum/surgery/S in surgeries)
@@ -65,27 +65,15 @@
return 0
-/mob/living/carbon/attack_slime(mob/living/simple_animal/slime/M)
- if(..()) //successful slime attack
- if(M.powerlevel > 0)
- var/stunprob = M.powerlevel * 7 + 10 // 17 at level 1, 80 at level 10
- if(prob(stunprob))
- M.powerlevel -= 3
- if(M.powerlevel < 0)
- M.powerlevel = 0
-
- visible_message("The [M.name] has shocked [src]!", \
- "The [M.name] has shocked [src]!")
-
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(5, 1, src)
- s.start()
- var/power = M.powerlevel + rand(0,3)
- Weaken(power)
- if(stuttering < power)
- stuttering = power
- Stun(power)
- if (prob(stunprob) && M.powerlevel >= 8)
- adjustFireLoss(M.powerlevel * rand(6,10))
- updatehealth()
+/mob/living/carbon/attack_slime(mob/living/carbon/slime/M)
+ if(..())
+ var/power = M.powerlevel + rand(0,3)
+ Weaken(power)
+ if (stuttering < power)
+ stuttering = power
+ Stun(power)
+ var/stunprob = M.powerlevel * 7 + 10
+ if (prob(stunprob) && M.powerlevel >= 8)
+ adjustFireLoss(M.powerlevel * rand(6,10))
+ updatehealth()
return 1
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index 41a04d1273ff3..c24bf2d75b47f 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -13,15 +13,10 @@
var/obj/item/back = null
var/obj/item/clothing/mask/wear_mask = null
var/obj/item/weapon/tank/internal = null
- var/obj/item/head = null
var/datum/dna/dna = null//Carbon
- var/heart_attack = 0
var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks.
var/co2overloadtime = null
- var/temperature_resistance = T0C+75
- has_limbs = 1
-
- var/remote_view = 0
+ var/temperature_resistance = T0C+75
diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm
index 2cef64b3c8964..deca15ff0f794 100644
--- a/code/modules/mob/living/carbon/death.dm
+++ b/code/modules/mob/living/carbon/death.dm
@@ -1,5 +1,4 @@
/mob/living/carbon/death(gibbed)
- silent = 0
med_hud_set_health()
med_hud_set_status()
..(gibbed)
diff --git a/code/modules/mob/living/carbon/human/blood.dm b/code/modules/mob/living/carbon/human/blood.dm
index ac4e518258be8..48da639f97e8d 100644
--- a/code/modules/mob/living/carbon/human/blood.dm
+++ b/code/modules/mob/living/carbon/human/blood.dm
@@ -153,7 +153,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
*/
for(var/datum/disease/D in src.viruses)
- B.data["viruses"] += D.Copy()
+ B.data["viruses"] += new D.type(0, D, 1)
B.data["blood_DNA"] = copytext(src.dna.unique_enzymes,1,0)
if(src.resistances&&src.resistances.len)
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index b51e729b8d074..f20afceaaa3da 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -266,7 +266,7 @@
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/H = user
- var/obj/item/cybernetic_implant/eyes/hud/CIH = locate(/obj/item/cybernetic_implant/eyes/hud) in H.internal_organs
+ var/obj/item/cybernetic_implant/eyes/hud/CIH = locate(/obj/item/cybernetic_implant/eyes/hud) in internal_organs
if(istype(H.glasses, /obj/item/clothing/glasses/hud) || CIH)
var/perpname = get_face_name(get_id_name(""))
if(perpname)
@@ -276,12 +276,6 @@
msg += "\[Front photo\] "
msg += "\[Side photo\] "
if(istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(CIH,/obj/item/cybernetic_implant/eyes/hud/medical))
- var/implant_detect
- for(var/obj/item/cybernetic_implant/CI in internal_organs)
- implant_detect += "[name] is modified with a [CI.name]. "
- if(implant_detect)
- msg += "Detected cybernetic modifications: "
- msg += implant_detect
if(R)
var/health = R.fields["p_stat"]
msg += "\[[health]\]"
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 676caeff4e770..9685564633719 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -74,35 +74,11 @@
stat("Chemical Storage", "[mind.changeling.chem_charges]/[mind.changeling.chem_storage]")
stat("Absorbed DNA", mind.changeling.absorbedcount)
-
- //NINJACODE
- if(istype(wear_suit, /obj/item/clothing/suit/space/space_ninja)) //Only display if actually a ninja.
- var/obj/item/clothing/suit/space/space_ninja/SN = wear_suit
- if(statpanel("SpiderOS"))
- stat("SpiderOS Status:","[SN.s_initialized ? "Initialized" : "Disabled"]")
- stat("Current Time:", "[worldtime2text()]")
+ //NINJACODE
+ if(istype(wear_suit, /obj/item/clothing/suit/space/space_ninja))
+ var/obj/item/clothing/suit/space/space_ninja/SN = wear_suit
if(SN.s_initialized)
- //Suit gear
- stat("Energy Charge:", "[round(SN.cell.charge/100)]%")
- stat("Smoke Bombs:", "\Roman [SN.s_bombs]")
- //Ninja status
- if(dna)
- stat("Fingerprints:", "[md5(dna.uni_identity)]")
- stat("Unique Identity:", "[dna.unique_enzymes]")
- stat("Overall Status:", "[stat > 1 ? "dead" : "[health]% healthy"]")
- stat("Nutrition Status:", "[nutrition]")
- stat("Oxygen Loss:", "[getOxyLoss()]")
- stat("Toxin Levels:", "[getToxLoss()]")
- stat("Burn Severity:", "[getFireLoss()]")
- stat("Brute Trauma:", "[getBruteLoss()]")
- stat("Radiation Levels:","[radiation] rad")
- stat("Body Temperature:","[bodytemperature-T0C] degrees C ([bodytemperature*1.8-459.67] degrees F)")
-
- //Virsuses
- if(viruses.len)
- stat("Viruses:", null)
- for(var/datum/disease/D in viruses)
- stat("*", "[D.name], Type: [D.spread_text], Stage: [D.stage]/[D.max_stages], Possible Cure: [D.cure_text]")
+ stat("Energy Charge", round(SN.cell.charge/100))
/mob/living/carbon/human/ex_act(severity, ex_target)
@@ -263,8 +239,6 @@
if(istype(MB))
MB.RunOver(src)
- spreadFire(AM)
-
//Added a safety check in case you want to shock a human mob directly through electrocute_act.
/mob/living/carbon/human/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, var/safety = 0)
if(!safety)
@@ -524,6 +498,15 @@
/mob/living/carbon/human/proc/canUseHUD()
return !(src.stat || src.weakened || src.stunned || src.restrained())
+/mob/living/carbon/human/proc/play_xylophone()
+ if(!src.xylophone)
+ visible_message("[src] begins playing \his ribcage like a xylophone. It's quite spooky.","You begin to play a spooky refrain on your ribcage.","You hear a spooky xylophone melody.")
+ var/song = pick('sound/effects/xylophone1.ogg','sound/effects/xylophone2.ogg','sound/effects/xylophone3.ogg')
+ playsound(loc, song, 50, 1, -1)
+ xylophone = 1
+ spawn(1200)
+ xylophone = 0
+
/mob/living/carbon/human/can_inject(var/mob/user, var/error_msg, var/target_zone)
. = 1 // Default to returning true.
if(user && !target_zone)
@@ -665,23 +648,26 @@
if(prob(current_size * 5) && hand.w_class >= ((11-current_size)/2) && unEquip(hand))
step_towards(hand, src)
src << "\The [S] pulls \the [hand] from your grip!"
- irradiate(current_size * 3)
+ apply_effect(current_size * 3, IRRADIATE)
if(mob_negates_gravity())
return
..()
-/mob/living/carbon/human/help_shake_act(mob/living/carbon/M)
+
+/mob/living/carbon/human/help_shake_act(mob/living/carbon/human/M)
if(!istype(M))
return
+ var/mob/living/carbon/human/H = src
+
if(health >= 0)
if(src == M)
visible_message( \
"[src] examines \himself.", \
"You check yourself for injuries.")
- for(var/obj/item/organ/limb/org in organs)
+ for(var/obj/item/organ/limb/org in H.organs)
var/status = ""
var/brutedamage = org.brute_dam
var/burndamage = org.burn_dam
@@ -711,52 +697,26 @@
src << "\t [status == "OK" ? "\blue" : "\red"] My [org.getDisplayName()] is [status]."
for(var/obj/item/I in org.embedded_objects)
- src << "\t \red There is \a [I] embedded in your [org.getDisplayName()]!"
+ src << "\t \red There is \a [I] embedded in your [org.getDisplayName()]!"
- if(blood_max)
+ if(H.blood_max)
src << "You are bleeding!"
if(staminaloss)
if(staminaloss > 30)
src << "You're completely exhausted."
else
src << "You feel fatigued."
+ if(dna && dna.species.id && dna.species.id == "skeleton" && !H.w_uniform && !H.wear_suit)
+ H.play_xylophone()
else
- if(wear_suit)
- wear_suit.add_fingerprint(M)
- else if(w_uniform)
- w_uniform.add_fingerprint(M)
+ if(H.wear_suit)
+ H.wear_suit.add_fingerprint(M)
+ else if(H.w_uniform)
+ H.w_uniform.add_fingerprint(M)
..()
-/mob/living/carbon/human/proc/do_cpr(mob/living/carbon/C)
- if(C.stat == DEAD)
- src << "[C.name] is dead!"
- return
- if(is_mouth_covered())
- src << "Remove your mask!"
- return 0
- if(C.is_mouth_covered())
- src << "Remove their mask!"
- return 0
-
- if(C.cpr_time < world.time + 30)
- add_logs(src, C, "CPRed")
- visible_message("[src] is trying to perform CPR on [C.name]!", \
- "You try to perform CPR on [C.name]. Hold still!")
- if(!do_mob(src, C))
- src << "You fail to perform CPR on [C]!"
- return 0
-
- if(C.health <= config.health_threshold_crit)
- C.cpr_time = world.time
- var/suff = min(C.getOxyLoss(), 7)
- C.adjustOxyLoss(-suff)
- C.updatehealth()
- visible_message("[src] performs CPR on [C.name]!")
- C << "You feel a breath of fresh air enter your lungs. It feels good."
-
-
/mob/living/carbon/human/generateStaticOverlay()
var/image/staticOverlay = image(icon('icons/effects/effects.dmi', "static"), loc = src)
staticOverlay.override = 1
@@ -770,9 +730,4 @@
staticOverlay.override = 1
staticOverlays["letter"] = staticOverlay
-/mob/living/carbon/human/cuff_resist(obj/item/I)
- if(dna && dna.check_mutation(HULK))
- say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
- ..(I, cuff_break = 1)
- else
- ..()
+
diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm
index 844f2399a192c..3a34e1f3acb5c 100644
--- a/code/modules/mob/living/carbon/human/human_damage.dm
+++ b/code/modules/mob/living/carbon/human/human_damage.dm
@@ -124,14 +124,12 @@ mob/living/carbon/human/proc/hat_fall_prob()
var/update = 0
while(parts.len && (brute>0 || burn>0) )
var/obj/item/organ/limb/picked = pick(parts)
- var/brute_per_part = brute/parts.len
- var/burn_per_part = burn/parts.len
var/brute_was = picked.brute_dam
var/burn_was = picked.burn_dam
- update |= picked.take_damage(brute_per_part,burn_per_part)
+ update |= picked.take_damage(brute,burn)
brute -= (picked.brute_dam - brute_was)
burn -= (picked.burn_dam - burn_was)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index fd919216a096e..108d680a7348c 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -100,17 +100,17 @@ emp_act
return 1
if(wear_suit && istype(wear_suit, /obj/item/))
var/obj/item/I = wear_suit
- if(I.IsShield() && (prob(50)))
+ if(I.IsShield() && (prob(35)))
visible_message("The reactive teleport system flings [src] clear of [attack_text]!", \
"The reactive teleport system flings [src] clear of [attack_text]!")
var/list/turfs = new/list()
- for(var/turf/T in orange(6, src))
+ for(var/turf/T in orange(6))
if(istype(T,/turf/space)) continue
if(T.density) continue
if(T.x>world.maxx-6 || T.x<6) continue
if(T.y>world.maxy-6 || T.y<6) continue
turfs += T
- if(!turfs.len) turfs += pick(/turf in orange(6, src))
+ if(!turfs.len) turfs += pick(/turf in orange(6))
var/turf/picked = pick(turfs)
if(!isturf(picked)) return
if(buckled)
@@ -398,21 +398,25 @@ emp_act
updatehealth()
-/mob/living/carbon/human/attack_slime(mob/living/simple_animal/slime/M as mob)
- if(..()) //successful slime attack
- var/damage = rand(5, 25)
- if(M.is_adult)
- damage = rand(10, 35)
+/mob/living/carbon/human/attack_slime(mob/living/carbon/slime/M as mob)
+ ..()
+ var/damage = rand(1, 3)
- if(check_shields(damage, "the [M.name]"))
- return 0
+ if(M.is_adult)
+ damage = rand(10, 35)
+ else
+ damage = rand(5, 25)
- var/dam_zone = pick("head", "chest", "l_arm", "r_arm", "l_leg", "r_leg", "groin")
+ if(check_shields(damage, "the [M.name]"))
+ return 0
- var/obj/item/organ/limb/affecting = get_organ(ran_zone(dam_zone))
- var/armor_block = run_armor_check(affecting, "melee")
- apply_damage(damage, BRUTE, affecting, armor_block)
+ var/dam_zone = pick("head", "chest", "l_arm", "r_arm", "l_leg", "r_leg", "groin")
+
+ var/obj/item/organ/limb/affecting = get_organ(ran_zone(dam_zone))
+ var/armor_block = run_armor_check(affecting, "melee")
+ apply_damage(damage, BRUTE, affecting, armor_block)
+ return
/mob/living/carbon/human/mech_melee_attack(obj/mecha/M)
if(M.occupant.a_intent == "harm")
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 9b373ba72f40b..efcec3c28ee7c 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -15,7 +15,6 @@
var/skin_tone = "caucasian1" //Skin tone
var/lip_style = null //no lipstick by default- arguably misleading, as it could be used for general makeup
- var/lip_color = "white"
var/age = 30 //Player's age (pure fluff)
var/blood_type = "A+" //Player's bloodtype
@@ -32,6 +31,7 @@
var/obj/item/belt = null
var/obj/item/gloves = null
var/obj/item/glasses = null
+ var/obj/item/head = null
var/obj/item/ears = null
var/obj/item/wear_id = null
var/obj/item/r_store = null
@@ -40,15 +40,13 @@
var/icon/base_icon_state = "caucasian1_m"
+ var/list/organs = list() //Gets filled up in the constructor (human.dm, New() proc, line 24. I'm sick and tired of missing comments. -Agouri
+
var/special_voice = "" // For changing our voice. Used by a symptom.
+ var/xylophone = 0 //For the spoooooooky xylophone cooldown
+
var/gender_ambiguous = 0 //if something goes wrong during gender reassignment this generates a line in examine
var/blood_max = 0 //how much are we bleeding
- var/bleedsuppress = 0 //for stopping bloodloss, eventually this will be limb-based like bleeding
-
- var/list/organs = list() //Gets filled up in the constructor (human.dm, New() proc.
-
- var/datum/martial_art/martial_art = null
-
- var/name_override //For temporary visible name changes
\ No newline at end of file
+ var/bleedsuppress = 0 //for stopping bloodloss, eventually this will be limb-based like bleeding
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index ecc7c49649e09..902cce6896a05 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -39,8 +39,6 @@
/mob/living/carbon/human/get_visible_name()
var/face_name = get_face_name("")
var/id_name = get_id_name("")
- if(name_override)
- return name_override
if(face_name)
if(id_name && (id_name != face_name))
return "[face_name] (as [id_name])"
@@ -127,6 +125,9 @@
/mob/living/carbon/human/IsAdvancedToolUser()
return 1//Humans can use guns and such
+/mob/living/carbon/human/SpeciesCanConsume()
+ return 1 // Humans can eat, drink, and be forced to do so
+
/mob/living/carbon/human/InCritical()
return (health <= config.health_threshold_crit && stat == UNCONSCIOUS)
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index 58189d56b4bf1..01a14d53a6d55 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -15,11 +15,6 @@
var/obj/item/weapon/tank/jetpack/J = back
if((movement_dir || J.stabilization_on) && J.allow_thrust(0.01, src))
return 1
- if(istype(wear_suit, /obj/item/clothing/suit/space/hardsuit) && isturf(loc)) //Second check is so you can't use a jetpack in a mech
- var/obj/item/clothing/suit/space/hardsuit/C = wear_suit
- if(C.jetpack)
- if((movement_dir || C.jetpack.stabilization_on) && C.jetpack.allow_thrust(0.01, src))
- return 1
return 0
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 2bec9a1583bc2..6da553aaf24c0 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -268,6 +268,11 @@
else if(I == glasses)
glasses = null
update_inv_glasses(0)
+ else if(I == head)
+ head = null
+ if(I.flags & BLOCKHAIR)
+ update_hair(0) //rebuild hair
+ update_inv_head(0)
else if(I == ears)
ears = null
update_inv_ears(0)
@@ -301,6 +306,9 @@
s_store = null
update_inv_s_store(0)
+ update_action_buttons()
+
+
//This is an UNSAFE proc. Use mob_can_equip() before calling this one! Or rather use equip_to_slot_if_possible() or advanced_equip_to_slot_if_possible()
//set redraw_mob to 0 if you don't wish the hud to be updated - if you're doing it manually in your own proc.
/mob/living/carbon/human/equip_to_slot(obj/item/I, slot, redraw_mob = 1)
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index d14b746171c51..a8f4bc0f76567 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -327,7 +327,7 @@
/mob/living/carbon/human/handle_changeling()
- if(mind && hud_used)
+ if(mind)
if(mind.changeling)
mind.changeling.regenerate()
hud_used.lingchemdisplay.invisibility = 0
@@ -359,13 +359,4 @@
I.loc = get_turf(src)
visible_message("\the [I] falls out of [name]'s [L.getDisplayName()]!","\the [I] falls out of your [L.getDisplayName()]!")
-/mob/living/carbon/human/handle_heart()
- if(!heart_attack)
- return
- else
- losebreath += 5
- adjustOxyLoss(5)
- adjustBruteLoss(1)
- return
-
#undef HUMAN_MAX_OXYLOSS
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 491f878b2ecd9..c5b2f914a6494 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -1,12 +1,26 @@
-/mob/living/carbon/human/say_quote(input, spans)
- if(!input)
- return "says, \"...\"" //not the best solution, but it will stop a large number of runtimes. The cause is somewhere in the Tcomms code
- verb_say = dna.species.say_mod
+/mob/living/carbon/human/say_quote(text)
+ if(!text)
+ return "says, \"...\""; //not the best solution, but it will stop a large number of runtimes. The cause is somewhere in the Tcomms code
+ var/ending = copytext(text, length(text))
+ if (src.stuttering)
+ return "stammers, \"[text]\"";
if(src.slurring)
- input = attach_spans(input, spans)
- return "slurs, \"[input]\""
+ return "slurs, \"[text]\"";
+ if(isliving(src))
+ var/mob/living/L = src
+ if (L.getBrainLoss() >= 60)
+ return "gibbers, \"[text]\"";
+ if(ending == "?")
+ return "asks, \"[text]\"";
+ if(copytext(text, length(text) - 1) == "!!")
+ return "yells, \"[text]\"";
+ if(ending == "!")
+ return "exclaims, \"[text]\"";
- return ..()
+ if(dna)
+ return "[dna.species.say_mod], \"[text]\"";
+
+ return "says, \"[text]\"";
/mob/living/carbon/human/treat_message(message)
if(dna)
@@ -29,9 +43,6 @@
message = dna.mutations_say_mods(message)
return message
-/mob/living/carbon/human/get_spans()
- return ..() | dna.mutations_get_spans()
-
/mob/living/carbon/human/GetVoice()
if(istype(wear_mask, /obj/item/clothing/mask/gas/voice))
var/obj/item/clothing/mask/gas/voice/V = wear_mask
@@ -72,7 +83,7 @@
if(!istype(dongle)) return 0
if(dongle.translate_binary) return 1
-/mob/living/carbon/human/radio(message, message_mode, list/spans)
+/mob/living/carbon/human/radio(message, message_mode)
. = ..()
if(. != 0)
return .
@@ -80,22 +91,22 @@
switch(message_mode)
if(MODE_HEADSET)
if (ears)
- ears.talk_into(src, message, , spans)
+ ears.talk_into(src, message)
return ITALICS | REDUCE_RANGE
if(MODE_SECURE_HEADSET)
if (ears)
- ears.talk_into(src, message, 1, spans)
+ ears.talk_into(src, message, 1)
return ITALICS | REDUCE_RANGE
if(MODE_DEPARTMENT)
if (ears)
- ears.talk_into(src, message, message_mode, spans)
+ ears.talk_into(src, message, message_mode)
return ITALICS | REDUCE_RANGE
if(message_mode in radiochannels)
if(ears)
- ears.talk_into(src, message, message_mode, spans)
+ ears.talk_into(src, message, message_mode)
return ITALICS | REDUCE_RANGE
return 0
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 957e938d47e15..2c0a1b8e276b7 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1,5 +1,12 @@
// This code handles different species in the game.
+#define SPECIES_LAYER 26
+#define BODY_BEHIND_LAYER 25
+#define BODY_LAYER 24
+#define BODY_ADJ_LAYER 23
+#define HAIR_LAYER 9
+#define BODY_FRONT_LAYER 2
+
#define TINT_IMPAIR 2
#define TINT_BLIND 3
@@ -34,7 +41,7 @@
var/hair_alpha = 255 // the alpha used by the hair. 255 is completely solid, 0 is transparent.
var/use_skintones = 0 // does it use skintones or not? (spoiler alert this is only used by humans)
var/exotic_blood = null // If your race wants to bleed something other than bog standard blood, change this.
- var/meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human //What the species drops on gibbing
+ var/meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human //What the species drops on gibbing
var/list/no_equip = list() // slots the race can't equip stuff to
var/nojumpsuit = 0 // this is sorta... weird. it basically lets you equip stuff that usually needs jumpsuits without one, like belts and pockets and ids
@@ -85,6 +92,9 @@
var/g = (H.gender == FEMALE) ? "f" : "m"
+ if(!config.mutant_colors)
+ H.dna.mutant_color = default_color
+
if(MUTCOLORS in specflags)
var/image/spec_base
var/icon_state_string = "[id]_"
@@ -118,7 +128,10 @@
if(hair_color)
if(hair_color == "mutcolor")
- img_facial_s.color = "#" + H.dna.mutant_color
+ if(!config.mutant_colors)
+ img_facial_s.color = "#" + default_color
+ else
+ img_facial_s.color = "#" + H.dna.mutant_color
else
img_facial_s.color = "#" + hair_color
else
@@ -146,7 +159,10 @@
if(hair_color)
if(hair_color == "mutcolor")
- img_hair_s.color = "#" + H.dna.mutant_color
+ if(!config.mutant_colors)
+ img_hair_s.color = "#" + default_color
+ else
+ img_hair_s.color = "#" + H.dna.mutant_color
else
img_hair_s.color = "#" + hair_color
else
@@ -170,9 +186,7 @@
// lipstick
if(H.lip_style && LIPS in specflags)
- var/image/lips = image("icon"='icons/mob/human_face.dmi', "icon_state"="lips_[H.lip_style]_s", "layer" = -BODY_LAYER)
- lips.color = H.lip_color
- standing += lips
+ standing += image("icon"='icons/mob/human_face.dmi', "icon_state"="lips_[H.lip_style]_s", "layer" = -BODY_LAYER)
// eyes
if(EYECOLOR in specflags)
@@ -238,11 +252,13 @@
else
icon_state_string += "_s"
+ if(!config.mutant_colors)
+ H.dna.mutant_color = default_color
+
for(var/layer in relevent_layers)
for(var/bodypart in bodyparts_to_add)
I = image("icon" = 'icons/mob/mutant_bodyparts.dmi', "icon_state" = "[icon_state_string]_[bodypart]_[layer]", "layer" =- layer)
- if(!(H.disabilities & HUSK))
- I.color = "#[H.dna.mutant_color]"
+ I.color = "#[H.dna.mutant_color]"
standing += I
H.overlays_standing[layer] = standing.Copy()
standing = list()
@@ -501,11 +517,6 @@
if(!(SEE_OBJS & H.permanent_sight_flags))
H.sight &= ~SEE_OBJS
- if(H.remote_view)
- H.sight |= SEE_TURFS
- H.sight |= SEE_MOBS
- H.sight |= SEE_OBJS
-
H.see_in_dark = (H.sight == SEE_TURFS|SEE_MOBS|SEE_OBJS) ? 8 : darksight
var/see_temp = H.see_invisible
H.see_invisible = invis_sight
@@ -644,50 +655,40 @@
/datum/species/proc/movement_delay(var/mob/living/carbon/human/H)
var/mspeed = 0
- if(!(H.status_flags & IGNORESLOWDOWN))
-
- var/grav = has_gravity(H)
- var/hasjetpack = 0
- if(!grav)
- var/obj/item/weapon/tank/jetpack/J
- var/obj/item/weapon/tank/jetpack/P
-
- if(istype(H.back, /obj/item/weapon/tank/jetpack))
- J = H.back
- if(istype(H.wear_suit,/obj/item/clothing/suit/space/hardsuit)) //copypasta but faster implementation currently
- var/obj/item/clothing/suit/space/hardsuit/C = H.wear_suit
- P = C.jetpack
- if(J)
- if(J.allow_thrust(0.01, H))
- hasjetpack = 1
- else if(P)
- if(P.allow_thrust(0.01, H))
- hasjetpack = 1
-
- mspeed = 1 - hasjetpack
-
- if(grav || !hasjetpack)
- var/health_deficiency = (100 - H.health + H.staminaloss)
- if(health_deficiency >= 40)
- mspeed += (health_deficiency / 25)
-
- var/hungry = (500 - H.nutrition) / 5 //So overeat would be 100 and default level would be 80
- if(hungry >= 70)
- mspeed += hungry / 50
+ var/hasjetpack = 0
+ if(istype(H.back, /obj/item/weapon/tank/jetpack))
+ var/obj/item/weapon/tank/jetpack/J = H.back
+ if(J.allow_thrust(0.01, H))
+ hasjetpack = 1
+ var/grav = has_gravity(H)
- if(H.wear_suit)
- mspeed += H.wear_suit.slowdown
- if(H.shoes)
- mspeed += H.shoes.slowdown
- if(H.back)
- mspeed += H.back.slowdown
+ if(!grav && !hasjetpack)
+ mspeed += 1 //Slower space without jetpack
+
+ var/health_deficiency = (100 - H.health + H.staminaloss)
+ if(health_deficiency >= 40)
+ mspeed += (health_deficiency / 25)
+
+ var/hungry = (500 - H.nutrition) / 5 //So overeat would be 100 and default level would be 80
+ if(hungry >= 70)
+ mspeed += hungry / 50
+
+ if(H.wear_suit && grav)
+ mspeed += H.wear_suit.slowdown
+ if(H.shoes && grav)
+ mspeed += H.shoes.slowdown
+ if(H.back && grav)
+ mspeed += H.back.slowdown
+
+ if((H.disabilities & FAT) && grav)
+ mspeed += 1.5
+ if(H.bodytemperature < 283.222)
+ mspeed += (283.222 - H.bodytemperature) / 10 * (grav+0.5)
- if((H.disabilities & FAT))
- mspeed += 1.5
- if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT)
- mspeed += (BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR
+ mspeed += speedmod
- mspeed += speedmod
+ if(H.status_flags & IGNORESLOWDOWN)
+ mspeed = 0
if(H.status_flags & GOTTAGOFAST)
mspeed -= 1
@@ -695,6 +696,7 @@
if(H.status_flags & GOTTAGOREALLYFAST)
mspeed -= 2
+
return mspeed
//////////////////
@@ -702,15 +704,11 @@
//////////////////
/datum/species/proc/spec_attack_hand(var/mob/living/carbon/human/M, var/mob/living/carbon/human/H)
- if(!istype(M)) //sanity check for drones.
- return
if((M != H) && H.check_shields(0, M.name))
add_logs(M, H, "attempted to touch")
H.visible_message("[M] attempted to touch [H]!")
return 0
- var/datum/martial_art/attacker_style = M.martial_art
-
switch(M.a_intent)
if("help")
if(H.health >= 0)
@@ -718,119 +716,132 @@
if(H != M)
add_logs(M, H, "shaked")
return 1
- else
- M.do_cpr(H)
+
+ //CPR
+ if((M.head && (M.head.flags & HEADCOVERSMOUTH)) || (M.wear_mask && (M.wear_mask.flags & MASKCOVERSMOUTH)))
+ M << "Remove your mask!"
+ return 0
+ if((H.head && (H.head.flags & HEADCOVERSMOUTH)) || (H.wear_mask && (H.wear_mask.flags & MASKCOVERSMOUTH)))
+ M << "Remove their mask!"
+ return 0
+
+ if(H.cpr_time < world.time + 30)
+ add_logs(M, H, "CPRed")
+ M.visible_message("[M] is trying to perform CPR on [H]!", \
+ "You try to perform CPR on [H]. Hold still!")
+ if(!do_mob(M, H))
+ M << "You fail to perform CPR on [H]!"
+ return 0
+ if((H.health >= -99 && H.health <= 0))
+ H.cpr_time = world.time
+ var/suff = min(H.getOxyLoss(), 7)
+ H.adjustOxyLoss(-suff)
+ H.updatehealth()
+ M.visible_message("[M] performs CPR on [H]!")
+ H << "You feel a breath of fresh air enter your lungs. It feels good."
if("grab")
- if(attacker_style && attacker_style.grab_act(M,H))
- return 1
- else
- H.grabbedby(M)
- return 1
+ H.grabbedby(M)
+ return 1
if("harm")
- if(attacker_style && attacker_style.harm_act(M,H))
- return 1
- else
- add_logs(M, H, "punched")
- M.do_attack_animation(H)
+ add_logs(M, H, "punched")
+ M.do_attack_animation(H)
+
+ var/atk_verb = "punch"
+ if(H.lying)
+ atk_verb = "kick"
+ else if(M.dna)
+ atk_verb = M.dna.species.attack_verb
- var/atk_verb = "punch"
- if(H.lying)
- atk_verb = "kick"
- else if(M.dna)
- atk_verb = M.dna.species.attack_verb
+ var/damage = rand(0, 9)
+ if(M.dna)
+ damage += M.dna.species.punchmod
- var/damage = rand(0, 9)
+ if(!damage)
if(M.dna)
- damage += M.dna.species.punchmod
+ playsound(H.loc, M.dna.species.miss_sound, 25, 1, -1)
+ else
+ playsound(H.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
- if(!damage)
- if(M.dna)
- playsound(H.loc, M.dna.species.miss_sound, 25, 1, -1)
- else
- playsound(H.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
+ H.visible_message("[M] has attempted to [atk_verb] [H]!")
+ return 0
- H.visible_message("[M] has attempted to [atk_verb] [H]!")
- return 0
+ var/obj/item/organ/limb/affecting = H.get_organ(ran_zone(M.zone_sel.selecting))
+ var/armor_block = H.run_armor_check(affecting, "melee")
- var/obj/item/organ/limb/affecting = H.get_organ(ran_zone(M.zone_sel.selecting))
- var/armor_block = H.run_armor_check(affecting, "melee")
+ if(M.dna)
+ playsound(H.loc, M.dna.species.attack_sound, 25, 1, -1)
+ else
+ playsound(H.loc, 'sound/weapons/punch1.ogg', 25, 1, -1)
- if(M.dna)
- playsound(H.loc, M.dna.species.attack_sound, 25, 1, -1)
- else
- playsound(H.loc, 'sound/weapons/punch1.ogg', 25, 1, -1)
+ H.visible_message("[M] has [atk_verb]ed [H]!", \
+ "[M] has [atk_verb]ed [H]!")
- H.visible_message("[M] has [atk_verb]ed [H]!", \
- "[M] has [atk_verb]ed [H]!")
+ H.apply_damage(damage, BRUTE, affecting, armor_block)
+ if((H.stat != DEAD) && damage >= 9)
+ H.visible_message("[M] has weakened [H]!", \
+ "[M] has weakened [H]!")
+ H.apply_effect(4, WEAKEN, armor_block)
+ H.forcesay(hit_appends)
+ else if(H.lying)
+ H.forcesay(hit_appends)
- H.apply_damage(damage, BRUTE, affecting, armor_block)
- if((H.stat != DEAD) && damage >= 9)
- H.visible_message("[M] has weakened [H]!", \
- "[M] has weakened [H]!")
- H.apply_effect(4, WEAKEN, armor_block)
- H.forcesay(hit_appends)
- else if(H.lying)
- H.forcesay(hit_appends)
if("disarm")
- if(attacker_style && attacker_style.disarm_act(M,H))
- return 1
- else
- M.do_attack_animation(H)
- add_logs(M, H, "disarmed")
-
- if(H.w_uniform)
- H.w_uniform.add_fingerprint(M)
- var/obj/item/organ/limb/affecting = H.get_organ(ran_zone(M.zone_sel.selecting))
- var/randn = rand(1, 100)
- if(randn <= 25)
- playsound(H, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- H.visible_message("[M] has pushed [H]!",
- "[M] has pushed [H]!")
- H.apply_effect(2, WEAKEN, H.run_armor_check(affecting, "melee", "Your armor prevents your fall!", "Your armor softens your fall!"))
- H.forcesay(hit_appends)
- return
-
- var/talked = 0 // BubbleWrap
-
- if(randn <= 60)
- //BubbleWrap: Disarming breaks a pull
- if(H.pulling)
- H.visible_message("[M] has broken [H]'s grip on [H.pulling]!")
+ M.do_attack_animation(H)
+ add_logs(M, H, "disarmed")
+
+ if(H.w_uniform)
+ H.w_uniform.add_fingerprint(M)
+ var/obj/item/organ/limb/affecting = H.get_organ(ran_zone(M.zone_sel.selecting))
+ var/randn = rand(1, 100)
+ if(randn <= 25)
+ H.apply_effect(2, WEAKEN, H.run_armor_check(affecting, "melee"))
+ playsound(H, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ H.visible_message("[M] has pushed [H]!",
+ "[M] has pushed [H]!")
+ H.forcesay(hit_appends)
+ return
+
+ var/talked = 0 // BubbleWrap
+
+ if(randn <= 60)
+ //BubbleWrap: Disarming breaks a pull
+ if(H.pulling)
+ H.visible_message("[M] has broken [H]'s grip on [H.pulling]!")
+ talked = 1
+ H.stop_pulling()
+
+ //BubbleWrap: Disarming also breaks a grab - this will also stop someone being choked, won't it?
+ if(istype(H.l_hand, /obj/item/weapon/grab))
+ var/obj/item/weapon/grab/lgrab = H.l_hand
+ if(lgrab.affecting)
+ H.visible_message("[M] has broken [H]'s grip on [lgrab.affecting]!")
talked = 1
- H.stop_pulling()
-
- //BubbleWrap: Disarming also breaks a grab - this will also stop someone being choked, won't it?
- if(istype(H.l_hand, /obj/item/weapon/grab))
- var/obj/item/weapon/grab/lgrab = H.l_hand
- if(lgrab.affecting)
- H.visible_message("[M] has broken [H]'s grip on [lgrab.affecting]!")
- talked = 1
- spawn(1)
- qdel(lgrab)
- if(istype(H.r_hand, /obj/item/weapon/grab))
- var/obj/item/weapon/grab/rgrab = H.r_hand
- if(rgrab.affecting)
- H.visible_message("[M] has broken [H]'s grip on [rgrab.affecting]!")
- talked = 1
- spawn(1)
- qdel(rgrab)
- //End BubbleWrap
-
- if(!talked) //BubbleWrap
- if(H.drop_item())
- H.visible_message("[M] has disarmed [H]!", \
- "[M] has disarmed [H]!")
- playsound(H, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- return
-
-
- playsound(H, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
- H.visible_message("[M] attempted to disarm [H]!", \
- "[M] attemped to disarm [H]!")
+ spawn(1)
+ qdel(lgrab)
+ if(istype(H.r_hand, /obj/item/weapon/grab))
+ var/obj/item/weapon/grab/rgrab = H.r_hand
+ if(rgrab.affecting)
+ H.visible_message("[M] has broken [H]'s grip on [rgrab.affecting]!")
+ talked = 1
+ spawn(1)
+ qdel(rgrab)
+ //End BubbleWrap
+
+ if(!talked) //BubbleWrap
+ if(H.drop_item())
+ H.visible_message("[M] has disarmed [H]!", \
+ "[M] has disarmed [H]!")
+ playsound(H, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ return
+
+
+ playsound(H, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
+ H.visible_message("[M] attempted to disarm [H]!", \
+ "[M] attemped to disarm [H]!")
return
/datum/species/proc/spec_attacked_by(var/obj/item/I, var/mob/living/user, var/def_zone, var/obj/item/organ/limb/affecting, var/hit_area, var/intent, var/obj/item/organ/limb/target_limb, target_area, var/mob/living/carbon/human/H)
@@ -995,8 +1006,10 @@
var/datum/gas_mixture/environment = H.loc.return_air()
var/datum/gas_mixture/breath
+ // HACK NEED CHANGING LATER
if(H.health <= config.health_threshold_crit)
H.losebreath++
+
if(H.losebreath>0) //Suffocating so do not take a breath
H.losebreath--
if (prob(10)) //Gasp per 10 ticks? Sounds about right.
@@ -1278,6 +1291,13 @@
H.AddLuminosity(-3)
H.update_fire()
+#undef SPECIES_LAYER
+#undef BODY_BEHIND_LAYER
+#undef BODY_LAYER
+#undef BODY_ADJ_LAYER
+#undef HAIR_LAYER
+#undef BODY_FRONT_LAYER
+
#undef HUMAN_MAX_OXYLOSS
#undef HUMAN_CRIT_MAX_OXYLOSS
diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm
index b9ca12ef44a2a..f88fde9ee1bbb 100644
--- a/code/modules/mob/living/carbon/human/species_types.dm
+++ b/code/modules/mob/living/carbon/human/species_types.dm
@@ -34,7 +34,7 @@
attack_verb = "slash"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
- meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/lizard
+ meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/lizard
/datum/species/lizard/handle_speech(message)
// jesus christ why
@@ -53,12 +53,12 @@
id = "plant"
default_color = "59CE00"
specflags = list(MUTCOLORS,EYECOLOR)
- attack_verb = "slash"
+ attack_verb = "slice"
attack_sound = 'sound/weapons/slice.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
burnmod = 1.25
heatmod = 1.5
- meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/plant
+ meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/plant
/datum/species/plant/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
if(chem.id == "plantbgone")
@@ -70,9 +70,10 @@
switch(proj_type)
if(/obj/item/projectile/energy/floramut)
if(prob(15))
- H.irradiate(rand(30,80))
+ H.apply_effect((rand(30,80)),IRRADIATE)
H.Weaken(5)
- H.visible_message("[H] writhes in pain as \his vacuoles boil.", "[H] writhes in pain as \his vacuoles boil.", "You hear the crunching of leaves.")
+ for (var/mob/V in viewers(H))
+ V.show_message("[H] writhes in pain as \his vacuoles boil.", 3, "You hear the crunching of leaves.", 2)
if(prob(80))
randmutb(H)
domutcheck(H,null)
@@ -126,7 +127,7 @@
darksight = 8
sexes = 0
ignored_by = list(/mob/living/simple_animal/hostile/faithless)
- meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/shadow
+ meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/shadow
specflags = list(NOBREATH,NOBLOOD,RADIMMUNE)
/datum/species/shadow/spec_life(mob/living/carbon/human/H)
@@ -156,8 +157,8 @@
specflags = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD)
hair_color = "mutcolor"
hair_alpha = 150
- ignored_by = list(/mob/living/simple_animal/slime)
- meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/slime
+ ignored_by = list(/mob/living/carbon/slime)
+ meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/slime
exotic_blood = /datum/reagent/toxin/slimejelly
var/recently_changed = 1
@@ -197,7 +198,7 @@
say_mod = "chirps"
eyes = "jelleyes"
specflags = list(MUTCOLORS,EYECOLOR,NOBLOOD)
- meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/slime
+ meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/slime
exotic_blood = /datum/reagent/toxin/slimejelly
var/recently_changed = 1
@@ -238,7 +239,7 @@
punchmod = 5
no_equip = list(slot_wear_mask, slot_wear_suit, slot_gloves, slot_shoes, slot_head, slot_w_uniform)
nojumpsuit = 1
- meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/golem
+ meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/golem
/*
@@ -248,7 +249,7 @@
/datum/species/golem/adamantine
name = "Adamantine Golem"
id = "adamantine"
- meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/golem/adamantine
+ meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/golem/adamantine
/*
FLIES
@@ -259,7 +260,7 @@
name = "Human?"
id = "fly"
say_mod = "buzzes"
- meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/fly
+ meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/fly
/datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
if(chem.id == "pestkiller")
@@ -280,7 +281,7 @@
id = "skeleton"
say_mod = "rattles"
sexes = 0
- meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton
+ meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/skeleton
specflags = list(NOBREATH,HEATRES,COLDRES,NOBLOOD,RADIMMUNE)
/*
ZOMBIES
@@ -292,7 +293,7 @@
id = "zombie"
say_mod = "moans"
sexes = 0
- meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie
+ meat = /obj/item/weapon/reagent_containers/food/snacks/meat/human/mutant/zombie
specflags = list(NOBREATH,HEATRES,COLDRES,NOBLOOD,RADIMMUNE)
/datum/species/zombie/handle_speech(message)
@@ -310,37 +311,3 @@
message_list.Insert(insertpos, "[pick("BRAINS", "Brains", "Braaaiinnnsss", "BRAAAIIINNSSS")]...")
return list2text(message_list, " ")
-
-/datum/species/cosmetic_zombie
- name = "Human"
- id = "zombie"
- sexes = 0
- meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie
-
-
-/datum/species/abductor
- name = "Abductor"
- id = "abductor"
- darksight = 3
- say_mod = "gibbers"
- sexes = 0
- invis_sight = SEE_INVISIBLE_LEVEL_ONE
- specflags = list(NOBLOOD,NOBREATH)
- var/scientist = 0 // vars to not pollute spieces list with castes
- var/agent = 0
- var/team = 1
-
-/datum/species/abductor/handle_speech(message)
- //Hacks
- var/mob/living/carbon/human/user = usr
- for(var/mob/living/carbon/human/H in mob_list)
- if(H.dna.species.id != "abductor")
- continue
- else
- var/datum/species/abductor/target_spec = H.dna.species
- if(target_spec.team == team)
- H << "[user.name]: [message]"
- //return - technically you can add more aliens to a team
- for(var/mob/M in dead_mob_list)
- M << "[user.name]: [message]"
- return ""
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index c33e23bbf8e7a..9139c933661db 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -43,6 +43,12 @@ There are several things that need to be remembered:
update_hair() //Handles updating your hair overlay (used to be update_face, but mouth and
eyes were merged into update_body())
+> I repurposed an old unused variable which was in the code called (coincidentally) var/update_icon
+ It can be used as another method of triggering regenerate_icons(). It's basically a flag that when set to non-zero
+ will call regenerate_icons() at the next life() call and then reset itself to 0.
+ The idea behind it is icons are regenerated only once, even if multiple events requested it.
+ //NOTE: fairly unused, maybe this could be removed?
+
If you have any questions/constructive-comments/bugs-to-report
Please contact me on #coderbus IRC. ~Carnie x
//Carn can sometimes be hard to reach now. However IRC is still your best bet for getting help.
@@ -138,7 +144,7 @@ Please contact me on #coderbus IRC. ~Carnie x
//HAIR OVERLAY
-/mob/living/carbon/human/update_hair()
+/mob/living/carbon/human/proc/update_hair()
//Reset our hair
remove_overlay(HAIR_LAYER)
@@ -260,22 +266,17 @@ Please contact me on #coderbus IRC. ~Carnie x
if(!t_color) t_color = icon_state
var/image/standing
-
- var/iconfile2use //Which icon file to use to generate the overlay and any female alterations.
-
if(U.alternate_worn_icon)
- iconfile2use = U.alternate_worn_icon
- if(!iconfile2use)
- iconfile2use = 'icons/mob/uniform.dmi'
-
- standing = image("icon"=iconfile2use, "icon_state"="[t_color]_s", "layer"=-UNIFORM_LAYER)
+ standing = image("icon"=U.alternate_worn_icon, "icon_state"="[t_color]_s", "layer"=-UNIFORM_LAYER)
+ if(!standing)
+ standing = image("icon"='icons/mob/uniform.dmi', "icon_state"="[t_color]_s", "layer"=-UNIFORM_LAYER)
overlays_standing[UNIFORM_LAYER] = standing
if(dna && dna.species.sexes)
var/G = (gender == FEMALE) ? "f" : "m"
if(G == "f" && U.fitted != NO_FEMALE_UNIFORM)
- standing = wear_female_version(t_color, iconfile2use, UNIFORM_LAYER, U.fitted)
+ standing = wear_female_version(t_color, 'icons/mob/uniform.dmi', UNIFORM_LAYER, U.fitted)
overlays_standing[UNIFORM_LAYER] = standing
if(w_uniform.blood_DNA)
@@ -631,14 +632,6 @@ Please contact me on #coderbus IRC. ~Carnie x
var/standing = image("icon"=female_clothing_icons["[t_color]_s"], "layer"=-layer)
return(standing)
-/mob/living/carbon/human/proc/get_overlays_copy(var/list/unwantedLayers)
- var/list/out = new
- for(var/i=1;i<=TOTAL_LAYERS;i++)
- if(overlays_standing[i])
- if(i in unwantedLayers)
- continue
- out += overlays_standing[i]
- return out
//Human Overlays Indexes/////////
#undef SPECIES_LAYER
diff --git a/code/modules/mob/living/carbon/human/whisper.dm b/code/modules/mob/living/carbon/human/whisper.dm
index 23bb31ead5612..24d98e205e77b 100644
--- a/code/modules/mob/living/carbon/human/whisper.dm
+++ b/code/modules/mob/living/carbon/human/whisper.dm
@@ -63,16 +63,15 @@
for(var/mob/M in watching)
M.show_message(rendered, 2)
- var/spans = list(SPAN_ITALICS)
- rendered = "[GetVoice()][alt_name] [whispers], \"[attach_spans(message, spans)]\""
+ rendered = "[GetVoice()][alt_name] [whispers], \"[message]\""
for(var/mob/M in listening)
- M.Hear(rendered, src, languages, message, , spans)
+ M.Hear(rendered, src, languages, message)
message = stars(message)
- rendered = "[GetVoice()][alt_name] [whispers], \"[attach_spans(message, spans)]\""
+ rendered = "[GetVoice()][alt_name] [whispers], \"[message]\""
for(var/mob/M in eavesdropping)
- M.Hear(rendered, src, languages, message, , spans)
+ M.Hear(rendered, src, languages, message)
if(critical) //Dying words.
succumb(1)
diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm
index 876f23fc37a56..5a7455748cff4 100644
--- a/code/modules/mob/living/carbon/inventory.dm
+++ b/code/modules/mob/living/carbon/inventory.dm
@@ -4,8 +4,6 @@
return back
if(slot_wear_mask)
return wear_mask
- if(slot_head)
- return head
if(slot_handcuffed)
return handcuffed
if(slot_legcuffed)
@@ -14,33 +12,4 @@
return l_hand
if(slot_r_hand)
return r_hand
- return null
-
-
-/mob/living/carbon/unEquip(obj/item/I) //THIS PROC DID NOT CALL ..() AND THAT COST ME AN ENTIRE DAY OF DEBUGGING.
- . = ..() //Sets the default return value to what the parent returns.
- if(!. || !I) //We don't want to set anything to null if the parent returned 0.
- return
-
- if(I == head)
- head = null
- if(I.flags & BLOCKHAIR)
- update_hair(0)
- update_inv_head(0)
- else if(I == back)
- back = null
- update_inv_back(0)
- else if(I == wear_mask)
- if(istype(src, /mob/living/carbon/human)) //If we don't do this hair won't be properly rebuilt.
- return
- wear_mask = null
- update_inv_wear_mask(0)
- else if(I == handcuffed)
- handcuffed = null
- if(buckled && buckled.buckle_requires_restraints)
- buckled.unbuckle_mob()
- update_inv_handcuffed(0)
- else if(I == legcuffed)
- legcuffed = null
- update_inv_legcuffed(0)
-
+ return null
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 3b4025f952834..6ec25c5209e41 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -6,21 +6,60 @@
return
if(!loc)
return
+ var/datum/gas_mixture/environment = loc.return_air()
+
+ if(stat != DEAD)
+
+ //Breathing, if applicable
+ handle_breathing()
- if(..())
//Updates the number of stored chemicals for powers
handle_changeling()
- //Heart Attacks, etc.
- handle_heart()
+
+ //Mutations and radiation
+ handle_mutations_and_radiation()
+
+ //Chemicals in the body
+ handle_chemicals_in_body()
+
+ //Blud
+ handle_blood()
+
+ //Random events (vomiting etc)
+ handle_random_events()
. = 1
+ //Handle temperature/pressure differences between body and environment
+ handle_environment(environment)
+
+ handle_fire()
+
+ //stuff in the stomach
+ handle_stomach()
+
+ update_canmove()
+
+ update_gravity(mob_has_gravity())
+
+ for(var/obj/item/weapon/grab/G in src)
+ G.process()
+
+ handle_regular_status_updates() // Status updates, death etc.
+
+ if(client)
+ handle_regular_hud_updates()
+
+ return .
+
+
+
///////////////
// BREATHING //
///////////////
//Start of a breath chain, calls breathe()
-/mob/living/carbon/handle_breathing()
+/mob/living/carbon/proc/handle_breathing()
if(SSmob.times_fired%4==2 || failed_last_breath)
breathe() //Breathe per 4 ticks, unless suffocating
else
@@ -188,7 +227,7 @@
//Fourth and final link in a breath chain
/mob/living/carbon/proc/handle_breath_temperature(datum/gas_mixture/breath)
- return
+
/mob/living/carbon/proc/get_breath_from_internal(volume_needed)
if(internal)
@@ -209,7 +248,7 @@
/mob/living/carbon/proc/handle_changeling()
return
-/mob/living/carbon/handle_mutations_and_radiation()
+/mob/living/carbon/proc/handle_mutations_and_radiation()
if(radiation)
switch(radiation)
@@ -234,21 +273,39 @@
radiation = Clamp(radiation, 0, 100)
-/mob/living/carbon/handle_chemicals_in_body()
+/mob/living/carbon/proc/handle_chemicals_in_body()
if(reagents)
reagents.metabolize(src)
-/mob/living/carbon/handle_blood()
+ if(drowsyness)
+ drowsyness--
+ eye_blurry = max(2, eye_blurry)
+ if(prob(5))
+ sleeping += 1
+ Paralyse(5)
+
+ confused = max(0, confused - 1)
+ // decrement dizziness counter, clamped to 0
+ if(resting)
+ dizziness = max(0, dizziness - 5)
+ jitteriness = max(0, jitteriness - 5)
+ else
+ dizziness = max(0, dizziness - 1)
+ jitteriness = max(0, jitteriness - 1)
+
+ updatehealth()
+ return
+
+/mob/living/carbon/proc/handle_blood()
return
-/mob/living/carbon/handle_random_events()
+/mob/living/carbon/proc/handle_random_events()
return
-/mob/living/carbon/proc/handle_heart()
+/mob/living/carbon/proc/handle_environment(var/datum/gas_mixture/environment)
return
-/mob/living/carbon/handle_environment(var/datum/gas_mixture/environment) return
-/mob/living/carbon/handle_stomach()
+/mob/living/carbon/proc/handle_stomach()
spawn(0)
for(var/mob/living/M in stomach_contents)
if(M.loc != src)
@@ -265,59 +322,55 @@
M.adjustBruteLoss(5)
nutrition += 10
-//This updates the health and status of the mob (conscious, unconscious, dead)
-/mob/living/carbon/handle_regular_status_updates()
-
- if(..()) //alive
+/mob/living/carbon/proc/handle_regular_status_updates()
+ if(stat == DEAD)
+ eye_blind = max(eye_blind, 1)
+ silent = 0
+ else
+ updatehealth()
if(health <= config.health_threshold_dead || !getorgan(/obj/item/organ/brain))
death()
- return
+ eye_blind = max(eye_blind, 1)
+ silent = 0
+ return 1
if(getOxyLoss() > 50 || health <= config.health_threshold_crit)
Paralyse(3)
stat = UNCONSCIOUS
- if(sleeping)
+ if(paralysis)
+ AdjustParalysis(-1)
+ else if(sleeping)
+ handle_dreams()
+ adjustStaminaLoss(-10)
+ sleeping = max(sleeping-1, 0)
stat = UNCONSCIOUS
+ if( prob(10) && health && !hal_crit )
+ spawn(0)
+ emote("snore")
- CheckStamina()
- return 1
-
-//this updates all special effects: stunned, sleeping, weakened, druggy, stuttering, etc..
-/mob/living/carbon/handle_status_effects()
- ..()
+ else if (status_flags & FAKEDEATH)
+ stat = UNCONSCIOUS
- if(sleeping)
- handle_dreams()
- adjustStaminaLoss(-10)
- sleeping = max(sleeping-1, 0)
- if( prob(10) && health && !hal_crit )
- spawn(0)
- emote("snore")
-
- var/restingpwr = 1 + 4 * resting
-
- //Dizziness
- if(dizziness)
- var/client/C = client
- var/pixel_x_diff = 0
- var/pixel_y_diff = 0
- var/temp
- var/saved_dizz = dizziness
- if(C)
- var/oldsrc = src
- var/amplitude = dizziness*(sin(dizziness * 0.044 * world.time) + 1) / 70 // This shit is annoying at high strength
- src = null
- spawn(0)
- if(C)
- temp = amplitude * sin(0.008 * saved_dizz * world.time)
- pixel_x_diff += temp
- C.pixel_x += temp
- temp = amplitude * cos(0.008 * saved_dizz * world.time)
- pixel_y_diff += temp
- C.pixel_y += temp
- sleep(3)
+ else
+ stat = CONSCIOUS
+
+ handle_disabilities()
+
+ //Dizziness
+ if(dizziness)
+ var/client/C = client
+ var/pixel_x_diff = 0
+ var/pixel_y_diff = 0
+ var/temp
+ var/saved_dizz = dizziness
+ dizziness = max(dizziness-1, 0)
+ if(C)
+ var/oldsrc = src
+ var/amplitude = dizziness*(sin(dizziness * 0.044 * world.time) + 1) / 70 // This shit is annoying at high strength
+ src = null
+ spawn(0)
if(C)
temp = amplitude * sin(0.008 * saved_dizz * world.time)
pixel_x_diff += temp
@@ -325,56 +378,87 @@
temp = amplitude * cos(0.008 * saved_dizz * world.time)
pixel_y_diff += temp
C.pixel_y += temp
- sleep(3)
- if(C)
- C.pixel_x -= pixel_x_diff
- C.pixel_y -= pixel_y_diff
- src = oldsrc
- dizziness = max(dizziness - restingpwr, 0)
-
- if(drowsyness)
- drowsyness = max(drowsyness - restingpwr, 0)
- eye_blurry = max(2, eye_blurry)
- if(prob(5))
- sleeping += 1
- Paralyse(5)
-
- if(confused)
- confused = max(0, confused - 1)
-
- //Jitteryness
- if(jitteriness)
- do_jitter_animation(jitteriness)
- jitteriness = max(jitteriness - restingpwr, 0)
-
- if(stuttering)
- stuttering = max(stuttering-1, 0)
-
- if(slurring)
- slurring = max(slurring-1,0)
-
- if(silent)
- silent = max(silent-1, 0)
+ sleep(3)
+ if(C)
+ temp = amplitude * sin(0.008 * saved_dizz * world.time)
+ pixel_x_diff += temp
+ C.pixel_x += temp
+ temp = amplitude * cos(0.008 * saved_dizz * world.time)
+ pixel_y_diff += temp
+ C.pixel_y += temp
+ sleep(3)
+ if(C)
+ C.pixel_x -= pixel_x_diff
+ C.pixel_y -= pixel_y_diff
+ src = oldsrc
+
+ //Jitteryness
+ if(jitteriness)
+ do_jitter_animation(jitteriness)
+ jitteriness = max(jitteriness-1, 0)
+
+ //Other
+
+ if(stuttering)
+ stuttering = max(stuttering-1, 0)
+
+ if(slurring)
+ slurring = max(slurring-1,0)
+
+ if(silent)
+ silent = max(silent-1, 0)
+
+ if(druggy)
+ druggy = max(druggy-1, 0)
+
+ if(stunned)
+ AdjustStunned(-1)
+ if(!stunned)
+ update_icons()
+
+ if(weakened)
+ weakened = max(weakened-1,0)
+ if(!weakened)
+ update_icons()
+
+ if(hallucination)
+ spawn handle_hallucinations()
+
+ if(hallucination<=2)
+ hallucination = 0
+ else
+ hallucination -= 2
- if(druggy)
- druggy = max(druggy-1, 0)
-
- if(hallucination)
- spawn handle_hallucinations()
-
- if(hallucination<=2)
- hallucination = 0
else
- hallucination -= 2
+ for(var/atom/a in hallucinations)
+ qdel(a)
+
+ CheckStamina()
+ return 1
+/mob/living/carbon/proc/handle_disabilities()
+ //Eyes
+ if(!(disabilities & BLIND) && !stat) //blindness from disability or unconsciousness doesn't get better on its own
+ if(eye_blind) //blindness, heals slowly over time
+ eye_blind = max(eye_blind-1,0)
+ else if(eye_blurry) //blurry eyes heal slowly
+ eye_blurry = max(eye_blurry-1, 0)
+
+ //Ears
+ if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own
+ setEarDamage(-1, max(ear_deaf, 1))
else
- for(var/atom/a in hallucinations)
- qdel(a)
+ // deafness heals slowly over time, unless ear_damage is over 100
+ if(ear_damage < 100)
+ adjustEarDamage(-0.05,-1)
+
-//this handles hud updates. Calls update_vision() and handle_hud_icons()
-/mob/living/carbon/handle_regular_hud_updates()
+//this handles hud updates. Calles update_vision() and handle_hud_icons()
+/mob/living/carbon/proc/handle_regular_hud_updates()
if(!client) return 0
+ update_action_buttons()
+
if(damageoverlay)
if(damageoverlay.overlays)
damageoverlay.overlays = list()
@@ -451,11 +535,15 @@
damageoverlay.overlays += I
damageoverlay.overlays += black
- ..()
+
+ handle_vision()
+ handle_hud_icons()
return 1
-/mob/living/carbon/update_sight()
+/mob/living/carbon/proc/handle_vision()
+
+ client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask)
if(stat == DEAD)
sight |= SEE_TURFS
@@ -470,20 +558,44 @@
sight &= ~SEE_MOBS
if(!(SEE_OBJS & permanent_sight_flags))
sight &= ~SEE_OBJS
- if(remote_view)
- sight |= SEE_TURFS
- sight |= SEE_MOBS
- sight |= SEE_OBJS
+
see_in_dark = (sight == SEE_TURFS|SEE_MOBS|SEE_OBJS) ? 8 : 2 //Xray flag combo
see_invisible = SEE_INVISIBLE_LIVING
if(see_override)
see_invisible = see_override
+ if(blind)
+ if(eye_blind)
+ blind.layer = 18
+ else
+ blind.layer = 0
+
+ if (disabilities & NEARSIGHT)
+ client.screen += global_hud.vimpaired
+
+ if (eye_blurry)
+ client.screen += global_hud.blurry
+
+ if (druggy)
+ client.screen += global_hud.druggy
+
+ if(eye_stat > 20)
+ if(eye_stat > 30)
+ client.screen += global_hud.darkMask
+ else
+ client.screen += global_hud.vimpaired
+
+ if(machine)
+ if (!( machine.check_eye(src) ))
+ reset_view(null)
+ else
+ if(!client.adminobs)
+ reset_view(null)
-/mob/living/carbon/handle_hud_icons()
+/mob/living/carbon/proc/handle_hud_icons()
return
-/mob/living/carbon/handle_hud_icons_health()
+/mob/living/carbon/proc/handle_hud_icons_health()
if(healths)
if (stat != DEAD)
switch(health)
@@ -502,4 +614,4 @@
else
healths.icon_state = "health6"
else
- healths.icon_state = "health7"
+ healths.icon_state = "health7"
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/monkey/examine.dm b/code/modules/mob/living/carbon/monkey/examine.dm
index 48963b00eed46..a3686d7a47840 100644
--- a/code/modules/mob/living/carbon/monkey/examine.dm
+++ b/code/modules/mob/living/carbon/monkey/examine.dm
@@ -3,10 +3,8 @@
if (src.handcuffed)
msg += "It is \icon[src.handcuffed] handcuffed!\n"
- if (src.head)
- msg += "It has \icon[src.head] \a [src.head] on its head. \n"
if (src.wear_mask)
- msg += "It has \icon[src.wear_mask] \a [src.wear_mask] on its face.\n"
+ msg += "It has \icon[src.wear_mask] \a [src.wear_mask] on its head.\n"
if (src.l_hand)
msg += "It has \icon[src.l_hand] \a [src.l_hand] in its left hand.\n"
if (src.r_hand)
diff --git a/code/modules/mob/living/carbon/monkey/inventory.dm b/code/modules/mob/living/carbon/monkey/inventory.dm
index c0ae3e21920c4..95ff775c0a46f 100644
--- a/code/modules/mob/living/carbon/monkey/inventory.dm
+++ b/code/modules/mob/living/carbon/monkey/inventory.dm
@@ -14,12 +14,6 @@
if( !(I.slot_flags & SLOT_MASK) )
return 0
return 1
- if(slot_head)
- if(head)
- return 0
- if( !(I.slot_flags & SLOT_HEAD) )
- return 0
- return 1
if(slot_back)
if(back)
return 0
@@ -49,10 +43,6 @@
wear_mask = I
I.equipped(src, slot)
update_inv_wear_mask(redraw_mob)
- if(slot_head)
- head = I
- I.equipped(src, slot)
- update_inv_head(redraw_mob)
if(slot_handcuffed)
handcuffed = I
update_inv_handcuffed(redraw_mob)
@@ -80,6 +70,3 @@
I.loc = src
I.equipped(src, slot)
I.layer = 20
-
-
-
diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm
index 77a3961653e66..12cac68350c88 100644
--- a/code/modules/mob/living/carbon/monkey/life.dm
+++ b/code/modules/mob/living/carbon/monkey/life.dm
@@ -107,7 +107,7 @@
/mob/living/carbon/monkey/handle_changeling()
- if(mind && hud_used)
+ if(mind)
if(mind.changeling)
mind.changeling.regenerate()
hud_used.lingchemdisplay.invisibility = 0
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index 41e2982d9b46e..0a69677e00191 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -1,7 +1,7 @@
/mob/living/carbon/monkey
name = "monkey"
voice_name = "monkey"
- verb_say = "chimpers"
+ say_message = "chimpers"
icon = 'icons/mob/monkey.dmi'
icon_state = "monkey1"
gender = NEUTER
@@ -137,6 +137,7 @@
if (M.a_intent == "disarm")
playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1)
+ var/damage = 5
if(prob(95))
Weaken(10)
visible_message("[M] has tackled down [name]!", \
@@ -146,6 +147,7 @@
visible_message("[M] has disarmed [name]!", \
"[M] has disarmed [name]!")
add_logs(M, src, "disarmed", admin=0)
+ adjustBruteLoss(damage)
updatehealth()
return
@@ -156,13 +158,18 @@
updatehealth()
-/mob/living/carbon/monkey/attack_slime(mob/living/simple_animal/slime/M as mob)
- if(..()) //successful slime attack
- var/damage = rand(5, 35)
- if(M.is_adult)
- damage = rand(20, 40)
- adjustBruteLoss(damage)
- updatehealth()
+/mob/living/carbon/monkey/attack_slime(mob/living/carbon/slime/M as mob)
+ ..()
+ var/damage = rand(1, 3)
+
+ if(M.is_adult)
+ damage = rand(20, 40)
+ else
+ damage = rand(5, 35)
+ adjustBruteLoss(damage)
+ updatehealth()
+
+ return
/mob/living/carbon/monkey/Stat()
..()
@@ -241,6 +248,10 @@
return threatcount
+/mob/living/carbon/monkey/SpeciesCanConsume()
+ return 1 // Monkeys can eat, drink, and be forced to do so
+
+
/mob/living/carbon/monkey/acid_act(var/acidpwr, var/toxpwr, var/acid_volume)
if(wear_mask)
if(!wear_mask.unacidable)
@@ -250,11 +261,4 @@
src << "Your mask protects you from the acid."
return
- take_organ_damage(min(6*toxpwr, acid_volume * toxpwr))
-
-/mob/living/carbon/monkey/help_shake_act(mob/living/carbon/M)
- if(health < 0 && ishuman(M))
- var/mob/living/carbon/human/H = M
- H.do_cpr(src)
- else
- ..()
+ take_organ_damage(min(6*toxpwr, acid_volume * toxpwr))
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/monkey/say.dm b/code/modules/mob/living/carbon/monkey/say.dm
new file mode 100644
index 0000000000000..8993ba087e06b
--- /dev/null
+++ b/code/modules/mob/living/carbon/monkey/say.dm
@@ -0,0 +1,2 @@
+/mob/living/carbon/monkey/say_quote(var/text)
+ return "[say_message], \"[text]\"";
diff --git a/code/modules/mob/living/carbon/monkey/update_icons.dm b/code/modules/mob/living/carbon/monkey/update_icons.dm
index 5be5fbc43b8d8..bcdbbb6b633c5 100644
--- a/code/modules/mob/living/carbon/monkey/update_icons.dm
+++ b/code/modules/mob/living/carbon/monkey/update_icons.dm
@@ -1,12 +1,11 @@
//Monkey Overlays Indexes////////
-#define M_FIRE_LAYER 7
-#define M_MASK_LAYER 6
-#define M_HEAD_LAYER 5
+#define M_FIRE_LAYER 6
+#define M_MASK_LAYER 5
#define M_BACK_LAYER 4
#define M_HANDCUFF_LAYER 3
#define M_L_HAND_LAYER 2
#define M_R_HAND_LAYER 1
-#define M_TOTAL_LAYERS 7
+#define M_TOTAL_LAYERS 6
/////////////////////////////////
/mob/living/carbon/monkey
@@ -15,7 +14,6 @@
/mob/living/carbon/monkey/regenerate_icons()
..()
update_inv_wear_mask(0)
- update_inv_head(0)
update_inv_back(0)
update_inv_r_hand(0)
update_inv_l_hand(0)
@@ -41,7 +39,7 @@
if(client && hud_used)
client.screen += wear_mask
overlays -= overlays_standing[M_MASK_LAYER]
- var/image/standing = image("icon" = 'icons/mob/mask.dmi', "icon_state" = "[wear_mask.icon_state]", "layer" = -M_MASK_LAYER)
+ var/image/standing = image("icon" = 'icons/mob/monkey.dmi', "icon_state" = "[wear_mask.icon_state]", "layer" = -M_MASK_LAYER)
if(!istype(wear_mask, /obj/item/clothing/mask/cigarette) && wear_mask.blood_DNA )
standing.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "maskblood")
overlays_standing[M_MASK_LAYER] = standing
@@ -52,21 +50,6 @@
if(update_icons) update_icons()
-/mob/living/carbon/monkey/update_inv_head(var/update_icons=1)
- if(head)
- head.screen_loc = ui_monkey_head
- if(client && hud_used)
- client.screen += head
- overlays -= overlays_standing[M_HEAD_LAYER]
- var/image/standing = image("icon" = 'icons/mob/head.dmi', "icon_state" = "[head.icon_state]", "layer" = -M_HEAD_LAYER)
- overlays_standing[M_HEAD_LAYER] = standing
- overlays += overlays_standing[M_HEAD_LAYER]
- else
- overlays -= overlays_standing[M_HEAD_LAYER]
- overlays_standing[M_HEAD_LAYER] = null
- if(update_icons) update_icons()
-
-
/mob/living/carbon/monkey/update_inv_r_hand(var/update_icons=1)
if (handcuffed)
drop_r_hand()
@@ -78,9 +61,7 @@
var/t_state = r_hand.item_state
if(!t_state) t_state = r_hand.icon_state
overlays -= overlays_standing[M_R_HAND_LAYER]
- var/image/standing = image("icon" = r_hand.righthand_file, "icon_state" = t_state, "layer" = -M_R_HAND_LAYER)
- standing.pixel_y = 2
- overlays_standing[M_R_HAND_LAYER] = standing
+ overlays_standing[M_R_HAND_LAYER] = image("icon" = r_hand.righthand_file, "icon_state" = t_state, "layer" = -M_R_HAND_LAYER)
overlays += overlays_standing[M_R_HAND_LAYER]
else
overlays -= overlays_standing[M_R_HAND_LAYER]
@@ -99,9 +80,7 @@
var/t_state = l_hand.item_state
if(!t_state) t_state = l_hand.icon_state
overlays -= overlays_standing[M_L_HAND_LAYER]
- var/image/standing = image("icon" = l_hand.lefthand_file, "icon_state" = t_state, "layer" = -M_L_HAND_LAYER)
- standing.pixel_y = 2
- overlays_standing[M_L_HAND_LAYER] = standing
+ overlays_standing[M_L_HAND_LAYER] = image("icon" = l_hand.lefthand_file, "icon_state" = t_state, "layer" = -M_L_HAND_LAYER)
overlays += overlays_standing[M_L_HAND_LAYER]
else
overlays -= overlays_standing[M_L_HAND_LAYER]
diff --git a/code/modules/mob/living/simple_animal/slime/death.dm b/code/modules/mob/living/carbon/slime/death.dm
similarity index 57%
rename from code/modules/mob/living/simple_animal/slime/death.dm
rename to code/modules/mob/living/carbon/slime/death.dm
index 81493941d340a..ecf01af344bad 100644
--- a/code/modules/mob/living/simple_animal/slime/death.dm
+++ b/code/modules/mob/living/carbon/slime/death.dm
@@ -1,12 +1,11 @@
-/mob/living/simple_animal/slime/death(gibbed)
+/mob/living/carbon/slime/death(gibbed)
if(stat == DEAD)
return
if(!gibbed)
if(is_adult)
- var/mob/living/simple_animal/slime/M = new /mob/living/simple_animal/slime(loc)
+ var/mob/living/carbon/slime/M = new /mob/living/carbon/slime(loc)
M.colour = colour
M.rabid = 1
- M.regenerate_icons()
is_adult = 0
maxHealth = 150
revive()
@@ -14,19 +13,21 @@
number = rand(1, 1000)
name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])"
return
+ else
+ visible_message("The [name] seizes up and falls limp...")
stat = DEAD
+ icon_state = "[colour] baby slime dead"
overlays.len = 0
update_canmove()
- if(blind)
- blind.layer = 0
+ if(blind) blind.layer = 0
if(ticker && ticker.mode)
ticker.mode.check_win()
return ..(gibbed)
-/mob/living/simple_animal/slime/gib()
+/mob/living/carbon/slime/gib()
death(1)
- qdel(src)
+ qdel(src)
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/slime/emote.dm b/code/modules/mob/living/carbon/slime/emote.dm
similarity index 95%
rename from code/modules/mob/living/simple_animal/slime/emote.dm
rename to code/modules/mob/living/carbon/slime/emote.dm
index 7f8127d3bcf3d..d8d7059533326 100644
--- a/code/modules/mob/living/simple_animal/slime/emote.dm
+++ b/code/modules/mob/living/carbon/slime/emote.dm
@@ -1,4 +1,4 @@
-/mob/living/simple_animal/slime/emote(var/act)
+/mob/living/carbon/slime/emote(var/act)
if (findtext(act, "-", 1, null))
@@ -76,7 +76,7 @@
else
src << "Unusable emote '[act]'. Say *help for a list."
- if ((message && stat == CONSCIOUS))
+ if ((message && src.stat == 0))
if(client)
log_emote("[name]/[key] : [message]")
if (m_type & 1)
diff --git a/code/modules/mob/living/carbon/slime/examine.dm b/code/modules/mob/living/carbon/slime/examine.dm
new file mode 100644
index 0000000000000..fbc9d0c52c660
--- /dev/null
+++ b/code/modules/mob/living/carbon/slime/examine.dm
@@ -0,0 +1,31 @@
+/mob/living/carbon/slime/examine(mob/user)
+
+ var/msg = "*---------*\nThis is \icon[src] \a [src]!\n"
+ if (src.stat == DEAD)
+ msg += "It is limp and unresponsive.\n"
+ else
+ if (src.getBruteLoss())
+ msg += ""
+ if (src.getBruteLoss() < 40)
+ msg += "It has some punctures in its flesh!"
+ else
+ msg += "It has severe punctures and tears in its flesh!"
+ msg += "\n"
+
+ switch(powerlevel)
+
+ if(2 to 3)
+ msg += "It is flickering gently with a little electrical activity.\n"
+
+ if(4 to 5)
+ msg += "It is glowing gently with moderate levels of electrical activity.\n"
+
+ if(6 to 9)
+ msg += "It is glowing brightly with high levels of electrical activity.\n"
+
+ if(10)
+ msg += "It is radiating with massive levels of electrical activity!\n"
+
+ msg += "*---------*"
+ user << msg
+ return
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/carbon/slime/life.dm
similarity index 78%
rename from code/modules/mob/living/simple_animal/slime/life.dm
rename to code/modules/mob/living/carbon/slime/life.dm
index 904803ff26c90..484f2700ae86c 100644
--- a/code/modules/mob/living/simple_animal/slime/life.dm
+++ b/code/modules/mob/living/carbon/slime/life.dm
@@ -1,13 +1,11 @@
-
-/mob/living/simple_animal/slime
+/mob/living/carbon/slime
var/AIproc = 0 // determines if the AI loop is activated
var/Atkcool = 0 // attack cooldown
var/Tempstun = 0 // temporary temperature stuns
var/Discipline = 0 // if a slime has been hit with a freeze gun, or wrestled/attacked off a human, they become disciplined and don't attack anymore for a while
var/SStun = 0 // stun variable
-
-/mob/living/simple_animal/slime/Life()
+/mob/living/carbon/slime/Life()
set invisibility = 0
set background = BACKGROUND_ENABLED
@@ -17,10 +15,12 @@
handle_nutrition()
handle_targets()
if (!ckey)
- handle_mood()
- handle_speech()
+ handle_speech_and_mood()
-/mob/living/simple_animal/slime/proc/AIprocess() // the master AI process
+/mob/living/carbon/slime/handle_breathing()
+ return
+
+/mob/living/carbon/slime/proc/AIprocess() // the master AI process
if(AIproc || stat == DEAD || client) return
@@ -45,7 +45,7 @@
break
if(Target)
- for(var/mob/living/simple_animal/slime/M in view(1,Target))
+ for(var/mob/living/carbon/slime/M in view(1,Target))
if(M.Victim == Target)
Target = null
AIproc = 0
@@ -99,8 +99,9 @@
AIproc = 0
-/mob/living/simple_animal/slime/handle_environment(datum/gas_mixture/environment)
+/mob/living/carbon/slime/handle_environment(datum/gas_mixture/environment)
if(!environment)
+ adjustToxLoss(rand(10,20))
return
//var/environment_heat_capacity = environment.heat_capacity()
@@ -119,9 +120,9 @@
if(bodytemperature <= (T0C - 50)) // hurt temperature
if(bodytemperature <= 50) // sqrting negative numbers is bad
- adjustBruteLoss(200)
+ adjustToxLoss(200)
else
- adjustBruteLoss(round(sqrt(bodytemperature)) * 2)
+ adjustToxLoss(round(sqrt(bodytemperature)) * 2)
else
Tempstun = 0
@@ -130,7 +131,7 @@
return //TODO: DEFERRED
-/mob/living/simple_animal/slime/proc/adjust_body_temperature(current, loc_temp, boost)
+/mob/living/carbon/slime/proc/adjust_body_temperature(current, loc_temp, boost)
var/temperature = current
var/difference = abs(current-loc_temp) //get difference
var/increments// = difference/10 //find how many increments apart they are
@@ -147,10 +148,9 @@
temp_change = (temperature - current)
return temp_change
-/mob/living/simple_animal/slime/handle_chemicals_in_body()
+/mob/living/carbon/slime/handle_chemicals_in_body()
- if(reagents)
- reagents.metabolize(src)
+ if(reagents) reagents.metabolize(src)
if (reagents.get_reagent_amount("plasma")>=5)
mutation_chance = min(mutation_chance + 5,50) //Prevents mutation chance going >50%
@@ -158,15 +158,81 @@
if (reagents.get_reagent_amount("epinephrine")>=5)
mutation_chance = max(mutation_chance - 5,0) //Prevents muation chance going <0%
reagents.remove_reagent("epinephrine", 5)
- updatehealth()
+ src.updatehealth()
-/mob/living/simple_animal/slime/handle_regular_status_updates()
+ return //TODO: DEFERRED
- if(..())
- if(prob(30))
- adjustBruteLoss(-1)
-/mob/living/simple_animal/slime/proc/handle_nutrition()
+/mob/living/carbon/slime/handle_mutations_and_radiation()
+ return
+
+/mob/living/carbon/slime/handle_regular_hud_updates()
+ return
+
+/mob/living/carbon/slime/handle_regular_status_updates()
+
+ if(is_adult)
+ health = 200 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss())
+ else
+ health = 150 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss())
+
+ if(health < config.health_threshold_dead && stat != DEAD)
+ death()
+ return
+
+ else if(health < config.health_threshold_crit)
+
+ if(!reagents.has_reagent("epinephrine"))
+ adjustOxyLoss(3)
+
+ if(stat != DEAD)
+ Paralyse(3)
+ stat = UNCONSCIOUS
+ else
+ if(stat != DEAD)
+ stat = CONSCIOUS
+
+ if(prob(30))
+ adjustOxyLoss(-1)
+ adjustToxLoss(-1)
+ adjustFireLoss(-1)
+ adjustCloneLoss(-1)
+ adjustBruteLoss(-1)
+
+ if (stat == DEAD)
+ lying = 1
+ eye_blind = max(eye_blind, 1)
+ else
+ if(stunned > 0)
+ AdjustStunned(-1)
+ if(weakened > 0)
+ AdjustWeakened(-1)
+ if (paralysis > 0)
+ AdjustParalysis(-1)
+
+ if(stuttering)
+ stuttering = 0
+
+ if(eye_blind)
+ eye_blind = 0
+ eye_blind = max(eye_blind, 1)
+
+ setEarDamage((ear_damage < 25 ? 0 : ear_damage),(disabilities & DEAF ? 1 :0))
+
+ density = !( src.lying )
+
+ if(disabilities & BLIND)
+ eye_blind = max(eye_blind, 1)
+
+ if(eye_blurry > 0)
+ eye_blurry = 0
+
+ if(druggy > 0)
+ druggy = 0
+
+ return 1
+
+/mob/living/carbon/slime/proc/handle_nutrition()
if(docile) //God as my witness, I will never go hungry again
nutrition = 700
@@ -178,7 +244,7 @@
if(nutrition <= 0)
nutrition = 0
if(prob(75))
- adjustBruteLoss(rand(0,5))
+ adjustToxLoss(rand(0,5))
else if (nutrition >= get_grow_nutrition() && amount_grown < 10)
nutrition -= 20
@@ -190,7 +256,7 @@
else
Evolve()
-/mob/living/simple_animal/slime/proc/add_nutrition(var/nutrition_to_add = 0, var/lastnut = 0)
+/mob/living/carbon/slime/proc/add_nutrition(var/nutrition_to_add = 0, var/lastnut = 0)
nutrition = min((nutrition + nutrition_to_add), get_max_nutrition())
if(nutrition >= (lastnut + 50))
if(prob(80))
@@ -198,11 +264,11 @@
powerlevel++
if(powerlevel > 10)
powerlevel = 10
- adjustBruteLoss(-10)
+ adjustToxLoss(-10)
-/mob/living/simple_animal/slime/proc/handle_targets()
+/mob/living/carbon/slime/proc/handle_targets()
if(Tempstun)
if(!Victim) // not while they're eating!
canmove = 0
@@ -270,7 +336,7 @@
if(!L.canmove) // Only one slime can latch on at a time.
var/notarget = 0
- for(var/mob/living/simple_animal/slime/M in view(1,L))
+ for(var/mob/living/carbon/slime/M in view(1,L))
if(M.Victim == L)
notarget = 1
if(notarget)
@@ -299,7 +365,7 @@
if(!Target) // If we have no target, we are wandering or following orders
if (Leader)
- if(holding_still)
+ if (holding_still)
holding_still = max(holding_still - 1, 0)
else if(canmove && isturf(loc))
step_to(src, Leader)
@@ -311,30 +377,20 @@
step(src, pick(cardinal))
else
- if(holding_still)
+ if (holding_still)
holding_still = max(holding_still - 1, 0)
- else if (docile && pulledby)
- holding_still = 10
else if(canmove && isturf(loc) && prob(33))
step(src, pick(cardinal))
else if(!AIproc)
spawn()
AIprocess()
-/mob/living/simple_animal/slime/handle_automated_movement()
- return //slime random movement is currently handled in handle_targets()
-
-/mob/living/simple_animal/slime/handle_automated_speech()
- return //slime random speech is currently handled in handle_speech()
-
-/mob/living/simple_animal/slime/proc/handle_mood()
+/mob/living/carbon/slime/proc/handle_speech_and_mood()
+ //Mood starts here
var/newmood = ""
- if (rabid || attacked)
- newmood = "angry"
- else if (docile)
- newmood = ":3"
- else if (Target)
- newmood = "mischevous"
+ if (rabid || attacked) newmood = "angry"
+ else if (docile) newmood = ":3"
+ else if (Target) newmood = "mischevous"
if (!newmood)
if (Discipline && prob(25))
@@ -343,14 +399,12 @@
newmood = pick("sad", ":3", "pout")
if ((mood == "sad" || mood == ":3" || mood == "pout") && !newmood)
- if(prob(75))
- newmood = mood
+ if (prob(75)) newmood = mood
if (newmood != mood) // This is so we don't redraw them every time
mood = newmood
regenerate_icons()
-/mob/living/simple_animal/slime/proc/handle_speech()
//Speech understanding starts here
var/to_say
if (speech_buffer.len > 0)
@@ -427,17 +481,17 @@
emote(pick("bounce","sway","light","vibrate","jiggle"))
else
var/t = 10
- var/slimes_near = 0
+ var/slimes_near = -1 // Don't count myself
var/dead_slimes = 0
var/friends_near = list()
- for (var/mob/living/L in view(7,src))
- if(isslime(L) && L != src)
+ for (var/mob/living/carbon/M in view(7,src))
+ if (isslime(M))
++slimes_near
- if (L.stat == DEAD)
+ if (M.stat == DEAD)
++dead_slimes
- if (L in Friends)
+ if (M in Friends)
t += 20
- friends_near += L
+ friends_near += M
if (nutrition < get_hunger_nutrition()) t += 10
if (nutrition < get_starve_nutrition()) t += 10
if (prob(2) && prob(t))
@@ -463,12 +517,12 @@
phrases += "Purr..."
if (attacked)
phrases += "Grrr..."
- if (bodytemperature < T0C)
+ if (getToxLoss() > 30)
phrases += "Cold..."
- if (bodytemperature < T0C - 30)
+ if (getToxLoss() > 60)
phrases += "So... cold..."
phrases += "Very... cold..."
- if (bodytemperature < T0C - 50)
+ if (getToxLoss() > 90)
phrases += "..."
phrases += "C... c..."
if (Victim)
@@ -489,23 +543,23 @@
phrases += "[M]... feed me..."
say (pick(phrases))
-/mob/living/simple_animal/slime/proc/get_max_nutrition() // Can't go above it
+/mob/living/carbon/slime/proc/get_max_nutrition() // Can't go above it
if (is_adult) return 1200
else return 1000
-/mob/living/simple_animal/slime/proc/get_grow_nutrition() // Above it we grow, below it we can eat
+/mob/living/carbon/slime/proc/get_grow_nutrition() // Above it we grow, below it we can eat
if (is_adult) return 1000
else return 800
-/mob/living/simple_animal/slime/proc/get_hunger_nutrition() // Below it we will always eat
+/mob/living/carbon/slime/proc/get_hunger_nutrition() // Below it we will always eat
if (is_adult) return 600
else return 500
-/mob/living/simple_animal/slime/proc/get_starve_nutrition() // Below it we will eat before everything else
- if(is_adult) return 300
+/mob/living/carbon/slime/proc/get_starve_nutrition() // Below it we will eat before everything else
+ if (is_adult) return 300
else return 200
-/mob/living/simple_animal/slime/proc/will_hunt(var/hunger = -1) // Check for being stopped from feeding and chasing
+/mob/living/carbon/slime/proc/will_hunt(var/hunger = -1) // Check for being stopped from feeding and chasing
if (docile) return 0
if (hunger == 2 || rabid || attacked) return 1
if (Leader) return 0
diff --git a/code/modules/mob/living/carbon/slime/login.dm b/code/modules/mob/living/carbon/slime/login.dm
new file mode 100644
index 0000000000000..d3ac320f2f4f5
--- /dev/null
+++ b/code/modules/mob/living/carbon/slime/login.dm
@@ -0,0 +1,4 @@
+/mob/living/carbon/slime/Login()
+ ..()
+ update_hud()
+ return
diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/carbon/slime/powers.dm
similarity index 57%
rename from code/modules/mob/living/simple_animal/slime/powers.dm
rename to code/modules/mob/living/carbon/slime/powers.dm
index e8b647e5e8da4..01918ec5fc50e 100644
--- a/code/modules/mob/living/simple_animal/slime/powers.dm
+++ b/code/modules/mob/living/carbon/slime/powers.dm
@@ -1,70 +1,76 @@
-/mob/living/simple_animal/slime/verb/Feed()
+/mob/living/carbon/slime/verb/Feed()
set category = "Slime"
set desc = "This will let you feed on any valid creature in the surrounding area. This should also be used to halt the feeding process."
+ if(Victim)
+ Feedstop()
+ return 0
+
+ if(docile)
+ src << "I'm not hungry anymore..."
+ return 0
if(stat)
+ src << "I must be conscious to do this..."
return 0
var/list/choices = list()
for(var/mob/living/C in view(1,src))
- if(C!=src && Adjacent(C))
+ if(C!=src && !istype(C,/mob/living/carbon/slime) && Adjacent(C))
choices += C
var/mob/living/M = input(src,"Who do you wish to feed on?") in null|choices
if(!M) return 0
- if(CanFeedon(M))
- Feedon(M)
- return 1
-
-/mob/living/simple_animal/slime/proc/CanFeedon(var/mob/living/M)
- if(!Adjacent(M))
- return 0
-
- if(Victim)
- Feedstop()
- return 0
+ if(Adjacent(M))
- if(isslime(M))
- src << "I can't latch onto another slime..."
- return 0
+ if(istype(M, /mob/living/carbon/brain))
+ src << "This subject does not have an edible life energy..."
+ return 0
- if(docile)
- src << "I'm not hungry anymore..."
- return 0
+ if(istype(M, /mob/living/carbon) && (M.health < -70))
+ src << "This subject does not have a strong enough life energy..."
+ return 0
- if(stat)
- src << "I must be conscious to do this..."
- return 0
+ if(istype(M, /mob/living/simple_animal) && (M.health < 1))//animals don't go into crit, stupid; fixes infinite energy exploit
+ src << "This subject does not have a strong enough life energy..."
+ return 0
- if(M.stat == DEAD)
- src << "This subject does not have a strong enough life energy..."
- return 0
+ for(var/mob/living/carbon/slime/met in view())
+ if(met.Victim == M && met != src)
+ src << "The [met.name] is already feeding on this subject..."
+ return 0
- for(var/mob/living/simple_animal/slime/met in view())
- if(met.Victim == M && met != src)
- src << "The [met.name] is already feeding on this subject..."
- return 0
- return 1
+ src << "I have latched onto the subject and begun feeding..."
+ M << "The [src.name] has latched onto your head!"
-/mob/living/simple_animal/slime/proc/Feedon(var/mob/living/M)
+ Feedon(M)
+ return 1
- src << "I have latched onto the subject and begun feeding..."
- M << "The [name] has latched onto [M.name]!"
+/mob/living/carbon/slime/proc/Feedon(var/mob/living/M)
Victim = M
src.loc = M.loc
canmove = 0
anchored = 1
var/lastnut = nutrition
var/fed_succesfully = 0
+ var/health_minimum = -70
+
+ if(is_adult)
+ icon_state = "[colour] adult slime eat"
+ else
+ icon_state = "[colour] baby slime eat"
- while(Victim && Victim == M && Victim.stat != DEAD && stat != DEAD)
+
+ if(istype(Victim, /mob/living/simple_animal))
+ health_minimum = 0
+
+ while(Victim && Victim.health > health_minimum && stat != 2)
canmove = 0
if(Adjacent(Victim))
loc = M.loc
- if(iscarbon(Victim))
+ if(istype(Victim, /mob/living/carbon))
Victim.adjustCloneLoss(rand(5,6))
Victim.adjustToxLoss(rand(1,2))
if(Victim.health <= 0)
@@ -81,12 +87,12 @@
fed_succesfully = 1
- else if(isanimal(Victim)) //we already know it's a simple_animal from above
+ else if(health_minimum == 0) //we already know it's a simple_animal from above
Victim.adjustBruteLoss(is_adult ? rand(7, 15) : rand(4, 12))
fed_succesfully = 1
else
- src << "[pick("This subject is incompatible", \
+ src << "[pick("This subject is incompatable", \
"This subject does not have a life energy", "This subject is empty", \
"I am not satisified", "I can not feed from this subject", \
"I do not feel nourished", "This subject is not food")]..."
@@ -95,7 +101,10 @@
add_nutrition(rand(15,30), lastnut)
//Heal yourself.
+ adjustOxyLoss(-10)
adjustBruteLoss(-10)
+ adjustFireLoss(-10)
+ adjustCloneLoss(-10)
updatehealth()
if(Victim)
@@ -106,45 +115,62 @@
else
break
- canmove = 1
- anchored = 0
+ if(stat == 2) //why the fuck are you doing icon updating here
+ if(!is_adult)
+ icon_state = "[colour] baby slime dead"
+ else
+ if(is_adult)
+ icon_state = "[colour] adult slime"
+ else
+ icon_state = "[colour] baby slime"
- if(M && M.stat == DEAD)
- if(!client)
- if(Victim && !rabid && !attacked)
- if(Victim.LAssailant && Victim.LAssailant != Victim)
- if(prob(50))
- if(!(Victim.LAssailant in Friends))
- Friends[Victim.LAssailant] = 1
- else
- ++Friends[Victim.LAssailant]
+ canmove = 1
+ anchored = 0
- if(M.client && ishuman(M))
- if(prob(85))
- rabid = 1 // UUUNNBGHHHH GONNA EAT JUUUUUU
+ if(M)
+ if(M.health < health_minimum)
+ M.canmove = 0
+ if(!client)
+ if(Victim && !rabid && !attacked)
+ if(Victim.LAssailant && Victim.LAssailant != Victim)
+ if(prob(50))
+ if(!(Victim.LAssailant in Friends))
+ Friends[Victim.LAssailant] = 1
+ //Friends.Add(Victim.LAssailant) // no idea why i was using the |= operator
+ else
+ ++Friends[Victim.LAssailant]
+
+
+ if(M.client && istype(src, /mob/living/carbon/human))
+ if(prob(85))
+ rabid = 1 // UUUNNBGHHHH GONNA EAT JUUUUUU
+
+ if(client)
+ src << "This subject does not have a strong enough life energy anymore..."
+ else
+ M.canmove = 1
+ if(client)
+ src << "I have stopped feeding..."
+ else
if(client)
- src << "This subject does not have a strong enough life energy anymore..."
-
- else if(client)
- src << "I have stopped feeding..."
+ src << "I have stopped feeding..."
Victim = null
-/mob/living/simple_animal/slime/proc/Feedstop()
+/mob/living/carbon/slime/proc/Feedstop()
if(Victim)
- if(Victim.client)
- Victim << "[src] has let go of your head!"
+ if(Victim.client) Victim << "[src] has let go of your head!"
Victim = null
-/mob/living/simple_animal/slime/proc/UpdateFeed(var/mob/M)
+/mob/living/carbon/slime/proc/UpdateFeed(var/mob/M)
if(Victim)
if(Victim == M)
loc = M.loc // simple "attach to head" effect!
-/mob/living/simple_animal/slime/verb/Evolve()
+/mob/living/carbon/slime/verb/Evolve()
set category = "Slime"
set desc = "This will let you evolve from baby to adult slime."
@@ -163,7 +189,7 @@
else
src << "I have already evolved..."
-/mob/living/simple_animal/slime/verb/Reproduce()
+/mob/living/carbon/slime/verb/Reproduce()
set category = "Slime"
set desc = "This will make you split into four Slimes."
@@ -181,7 +207,7 @@
var/new_nutrition = round(nutrition * 0.9)
var/new_powerlevel = round(powerlevel / 4)
for(var/i=1,i<=4,i++)
- var/mob/living/simple_animal/slime/M = new /mob/living/simple_animal/slime/(loc)
+ var/mob/living/carbon/slime/M = new /mob/living/carbon/slime/(loc)
if(prob(mutation_chance))
M.colour = slime_mutation[rand(1,4)]
else
@@ -193,7 +219,7 @@
babies += M
feedback_add_details("slime_babies_born","slimebirth_[replacetext(M.colour," ","_")]")
- var/mob/living/simple_animal/slime/new_slime = pick(babies)
+ var/mob/living/carbon/slime/new_slime = pick(babies)
new_slime.a_intent = "harm"
new_slime.languages = languages
if(src.mind)
diff --git a/code/modules/mob/living/carbon/slime/say.dm b/code/modules/mob/living/carbon/slime/say.dm
new file mode 100644
index 0000000000000..b704902065396
--- /dev/null
+++ b/code/modules/mob/living/carbon/slime/say.dm
@@ -0,0 +1,20 @@
+/mob/living/carbon/slime/say(var/message)
+ ..()
+
+/mob/living/carbon/slime/say_quote(var/text)
+ var/ending = copytext(text, length(text))
+
+ if (ending == "?")
+ return "telepathically asks, \"[text]\"";
+ else if (ending == "!")
+ return "telepathically cries, \"[text]\"";
+
+ return "telepathically chirps, \"[text]\"";
+
+/mob/living/carbon/slime/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq)
+ if(speaker != src && !radio_freq)
+ if (speaker in Friends)
+ speech_buffer = list()
+ speech_buffer += speaker
+ speech_buffer += lowertext(html_decode(message))
+ ..()
diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm
new file mode 100644
index 0000000000000..4d50dd3e1a8b5
--- /dev/null
+++ b/code/modules/mob/living/carbon/slime/slime.dm
@@ -0,0 +1,911 @@
+/mob/living/carbon/slime
+ name = "baby slime"
+ icon = 'icons/mob/slimes.dmi'
+ icon_state = "grey baby slime"
+ pass_flags = PASSTABLE
+ say_message = "hums"
+ ventcrawler = 2
+ var/is_adult = 0
+ var/docile = 0
+ languages = SLIME | HUMAN
+ faction = list("slime")
+
+ layer = 5
+
+ maxHealth = 150
+ health = 150
+ gender = NEUTER
+
+ nutrition = 700
+
+ see_in_dark = 8
+ update_slimes = 0
+
+ // canstun and canweaken don't affect slimes because they ignore stun and weakened variables
+ // for the sake of cleanliness, though, here they are.
+ status_flags = CANPARALYSE|CANPUSH
+
+ var/cores = 1 // the number of /obj/item/slime_extract's the slime has left inside
+ var/mutation_chance = 30 // Chance of mutating, should be between 25 and 35
+
+ var/powerlevel = 0 // 1-10 controls how much electricity they are generating
+ var/amount_grown = 0 // controls how long the slime has been overfed, if 10, grows or reproduces
+
+ var/number = 0 // Used to understand when someone is talking to it
+
+ var/mob/living/Victim = null // the person the slime is currently feeding on
+ var/mob/living/Target = null // AI variable - tells the slime to hunt this down
+ var/mob/living/Leader = null // AI variable - tells the slime to follow this person
+
+ var/attacked = 0 // Determines if it's been attacked recently. Can be any number, is a cooloff-ish variable
+ var/rabid = 0 // If set to 1, the slime will attack and eat anything it comes in contact with
+ var/holding_still = 0 // AI variable, cooloff-ish for how long it's going to stay in one place
+ var/target_patience = 0 // AI variable, cooloff-ish for how long it's going to follow its target
+
+ var/list/Friends = list() // A list of friends; they are not considered targets for feeding; passed down after splitting
+
+ var/list/speech_buffer = list() // Last phrase said near it and person who said it
+
+ var/mood = "" // To show its face
+
+ ///////////TIME FOR SUBSPECIES
+
+ var/colour = "grey"
+ var/coretype = /obj/item/slime_extract/grey
+ var/list/slime_mutation[4]
+
+/mob/living/carbon/slime/New()
+ create_reagents(100)
+ spawn (0)
+ number = rand(1, 1000)
+ name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])"
+ icon_state = "[colour] [is_adult ? "adult" : "baby"] slime"
+ real_name = name
+ slime_mutation = mutation_table(colour)
+ mutation_chance = rand(25, 35)
+ var/sanitizedcolour = replacetext(colour, " ", "")
+ coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]")
+ ..()
+
+/mob/living/carbon/slime/regenerate_icons()
+ icon_state = "[colour] [is_adult ? "adult" : "baby"] slime"
+ overlays.len = 0
+ if (mood)
+ overlays += image('icons/mob/slimes.dmi', icon_state = "aslime-[mood]")
+ ..()
+
+/mob/living/carbon/slime/movement_delay()
+ if (bodytemperature >= 330.23) // 135 F
+ return -1 // slimes become supercharged at high temperatures
+
+ var/tally = 0
+
+ var/health_deficiency = (100 - health)
+ if(health_deficiency >= 45) tally += (health_deficiency / 25)
+
+ if (bodytemperature < 183.222)
+ tally += (283.222 - bodytemperature) / 10 * 1.75
+
+ if(reagents)
+ if(reagents.has_reagent("morphine")) // morphine slows slimes down
+ tally *= 2
+
+ if(reagents.has_reagent("frostoil")) // Frostoil also makes them move VEEERRYYYYY slow
+ tally *= 5
+
+ if(health <= 0) // if damaged, the slime moves twice as slow
+ tally *= 2
+
+ return tally + config.slime_delay
+
+/mob/living/carbon/slime/ObjBump(obj/O)
+ if(!client && powerlevel > 0)
+ var/probab = 10
+ switch(powerlevel)
+ if(1 to 2) probab = 20
+ if(3 to 4) probab = 30
+ if(5 to 6) probab = 40
+ if(7 to 8) probab = 60
+ if(9) probab = 70
+ if(10) probab = 95
+ if(prob(probab))
+ if(istype(O, /obj/structure/window) || istype(O, /obj/structure/grille))
+ if(nutrition <= get_hunger_nutrition() && !Atkcool)
+ if (is_adult || prob(5))
+ O.attack_slime(src)
+ Atkcool = 1
+ spawn(45)
+ Atkcool = 0
+
+/mob/living/carbon/slime/MobBump(mob/M)
+ if(istype(M, /mob/living/carbon/human)) //pushing humans
+ if(is_adult && prob(10)) //only if we're adult, and 10% of the time
+ return 0
+ else
+ return 1
+
+/mob/living/carbon/slime/Process_Spacemove(var/movement_dir = 0)
+ return 2
+
+/mob/living/carbon/slime/Stat()
+ ..()
+
+ if(statpanel("Status"))
+ if(is_adult)
+ stat(null, "Health: [round((health / 200) * 100)]%")
+ else
+ stat(null, "Health: [round((health / 150) * 100)]%")
+ if(!docile)
+ stat(null, "Nutrition: [nutrition]/[get_max_nutrition()]")
+ if(amount_grown >= 10)
+ if(is_adult)
+ stat(null, "You can reproduce!")
+ else
+ stat(null, "You can evolve!")
+
+ stat(null,"Power Level: [powerlevel]")
+
+/mob/living/carbon/slime/adjustFireLoss(amount)
+ ..(-abs(amount)) // Heals them
+ return
+
+/mob/living/carbon/slime/bullet_act(var/obj/item/projectile/Proj)
+ attacked += 10
+ ..(Proj)
+ return 0
+
+/mob/living/carbon/slime/emp_act(severity)
+ powerlevel = 0 // oh no, the power!
+ ..()
+
+/mob/living/carbon/slime/ex_act(severity, target)
+ ..()
+
+ switch (severity)
+ if (1.0)
+ gib()
+ return
+
+ if (2.0)
+ adjustBruteLoss(60)
+ adjustFireLoss(60)
+
+ if(3.0)
+ adjustBruteLoss(30)
+
+ updatehealth()
+
+/mob/living/carbon/slime/MouseDrop(var/atom/movable/A as mob|obj)
+ if(isliving(A) && A != src && usr == src)
+ var/mob/living/Food = A
+ if(Food.Adjacent(src) && !stat && Food.stat != DEAD) //messy
+ Feedon(Food)
+ ..()
+
+/mob/living/carbon/slime/unEquip(obj/item/W as obj)
+ return
+
+/mob/living/carbon/slime/start_pulling(var/atom/movable/AM)
+ return
+
+/mob/living/carbon/slime/attack_ui(slot)
+ return
+
+/mob/living/carbon/slime/attack_slime(mob/living/carbon/slime/M as mob)
+ ..()
+ if(src.Victim)
+ src.Victim = null
+ visible_message("[M] pulls [src] off!")
+ return
+ attacked += 5
+ if(src.nutrition >= 100) //steal some nutrition. negval handled in life()
+ src.nutrition -= (50 + (5 * M.amount_grown))
+ M.add_nutrition(50 + (5 * M.amount_grown))
+ if(src.health > 0)
+ src.adjustBruteLoss(4 + (2 * M.amount_grown)) //amt_grown isn't very linear but it works
+ src.updatehealth()
+ M.adjustBruteLoss(-4 + (-2 * M.amount_grown))
+ M.updatehealth()
+ return
+
+/mob/living/carbon/slime/attack_animal(mob/living/simple_animal/M as mob)
+ if(..())
+ var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
+ attacked += 10
+ adjustBruteLoss(damage)
+ updatehealth()
+
+/mob/living/carbon/slime/attack_paw(mob/living/carbon/monkey/M as mob)
+ if(..()) //successful monkey bite.
+ if(stat != DEAD)
+ attacked += 10
+ adjustBruteLoss(rand(1, 3))
+ updatehealth()
+ return
+
+/mob/living/carbon/slime/attack_larva(mob/living/carbon/alien/larva/L as mob)
+ if(..()) //successful larva bite.
+ var/damage = rand(1, 3)
+ if(stat != DEAD)
+ L.amount_grown = min(L.amount_grown + damage, L.max_grown)
+ adjustBruteLoss(damage)
+ updatehealth()
+
+/mob/living/carbon/slime/attack_hulk(mob/living/carbon/human/user)
+ if(user.a_intent == "harm")
+ adjustBruteLoss(5)
+ if(Victim || Target)
+ Victim = null
+ Target = null
+ anchored = 0
+ if(prob(80) && !client)
+ Discipline++
+ spawn(0)
+ step_away(src,user,15)
+ sleep(3)
+ step_away(src,user,15)
+
+
+/mob/living/carbon/slime/attack_hand(mob/living/carbon/human/M as mob)
+ if(Victim)
+ if(Victim == M)
+ if(prob(60))
+ visible_message("[M] attempts to wrestle \the [name] off!")
+ playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
+
+ else
+ visible_message(" [M] manages to wrestle \the [name] off!")
+ playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+
+ if(prob(90) && !client)
+ Discipline++
+
+ spawn()
+ SStun = 1
+ sleep(rand(45,60))
+ if(src)
+ SStun = 0
+
+ Victim = null
+ anchored = 0
+ step_away(src,M)
+
+ return
+
+ else
+ M.do_attack_animation(src)
+ if(prob(30))
+ visible_message("[M] attempts to wrestle \the [name] off of [Victim]!")
+ playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
+
+ else
+ visible_message(" [M] manages to wrestle \the [name] off of [Victim]!")
+ playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+
+ if(prob(80) && !client)
+ Discipline++
+
+ if(!is_adult)
+ if(Discipline == 1)
+ attacked = 0
+
+ spawn()
+ SStun = 1
+ sleep(rand(55,65))
+ if(src)
+ SStun = 0
+
+ Victim = null
+ anchored = 0
+ step_away(src,M)
+
+ return
+
+ if(..()) //To allow surgery to return properly.
+ return
+
+ switch(M.a_intent)
+ if("help")
+ help_shake_act(M)
+ if("grab")
+ grabbedby(M)
+ else
+ M.do_attack_animation(src)
+ var/damage = rand(1, 9)
+ attacked += 10
+ if (prob(90))
+ playsound(loc, "punch", 25, 1, -1)
+ add_logs(M, src, "attacked", admin=0)
+ visible_message("[M] has punched [src]!", \
+ "[M] has punched [src]!")
+
+ if (stat != DEAD)
+ adjustBruteLoss(damage)
+ updatehealth()
+ else
+ playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
+ visible_message("[M] has attempted to punch [src]!")
+ return
+
+
+
+/mob/living/carbon/slime/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
+ if(..()) //if harm or disarm intent.
+
+ if (M.a_intent == "harm")
+ if (prob(95))
+ attacked += 10
+ playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
+ var/damage = rand(15, 30)
+ if (damage >= 25)
+ damage = rand(20, 40)
+ visible_message("[M] has slashed [name]!", \
+ "[M] has slashed [name]!")
+ else
+ visible_message("[M] has wounded [name]!", \
+ ")[M] has wounded [name]!")
+
+ add_logs(M, src, "attacked", admin=0)
+ if (health != DEAD)
+ adjustBruteLoss(damage)
+ updatehealth()
+ else
+ playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1)
+ visible_message("[M] has attempted to lunge at [name]!", \
+ "[M] has attempted to lunge at [name]!")
+
+ if (M.a_intent == "disarm")
+ playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1)
+ var/damage = 5
+ attacked += 10
+
+ if(prob(95))
+ visible_message("[M] has tackled [name]!", \
+ "[M] has tackled [name]!")
+
+ if(Victim || Target)
+ Victim = null
+ Target = null
+ anchored = 0
+ if(prob(80) && !client)
+ Discipline++
+ if(!istype(src, /mob/living/carbon/slime))
+ if(Discipline == 1)
+ attacked = 0
+
+ spawn()
+ SStun = 1
+ sleep(rand(5,20))
+ SStun = 0
+
+ spawn(0)
+
+ step_away(src,M,15)
+ sleep(3)
+ step_away(src,M,15)
+
+ else
+ drop_item()
+ visible_message("[M] has disarmed [name]!",
+ "[M] has disarmed [name]!")
+ add_logs(M, src, "disarmed", admin=0)
+ adjustBruteLoss(damage)
+ updatehealth()
+ return
+
+/mob/living/carbon/slime/attackby(obj/item/W, mob/living/user, params)
+ if(istype(W,/obj/item/stack/sheet/mineral/plasma)) //Let's you feed slimes plasma.
+ if (user in Friends)
+ ++Friends[user]
+ else
+ Friends[user] = 1
+ user << "You feed the slime the plasma. It chirps happily."
+ var/obj/item/stack/sheet/mineral/plasma/S = W
+ S.use(1)
+ return
+ else if(W.force > 0)
+ attacked += 10
+ if(prob(25))
+ user.do_attack_animation(src)
+ user << "[W] passes right through [src]!"
+ return
+ if(Discipline && prob(50)) // wow, buddy, why am I getting attacked??
+ Discipline = 0
+ else if(W.force >= 3)
+ if(is_adult)
+ if(prob(5 + round(W.force/2)))
+ if(Victim || Target)
+ if(prob(80) && !client)
+ Discipline++
+
+ Victim = null
+ Target = null
+ anchored = 0
+
+ spawn()
+ SStun = 1
+ sleep(rand(5,20))
+ SStun = 0
+
+ spawn(0)
+ if(user)
+ canmove = 0
+ step_away(src, user)
+ if(prob(25 + W.force))
+ sleep(2)
+ if(user)
+ step_away(src, user)
+ canmove = 1
+
+ else
+ if(prob(10 + W.force*2))
+ if(Victim || Target)
+ if(prob(80) && !client)
+ Discipline++
+ if(Discipline == 1)
+ attacked = 0
+ spawn()
+ SStun = 1
+ sleep(rand(5,20))
+ SStun = 0
+
+ Victim = null
+ Target = null
+ anchored = 0
+
+ spawn(0)
+ if(user)
+ canmove = 0
+ step_away(src, user)
+ if(prob(25 + W.force*4))
+ sleep(2)
+ if(user)
+ step_away(src, user)
+ canmove = 1
+ ..()
+
+/mob/living/carbon/slime/restrained()
+ return 0
+
+/mob/living/carbon/slime/show_inv(mob/user)
+ return
+
+/mob/living/carbon/slime/toggle_throw_mode()
+ return
+
+/mob/living/carbon/slime/proc/apply_water()
+ adjustToxLoss(rand(15,20))
+ if (!client)
+ if (Target) // Like cats
+ Target = null
+ ++Discipline
+ return
+
+/obj/item/slime_extract
+ name = "slime extract"
+ desc = "Goo extracted from a slime. Legends claim these to have \"magical powers\"."
+ icon = 'icons/mob/slimes.dmi'
+ icon_state = "grey slime extract"
+ force = 1.0
+ w_class = 1.0
+ throwforce = 0
+ throw_speed = 3
+ throw_range = 6
+ origin_tech = "biotech=4"
+ var/Uses = 1 // uses before it goes inert
+ var/enhanced = 0 //has it been enhanced before?
+
+ attackby(obj/item/O as obj, mob/user as mob)
+ if(istype(O, /obj/item/weapon/slimesteroid2))
+ if(enhanced == 1)
+ user << " This extract has already been enhanced!"
+ return ..()
+ if(Uses == 0)
+ user << " You can't enhance a used extract!"
+ return ..()
+ user <<"You apply the enhancer. It now has triple the amount of uses."
+ Uses = 3
+ enhanced = 1
+ qdel(O)
+
+/obj/item/slime_extract/New()
+ ..()
+ create_reagents(100)
+
+/obj/item/slime_extract/grey
+ name = "grey slime extract"
+ icon_state = "grey slime extract"
+
+/obj/item/slime_extract/gold
+ name = "gold slime extract"
+ icon_state = "gold slime extract"
+
+/obj/item/slime_extract/silver
+ name = "silver slime extract"
+ icon_state = "silver slime extract"
+
+/obj/item/slime_extract/metal
+ name = "metal slime extract"
+ icon_state = "metal slime extract"
+
+/obj/item/slime_extract/purple
+ name = "purple slime extract"
+ icon_state = "purple slime extract"
+
+/obj/item/slime_extract/darkpurple
+ name = "dark purple slime extract"
+ icon_state = "dark purple slime extract"
+
+/obj/item/slime_extract/orange
+ name = "orange slime extract"
+ icon_state = "orange slime extract"
+
+/obj/item/slime_extract/yellow
+ name = "yellow slime extract"
+ icon_state = "yellow slime extract"
+
+/obj/item/slime_extract/red
+ name = "red slime extract"
+ icon_state = "red slime extract"
+
+/obj/item/slime_extract/blue
+ name = "blue slime extract"
+ icon_state = "blue slime extract"
+
+/obj/item/slime_extract/darkblue
+ name = "dark blue slime extract"
+ icon_state = "dark blue slime extract"
+
+/obj/item/slime_extract/pink
+ name = "pink slime extract"
+ icon_state = "pink slime extract"
+
+/obj/item/slime_extract/green
+ name = "green slime extract"
+ icon_state = "green slime extract"
+
+/obj/item/slime_extract/lightpink
+ name = "light pink slime extract"
+ icon_state = "light pink slime extract"
+
+/obj/item/slime_extract/black
+ name = "black slime extract"
+ icon_state = "black slime extract"
+
+/obj/item/slime_extract/oil
+ name = "oil slime extract"
+ icon_state = "oil slime extract"
+
+/obj/item/slime_extract/adamantine
+ name = "adamantine slime extract"
+ icon_state = "adamantine slime extract"
+
+/obj/item/slime_extract/bluespace
+ name = "bluespace slime extract"
+ icon_state = "bluespace slime extract"
+
+/obj/item/slime_extract/pyrite
+ name = "pyrite slime extract"
+ icon_state = "pyrite slime extract"
+
+/obj/item/slime_extract/cerulean
+ name = "cerulean slime extract"
+ icon_state = "cerulean slime extract"
+
+/obj/item/slime_extract/sepia
+ name = "sepia slime extract"
+ icon_state = "sepia slime extract"
+
+/obj/item/slime_extract/rainbow
+ name = "rainbow slime extract"
+ icon_state = "rainbow slime extract"
+
+////Pet Slime Creation///
+
+/obj/item/slimepotion
+ name = "docility potion"
+ desc = "A potent chemical mix that nullifies a slime's hunger, causing it to become docile and tame."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle19"
+
+/obj/item/slimepotion/attack(mob/living/carbon/slime/M as mob, mob/user as mob)
+ if(!isslime(M))
+ user << "The potion only works on slimes!"
+ return ..()
+ if(M.stat)
+ user << "The slime is dead!"
+ return..()
+
+ M.docile = 1
+ M.nutrition = 700
+ M <<" You absorb the potion and feel your intense desire to feed melt away."
+ user <<" You feed the slime the potion, removing it's hunger and calming it."
+ var/newname = copytext(sanitize(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text),1,MAX_NAME_LEN)
+
+ if (!newname)
+ newname = "pet slime"
+ M.name = newname
+ M.real_name = newname
+ qdel(src)
+
+/obj/item/slimepotion2
+ name = "sentience potion"
+ desc = "A miraculous chemical mix that can raise the intelligence of creatures to human levels."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle19"
+
+/obj/item/slimepotion2/afterattack(mob/living/M as mob, mob/user as mob)
+ if(!(isslime(M) || isanimal(M) || ismonkey(M) || !M.ckey)) //I'm sorry for this line
+ user << "[M] is already too intelligent for this to work!"
+ return ..()
+ if(M.stat)
+ user << "[M] is dead!"
+ return..()
+
+ var/list/candidates = get_candidates(BE_ALIEN, ALIEN_AFK_BRACKET)
+ var/client/C = null
+
+ if(candidates.len)
+ C = pick(candidates)
+ M.key = C.key
+ M.languages |= HUMAN
+ M << "All at once it makes sense, you know what you are and who you are! Self awareness is yours!"
+ M << "You are grateful to be self aware and owe [user] a great debt. Serve [user], and assist them in completing their goals at any cost."
+ user << "[M] is suddenly attentive and aware. It worked!"
+ qdel(src)
+ else
+ user << "[M] looks interested for a moment, but then looks back down. Maybe you should try again later..."
+ ..()
+
+/obj/item/weapon/slimesteroid
+ name = "slime steroid"
+ desc = "A potent chemical mix that will cause a slime to generate more extract."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle16"
+
+ attack(mob/living/carbon/slime/M as mob, mob/user as mob)
+ if(!istype(M, /mob/living/carbon/slime))//If target is not a slime.
+ user << " The steroid only works on baby slimes!"
+ return ..()
+ if(M.is_adult) //Can't tame adults
+ user << " Only baby slimes can use the steroid!"
+ return..()
+ if(M.stat)
+ user << " The slime is dead!"
+ return..()
+ if(M.cores == 3)
+ user <<" The slime already has the maximum amount of extract!"
+ return..()
+
+ user <<"You feed the slime the steroid. It now has triple the amount of extract."
+ M.cores = 3
+ qdel(src)
+
+/obj/item/weapon/slimesteroid2
+ name = "extract enhancer"
+ desc = "A potent chemical mix that will give a slime extract three uses."
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "bottle17"
+
+ /*afterattack(obj/target, mob/user , flag)
+ if(istype(target, /obj/item/slime_extract))
+ if(target.enhanced == 1)
+ user << " This extract has already been enhanced!"
+ return ..()
+ if(target.Uses == 0)
+ user << " You can't enhance a used extract!"
+ return ..()
+ user <<"You apply the enhancer. It now has triple the amount of uses."
+ target.Uses = 3
+ target.enahnced = 1
+ qdel(src)*/
+
+////////Adamantine Golem stuff I dunno where else to put it
+
+// This will eventually be removed.
+
+/obj/item/clothing/under/golem
+ name = "adamantine skin"
+ desc = "a golem's skin"
+ icon_state = "golem"
+ item_state = "golem"
+ item_color = "golem"
+ flags = ABSTRACT | NODROP
+ has_sensor = 0
+
+/obj/item/clothing/suit/golem
+ name = "adamantine shell"
+ desc = "a golem's thick outter shell"
+ icon_state = "golem"
+ item_state = "golem"
+ w_class = 4//bulky item
+ gas_transfer_coefficient = 0.90
+ permeability_coefficient = 0.50
+ body_parts_covered = FULL_BODY
+ flags_inv = HIDEGLOVES | HIDESHOES | HIDEJUMPSUIT
+ flags = ABSTRACT | NODROP
+
+/obj/item/clothing/shoes/golem
+ name = "golem's feet"
+ desc = "sturdy adamantine feet"
+ icon_state = "golem"
+ item_state = null
+ flags = NOSLIP | ABSTRACT | NODROP
+
+
+/obj/item/clothing/mask/breath/golem
+ name = "golem's face"
+ desc = "the imposing face of an adamantine golem"
+ icon_state = "golem"
+ item_state = "golem"
+ siemens_coefficient = 0
+ unacidable = 1
+ flags = ABSTRACT | NODROP
+
+
+/obj/item/clothing/gloves/golem
+ name = "golem's hands"
+ desc = "strong adamantine hands"
+ icon_state = "golem"
+ item_state = null
+ siemens_coefficient = 0
+ flags = ABSTRACT | NODROP
+
+
+/obj/item/clothing/head/space/golem
+ icon_state = "golem"
+ item_state = "dermal"
+ item_color = "dermal"
+ name = "golem's head"
+ desc = "a golem's head"
+ unacidable = 1
+ flags = ABSTRACT | NODROP
+
+/obj/effect/golemrune
+ anchored = 1
+ desc = "a strange rune used to create golems. It glows when spirits are nearby."
+ name = "rune"
+ icon = 'icons/obj/rune.dmi'
+ icon_state = "golem"
+ unacidable = 1
+ layer = TURF_LAYER
+
+ New()
+ ..()
+ SSobj.processing |= src
+
+/obj/effect/golemrune/process()
+ var/mob/dead/observer/ghost
+ for(var/mob/dead/observer/O in src.loc)
+ if(!O.client) continue
+ if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
+ ghost = O
+ break
+ if(ghost)
+ icon_state = "golem2"
+ else
+ icon_state = "golem"
+
+/obj/effect/golemrune/attack_hand(mob/living/user as mob)
+ var/mob/dead/observer/ghost
+ for(var/mob/dead/observer/O in src.loc)
+ if(!O.client) continue
+ if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
+ ghost = O
+ break
+ if(!ghost)
+ user << "The rune fizzles uselessly. There is no spirit nearby."
+ return
+ var/mob/living/carbon/human/G = new /mob/living/carbon/human
+ if(prob(50)) G.gender = "female"
+ hardset_dna(G, null, null, null, null, /datum/species/golem/adamantine)
+
+ G.set_cloned_appearance()
+ G.real_name = text("Adamantine Golem ([rand(1, 1000)])")
+ G.dna.species.auto_equip(G)
+ G.loc = src.loc
+ G.key = ghost.key
+ G << "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost."
+ qdel(src)
+
+/mob/living/carbon/slime/getTrail()
+ return null
+
+/mob/living/carbon/slime/slip(var/s_amount, var/w_amount, var/obj/O, var/lube)
+ if(lube>=2)
+ return 0
+ .=..()
+
+/mob/living/carbon/slime/stripPanelUnequip(obj/item/what, mob/who)
+ src << "You don't have the dexterity to do this!"
+ return
+
+/mob/living/carbon/slime/stripPanelEquip(obj/item/what, mob/who)
+ src << "You don't have the dexterity to do this!"
+ return
+
+
+//////////////////////////////Old shit from metroids/RoRos, and the old cores, would not take much work to re-add them////////////////////////
+
+/*
+// Basically this slime Core catalyzes reactions that normally wouldn't happen anywhere
+/obj/item/slime_core
+ name = "slime extract"
+ desc = "Goo extracted from a slime. Legends claim these to have \"magical powers\"."
+ icon = 'icons/mob/slimes.dmi'
+ icon_state = "slime extract"
+ force = 1.0
+ w_class = 1.0
+ throwforce = 1.0
+ throw_speed = 2
+ throw_range = 6
+ origin_tech = "biotech=4"
+ var/POWERFLAG = 0 // sshhhhhhh
+ var/Flush = 30
+ var/Uses = 5 // uses before it goes inert
+
+/obj/item/slime_core/New()
+ ..()
+ create_reagents(100)
+ POWERFLAG = rand(1,10)
+ Uses = rand(7, 25)
+ //flags |= NOREACT
+/*
+ spawn()
+ Life()
+
+ proc/Life()
+ while(src)
+ sleep(25)
+ Flush--
+ if(Flush <= 0)
+ reagents.clear_reagents()
+ Flush = 30
+*/
+
+
+
+/obj/item/weapon/reagent_containers/food/snacks/egg/slime
+ name = "slime egg"
+ desc = "A small, gelatinous egg."
+ icon = 'icons/mob/mob.dmi'
+ icon_state = "slime egg-growing"
+ bitesize = 12
+ origin_tech = "biotech=4"
+ var/grown = 0
+
+/obj/item/weapon/reagent_containers/food/snacks/egg/slime/New()
+ ..()
+ reagents.add_reagent("nutriment", 4)
+ reagents.add_reagent("slimejelly", 1)
+ spawn(rand(1200,1500))//the egg takes a while to "ripen"
+ Grow()
+
+/obj/item/weapon/reagent_containers/food/snacks/egg/slime/proc/Grow()
+ grown = 1
+ icon_state = "slime egg-grown"
+ SSobj.processing.Add(src)
+ return
+
+/obj/item/weapon/reagent_containers/food/snacks/egg/slime/proc/Hatch()
+ SSobj.processing.Remove(src)
+ var/turf/T = get_turf(src)
+ src.visible_message(" The [name] pulsates and quivers!")
+ spawn(rand(50,100))
+ src.visible_message(" The [name] bursts open!")
+ new/mob/living/carbon/slime(T)
+ qdel(src)
+
+
+/obj/item/weapon/reagent_containers/food/snacks/egg/slime/process()
+ var/turf/location = get_turf(src)
+ var/datum/gas_mixture/environment = location.return_air()
+ if (environment.toxins > MOLES_PLASMA_VISIBLE)//plasma exposure causes the egg to hatch
+ src.Hatch()
+
+/obj/item/weapon/reagent_containers/food/snacks/egg/slime/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(istype( W, /obj/item/toy/crayon ))
+ return
+ else
+ ..()
+*/
diff --git a/code/modules/mob/living/simple_animal/slime/subtypes.dm b/code/modules/mob/living/carbon/slime/subtypes.dm
similarity index 97%
rename from code/modules/mob/living/simple_animal/slime/subtypes.dm
rename to code/modules/mob/living/carbon/slime/subtypes.dm
index 55a6eee734dc9..35d38e31a48b7 100644
--- a/code/modules/mob/living/simple_animal/slime/subtypes.dm
+++ b/code/modules/mob/living/carbon/slime/subtypes.dm
@@ -1,4 +1,4 @@
-/mob/living/simple_animal/slime/proc/mutation_table(var/colour)
+proc/mutation_table(var/colour)
var/list/slime_mutation[4]
switch(colour)
//Tier 1
diff --git a/code/modules/mob/living/carbon/slime/update_icons.dm b/code/modules/mob/living/carbon/slime/update_icons.dm
new file mode 100644
index 0000000000000..3edf65b6f8381
--- /dev/null
+++ b/code/modules/mob/living/carbon/slime/update_icons.dm
@@ -0,0 +1,4 @@
+//no special icon processing
+
+/mob/living/carbon/slime/update_transform() //They're slimes, they don't lie down.
+ return
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm
index 40c8b4f11e22f..77947b7b4ff01 100644
--- a/code/modules/mob/living/carbon/update_icons.dm
+++ b/code/modules/mob/living/carbon/update_icons.dm
@@ -7,15 +7,16 @@
var/final_pixel_y = pixel_y
var/final_dir = dir
var/changed = 0
+
if(lying != lying_prev)
changed++
ntransform.TurnTo(lying_prev,lying)
if(lying == 0) //Lying to standing
- final_pixel_y = get_standard_pixel_y_offset()
+ final_pixel_y = initial(pixel_y)
else //if(lying != 0)
if(lying_prev == 0) //Standing to lying
- pixel_y = get_standard_pixel_y_offset()
- final_pixel_y = get_standard_pixel_y_offset(lying)
+ pixel_y = initial(pixel_y)
+ final_pixel_y -= 6
if(dir & (EAST|WEST)) //Facing east or west
final_dir = pick(NORTH, SOUTH) //So you fall on your side rather than your face or ass
diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index 89a35a4e6055d..d420721feef5b 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -51,7 +51,7 @@
if(PARALYZE)
Paralyse(effect * blocked)
if(IRRADIATE)
- radiation += max(effect * blocked, 0)
+ radiation += max(effect * ((100-run_armor_check(null, "rad", "Your clothes feel warm.", "Your clothes feel warm."))/100),0)//Rads auto check armor
if(SLUR)
slurring = max(slurring,(effect * blocked))
if(STUTTER)
diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm
index c0eddd775b7fd..9b0accbe230a3 100644
--- a/code/modules/mob/living/death.dm
+++ b/code/modules/mob/living/death.dm
@@ -32,14 +32,11 @@
flick(flick_name, animate)
/mob/living/death(gibbed)
- eye_blind = max(eye_blind, 1)
timeofdeath = world.time
living_mob_list -= src
if(!gibbed)
dead_mob_list += src
- else if(buckled)
- buckled.unbuckle_mob()
/mob/living/proc/setup_animation(var/animation, var/prev_lying)
diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm
index d79896f82ddde..35817513e0860 100644
--- a/code/modules/mob/living/emote.dm
+++ b/code/modules/mob/living/emote.dm
@@ -85,11 +85,6 @@
message = "[src] flaps its wings."
m_type = 2
- if ("flip")
- if (!src.restrained() || !src.resting || !src.sleeping)
- src.SpinAnimation(7,1)
- m_type = 2
-
if ("frown")
message = "[src] frowns."
m_type = 1
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
deleted file mode 100644
index af02c55f54306..0000000000000
--- a/code/modules/mob/living/life.dm
+++ /dev/null
@@ -1,259 +0,0 @@
-/mob/living/Life()
- set invisibility = 0
- set background = BACKGROUND_ENABLED
-
- if (notransform)
- return
- if(!loc)
- return
- var/datum/gas_mixture/environment = loc.return_air()
-
- if(stat != DEAD)
-
- //Breathing, if applicable
- handle_breathing()
-
- //Mutations and radiation
- handle_mutations_and_radiation()
-
- //Chemicals in the body
- handle_chemicals_in_body()
-
- //Blud
- handle_blood()
-
- //Random events (vomiting etc)
- handle_random_events()
-
- . = 1
-
- //Handle temperature/pressure differences between body and environment
- if(environment)
- handle_environment(environment)
-
- handle_fire()
-
- //stuff in the stomach
- handle_stomach()
-
- update_gravity(mob_has_gravity())
-
- update_pulling()
-
- for(var/obj/item/weapon/grab/G in src)
- G.process()
-
- if(handle_regular_status_updates()) // Status & health update, are we dead or alive etc.
- handle_disabilities() // eye, ear, brain damages
- handle_status_effects() //all special effects, stunned, weakened, jitteryness, hallucination, sleeping, etc
-
- handle_actions()
-
- update_canmove()
-
- if(client)
- handle_regular_hud_updates()
-
- return .
-
-
-
-/mob/living/proc/handle_breathing()
- return
-
-/mob/living/proc/handle_mutations_and_radiation()
- return
-
-/mob/living/proc/handle_chemicals_in_body()
- return
-
-/mob/living/proc/handle_blood()
- return
-
-/mob/living/proc/handle_random_events()
- return
-
-/mob/living/proc/handle_environment(var/datum/gas_mixture/environment)
- return
-
-/mob/living/proc/handle_stomach()
- return
-
-/mob/living/proc/update_pulling()
- if(pulling)
- if(incapacitated())
- stop_pulling()
-
-//This updates the health and status of the mob (conscious, unconscious, dead)
-/mob/living/proc/handle_regular_status_updates()
-
- updatehealth()
-
- if(stat != DEAD)
-
- if(paralysis)
- stat = UNCONSCIOUS
-
- else if (status_flags & FAKEDEATH)
- stat = UNCONSCIOUS
-
- else
- stat = CONSCIOUS
-
- return 1
-
-//this updates all special effects: stunned, sleeping, weakened, druggy, stuttering, etc..
-/mob/living/proc/handle_status_effects()
- if(paralysis)
- paralysis = max(paralysis-1,0)
- if(stunned)
- stunned = max(stunned-1,0)
- if(!stunned)
- update_icons()
-
- if(weakened)
- weakened = max(weakened-1,0)
- if(!weakened)
- update_icons()
-
-/mob/living/proc/handle_disabilities()
- //Eyes
- if(disabilities & BLIND || stat) //blindness from disability or unconsciousness doesn't get better on its own
- eye_blind = max(eye_blind, 1)
- else if(eye_blind) //blindness, heals slowly over time
- eye_blind = max(eye_blind-1,0)
- else if(eye_blurry) //blurry eyes heal slowly
- eye_blurry = max(eye_blurry-1, 0)
-
- //Ears
- if(disabilities & DEAF) //disabled-deaf, doesn't get better on its own
- setEarDamage(-1, max(ear_deaf, 1))
- else
- // deafness heals slowly over time, unless ear_damage is over 100
- if(ear_damage < 100)
- adjustEarDamage(-0.05,-1)
-
-/mob/living/proc/handle_actions()
- //Pretty bad, i'd use picked/dropped instead but the parent calls in these are nonexistent
- for(var/datum/action/A in actions)
- if(A.CheckRemoval(src))
- A.Remove(src)
- for(var/obj/item/I in src)
- if(I.action_button_name)
- if(!I.action)
- if(I.action_button_is_hands_free)
- I.action = new/datum/action/item_action/hands_free
- else
- I.action = new/datum/action/item_action
- I.action.name = I.action_button_name
- I.action.target = I
- I.action.Grant(src)
- return
-
-//this handles hud updates. Calls update_vision() and handle_hud_icons()
-/mob/living/proc/handle_regular_hud_updates()
- if(!client) return 0
-
- handle_vision()
- handle_hud_icons()
- update_action_buttons()
-
- return 1
-
-/mob/living/proc/handle_vision()
-
- client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask)
-
- update_sight()
-
- if(stat != DEAD)
- if(blind)
- if(eye_blind)
- blind.layer = 18
- else
- blind.layer = 0
-
- if (disabilities & NEARSIGHT)
- client.screen += global_hud.vimpaired
-
- if (eye_blurry)
- client.screen += global_hud.blurry
-
- if (druggy)
- client.screen += global_hud.druggy
-
- if(eye_stat > 20)
- if(eye_stat > 30)
- client.screen += global_hud.darkMask
- else
- client.screen += global_hud.vimpaired
-
- if(machine)
- if (!( machine.check_eye(src) ))
- reset_view(null)
- else
- if(!client.adminobs)
- reset_view(null)
-
-/mob/living/proc/update_sight()
- return
-
-/mob/living/proc/handle_hud_icons()
- handle_hud_icons_health()
- return
-
-/mob/living/proc/handle_hud_icons_health()
- return
-
-/mob/living/update_action_buttons()
- if(!hud_used) return
- if(!client) return
-
- if(hud_used.hud_shown != 1) //Hud toggled to minimal
- return
-
- client.screen -= hud_used.hide_actions_toggle
- for(var/datum/action/A in actions)
- if(A.button)
- client.screen -= A.button
-
- if(hud_used.action_buttons_hidden)
- if(!hud_used.hide_actions_toggle)
- hud_used.hide_actions_toggle = new(hud_used)
- hud_used.hide_actions_toggle.UpdateIcon()
-
- if(!hud_used.hide_actions_toggle.moved)
- hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(1)
- //hud_used.SetButtonCoords(hud_used.hide_actions_toggle,1)
-
- client.screen += hud_used.hide_actions_toggle
- return
-
- var/button_number = 0
- for(var/datum/action/A in actions)
- button_number++
- if(A.button == null)
- var/obj/screen/movable/action_button/N = new(hud_used)
- N.owner = A
- A.button = N
-
- var/obj/screen/movable/action_button/B = A.button
-
- B.UpdateIcon()
-
- B.name = A.UpdateName()
-
- client.screen += B
-
- if(!B.moved)
- B.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number)
- //hud_used.SetButtonCoords(B,button_number)
-
- if(button_number > 0)
- if(!hud_used.hide_actions_toggle)
- hud_used.hide_actions_toggle = new(hud_used)
- hud_used.hide_actions_toggle.InitialiseIcon(src)
- if(!hud_used.hide_actions_toggle.moved)
- hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number+1)
- //hud_used.SetButtonCoords(hud_used.hide_actions_toggle,button_number+1)
- client.screen += hud_used.hide_actions_toggle
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index f6e909e9f254d..782b47d5847f0 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -8,6 +8,7 @@ Sorry Giacom. Please don't be mad :(
push_mob_back(src, A.push_dir)
*/
+
/mob/living/New()
. = ..()
generateStaticOverlay()
@@ -70,9 +71,6 @@ Sorry Giacom. Please don't be mad :(
//Called when we bump onto a mob
/mob/living/proc/MobBump(mob/M)
- //Even if we don't push/swap places, we "touched" them, so spread fire
- spreadFire(M)
-
if(now_pushing)
return 1
@@ -99,7 +97,7 @@ Sorry Giacom. Please don't be mad :(
M.loc = oldloc
M.LAssailant = src
- for(var/mob/living/simple_animal/slime/slime in view(1,M))
+ for(var/mob/living/carbon/slime/slime in view(1,M))
if(slime.Victim == M)
slime.UpdateFeed()
@@ -161,7 +159,7 @@ Sorry Giacom. Please don't be mad :(
return 0
if(!..())
return 0
- visible_message("[src] points to [A]")
+ usr.visible_message("[src] points to [A]")
return 1
/mob/living/verb/succumb(var/whispered as null)
@@ -320,13 +318,12 @@ Sorry Giacom. Please don't be mad :(
set name = "Sleep"
set category = "IC"
- if(sleeping)
- src << "You are already sleeping."
+ if(usr.sleeping)
+ usr << "You are already sleeping."
return
else
if(alert(src, "You sure you want to sleep for a while?", "Sleep", "Yes", "No") == "Yes")
- sleeping = 20 //Short nap
- update_canmove()
+ usr.sleeping = 20 //Short nap
/mob/proc/get_contents()
@@ -336,7 +333,6 @@ Sorry Giacom. Please don't be mad :(
resting = !resting
src << "You are now [resting ? "resting" : "getting up"]."
- update_canmove()
//Recursive function to find everything a mob is holding.
/mob/living/get_contents(var/obj/item/weapon/storage/Storage = null)
@@ -447,10 +443,10 @@ Sorry Giacom. Please don't be mad :(
C.reagents.clear_reagents()
for(var/datum/disease/D in viruses)
D.cure(0)
- if(stat == DEAD)
+ if(stat == 2)
dead_mob_list -= src
living_mob_list += src
- stat = CONSCIOUS
+ if(!isanimal(src)) stat = CONSCIOUS
if(ishuman(src))
var/mob/living/carbon/human/human_mob = src
human_mob.restore_blood()
@@ -458,7 +454,8 @@ Sorry Giacom. Please don't be mad :(
update_fire()
regenerate_icons()
-
+ ..()
+ return
/mob/living/proc/update_damage_overlays()
return
@@ -471,11 +468,11 @@ Sorry Giacom. Please don't be mad :(
if(config.allow_Metadata)
if(client)
- src << "[src]'s Metainfo: [client.prefs.metadata]"
+ usr << "[src]'s Metainfo: [client.prefs.metadata]"
else
- src << "[src] does not have any stored infomation!"
+ usr << "[src] does not have any stored infomation!"
else
- src << "OOC Metadata is not supported by this server!"
+ usr << "OOC Metadata is not supported by this server!"
return
@@ -490,12 +487,12 @@ Sorry Giacom. Please don't be mad :(
stop_pulling()
- var/cuff_dragged = 0
+ var/t7 = 1
if (restrained())
for(var/mob/living/M in range(src, 1))
- if (M.pulling == src && !M.incapacitated())
- cuff_dragged = 1
- if (!cuff_dragged && pulling && !throwing && (get_dist(src, pulling) <= 1 || pulling.loc == loc))
+ if ((M.pulling == src && M.stat == 0 && !( M.restrained() )))
+ t7 = null
+ if (t7 && pulling && (get_dist(src, pulling) <= 1 || pulling.loc == loc))
var/turf/T = loc
. = ..()
@@ -551,8 +548,9 @@ Sorry Giacom. Please don't be mad :(
if ((s_active && !( s_active in contents ) ))
s_active.close(src)
- for(var/mob/living/simple_animal/slime/M in oview(1,src))
- M.UpdateFeed(src)
+ if(update_slimes)
+ for(var/mob/living/carbon/slime/M in view(1,src))
+ M.UpdateFeed(src)
/mob/living/proc/makeTrail(var/turf/T, var/mob/living/M)
if(ishuman(M))
@@ -586,62 +584,173 @@ Sorry Giacom. Please don't be mad :(
/mob/living/proc/getTrail() //silicon and simple_animals don't get blood trails
return null
+/mob/living/proc/cuff_break(obj/item/weapon/restraints/I, mob/living/carbon/C)
+
+ if(C.dna.check_mutation(HULK))
+ C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
+
+ C.visible_message("[C] manages to break [I]!")
+ C << "You successfully break [I]."
+ qdel(I)
+
+ if(C.handcuffed)
+ C.handcuffed = null
+ C.update_inv_handcuffed(0)
+ return
+ else
+ C.legcuffed = null
+ C.update_inv_legcuffed(0)
+
+
+/mob/living/proc/cuff_resist(obj/item/weapon/restraints/I, mob/living/carbon/C)
+ var/breakouttime = 600
+ var/displaytime = 1
+ if(istype(I, /obj/item/weapon/restraints/handcuffs))
+ var/obj/item/weapon/restraints/handcuffs/HC = C.handcuffed
+ breakouttime = HC.breakouttime
+ else if(istype(I, /obj/item/weapon/restraints/legcuffs))
+ var/obj/item/weapon/restraints/legcuffs/LC = C.legcuffed
+ breakouttime = LC.breakouttime
+ displaytime = breakouttime / 600
+
+ if(isalienadult(C) || C.dna.check_mutation(HULK))
+ C.visible_message("[C] is trying to break [I]!")
+ C << "You attempt to break [I]. (This will take around 5 seconds and you need to stand still.)"
+ spawn(0)
+ if(do_after(C, 50))
+ if(!I || C.buckled)
+ return
+ cuff_break(I, C)
+ else
+ C << "You fail to break [I]!"
+ else
+
+ C.visible_message("[C] attempts to remove [I]!")
+ C << "You attempt to remove [I]. (This will take around [displaytime] minutes and you need to stand still.)"
+ spawn(0)
+ if(do_after(C, breakouttime, 10))
+ if(!I || C.buckled)
+ return
+ C.visible_message("[C] manages to remove [I]!")
+ C << "You successfully remove [I]."
+
+ if(C.handcuffed)
+ C.handcuffed.loc = C.loc
+ C.handcuffed = null
+ if(C.buckled && C.buckled.buckle_requires_restraints)
+ C.buckled.unbuckle_mob()
+ C.update_inv_handcuffed(0)
+ return
+ if(C.legcuffed)
+ C.legcuffed.loc = C.loc
+ C.legcuffed = null
+ C.update_inv_legcuffed(0)
+ else
+ C << "You fail to remove [I]!"
+
/mob/living/verb/resist()
set name = "Resist"
set category = "IC"
- if(!isliving(src) || next_move > world.time)
+ if(!isliving(usr) || usr.next_move > world.time)
return
- changeNext_move(CLICK_CD_RESIST)
+ usr.changeNext_move(CLICK_CD_RESIST)
+
+ var/mob/living/L = usr
//resisting grabs (as if it helps anyone...)
- if(!stat && canmove && !restrained())
+ if(!L.stat && L.canmove && !L.restrained())
var/resisting = 0
- for(var/obj/O in requests)
+ for(var/obj/O in L.requests)
qdel(O)
resisting++
- for(var/obj/item/weapon/grab/G in grabbed_by)
+ for(var/obj/item/weapon/grab/G in usr.grabbed_by)
resisting++
if(G.state == GRAB_PASSIVE)
qdel(G)
else
if(G.state == GRAB_AGGRESSIVE)
if(prob(25))
- visible_message("[src] has broken free of [G.assailant]'s grip!")
+ L.visible_message("[L] has broken free of [G.assailant]'s grip!")
qdel(G)
else
if(G.state == GRAB_NECK)
if(prob(5))
- visible_message("[src] has broken free of [G.assailant]'s headlock!")
+ L.visible_message("[L] has broken free of [G.assailant]'s headlock!")
qdel(G)
if(resisting)
- visible_message("[src] resists!")
+ L.visible_message("[L] resists!")
return
//unbuckling yourself
- if(buckled && last_special <= world.time)
- resist_buckle()
+ if(L.buckled && L.last_special <= world.time)
+ if(iscarbon(L))
+ var/mob/living/carbon/C = L
+ if(C.handcuffed)
+ C.changeNext_move(CLICK_CD_BREAKOUT)
+ C.last_special = world.time + CLICK_CD_BREAKOUT
+ C.visible_message("[C] attempts to unbuckle themself!", \
+ "You attempt to unbuckle yourself. (This will take around one minute and you need to stay still.)")
+ spawn(0)
+ if(do_after(usr, 600))
+ if(!C.buckled)
+ return
+ C.visible_message("[C] manages to unbuckle themself!", \
+ "You successfully unbuckle yourself.")
+ C.buckled.user_unbuckle_mob(C,C)
+ else
+ C << "You fail to unbuckle yourself!"
+ else
+ L.buckled.user_unbuckle_mob(L,L)
+ else
+ L.buckled.user_unbuckle_mob(L,L)
//Breaking out of a container (Locker, sleeper, cryo...)
else if(loc && istype(loc, /obj) && !isturf(loc))
- if(stat == CONSCIOUS && !stunned && !weakened && !paralysis)
+ if(L.stat == CONSCIOUS && !L.stunned && !L.weakened && !L.paralysis)
var/obj/C = loc
- C.container_resist(src)
-
- else if(canmove)
- if(on_fire)
- resist_fire() //stop, drop, and roll
- else if(last_special <= world.time)
- resist_restraints() //trying to remove cuffs.
-
-
-/mob/living/proc/resist_buckle()
- buckled.user_unbuckle_mob(src,src)
-
-/mob/living/proc/resist_fire()
- return
-
-/mob/living/proc/resist_restraints()
+ C.container_resist(L)
+
+ //Stop drop and roll & Handcuffs
+ else if(iscarbon(L))
+ var/mob/living/carbon/CM = L
+ if(CM.on_fire && CM.canmove)
+ CM.fire_stacks -= 5
+ CM.Weaken(3,1)
+ CM.spin(32,2)
+ CM.visible_message("[CM] rolls on the floor, trying to put themselves out!", \
+ "You stop, drop, and roll!")
+ sleep(30)
+ if(fire_stacks <= 0)
+ CM.visible_message("[CM] has successfully extinguished themselves!", \
+ "You extinguish yourself.")
+ ExtinguishMob()
+ return
+ if(CM.canmove && (CM.last_special <= world.time))
+ if(CM.handcuffed || CM.legcuffed)
+ CM.changeNext_move(CLICK_CD_BREAKOUT)
+ CM.last_special = world.time + CLICK_CD_BREAKOUT
+ if(CM.handcuffed)
+ cuff_resist(CM.handcuffed, CM)
+ else
+ cuff_resist(CM.legcuffed, CM)
+
+/mob/living/carbon/proc/spin(spintime, speed)
+ spawn()
+ var/D = dir
+ while(spintime >= speed)
+ sleep(speed)
+ switch(D)
+ if(NORTH)
+ D = EAST
+ if(SOUTH)
+ D = WEST
+ if(EAST)
+ D = SOUTH
+ if(WEST)
+ D = NORTH
+ dir = D
+ spintime -= speed
return
/mob/living/proc/get_visible_name()
@@ -666,14 +775,11 @@ Sorry Giacom. Please don't be mad :(
float(!has_gravity)
/mob/living/proc/float(on)
- if(throwing)
- return
if(on && !floating)
animate(src, pixel_y = pixel_y + 2, time = 10, loop = -1)
floating = 1
else if(!on && floating)
- var/final_pixel_y = get_standard_pixel_y_offset(lying)
- animate(src, pixel_y = final_pixel_y, time = 10)
+ animate(src, pixel_y = initial(pixel_y), time = 10)
floating = 0
//called when the mob receives a bright flash
@@ -736,12 +842,9 @@ Sorry Giacom. Please don't be mad :(
return
-/atom/movable/proc/do_attack_animation(atom/A, end_pixel_y)
+/atom/movable/proc/do_attack_animation(atom/A)
var/pixel_x_diff = 0
var/pixel_y_diff = 0
- var/final_pixel_y = initial(pixel_y)
- if(end_pixel_y)
- final_pixel_y = end_pixel_y
var/direction = get_dir(src, A)
switch(direction)
if(NORTH)
@@ -764,54 +867,19 @@ Sorry Giacom. Please don't be mad :(
if(SOUTHWEST)
pixel_x_diff = -8
pixel_y_diff = -8
-
animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, time = 2)
- animate(pixel_x = initial(pixel_x), pixel_y = final_pixel_y, time = 2)
+ animate(pixel_x = initial(pixel_x), pixel_y = initial(pixel_y), time = 2)
/mob/living/do_attack_animation(atom/A)
- var/final_pixel_y = get_standard_pixel_y_offset(lying)
- ..(A, final_pixel_y)
+ ..()
floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure to restart it in next life().
/mob/living/proc/do_jitter_animation(jitteriness)
var/amplitude = min(4, (jitteriness/100) + 1)
var/pixel_x_diff = rand(-amplitude, amplitude)
var/pixel_y_diff = rand(-amplitude/3, amplitude/3)
- var/final_pixel_x = get_standard_pixel_x_offset(lying)
- var/final_pixel_y = get_standard_pixel_y_offset(lying)
animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff , time = 2, loop = 6)
- animate(pixel_x = final_pixel_x , pixel_y = final_pixel_y , time = 2)
+ animate(pixel_x = initial(pixel_x) , pixel_y = initial(pixel_y) , time = 2)
floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure to restart it in next life().
-/mob/living/proc/get_temperature(var/datum/gas_mixture/environment)
- var/loc_temp = T0C
- if(istype(loc, /obj/mecha))
- var/obj/mecha/M = loc
- loc_temp = M.return_temperature()
-
- else if(istype(loc, /obj/structure/transit_tube_pod))
- loc_temp = environment.temperature
-
- else if(istype(get_turf(src), /turf/space))
- var/turf/heat_turf = get_turf(src)
- loc_temp = heat_turf.temperature
-
- else if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
- var/obj/machinery/atmospherics/unary/cryo_cell/C = loc
-
- if(C.air_contents.total_moles() < 10)
- loc_temp = environment.temperature
- else
- loc_temp = C.air_contents.temperature
-
- else
- loc_temp = environment.temperature
-
- return loc_temp
-
-/mob/living/proc/get_standard_pixel_x_offset(lying = 0)
- return initial(pixel_x)
-
-/mob/living/proc/get_standard_pixel_y_offset(lying = 0)
- return initial(pixel_y)
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index d5ed917a2bd2d..aedc993e895bb 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -134,31 +134,13 @@ proc/vol_by_throwforce_and_or_w_class(var/obj/item/I)
adjust_fire_stacks(0.5)
IgniteMob()
-
-//Share fire evenly between the two mobs
-//Called in MobBump() and Crossed()
-/mob/living/proc/spreadFire(var/mob/living/L)
- if(!istype(L))
- return
- var/L_old_on_fire = L.on_fire
-
- if(on_fire) //Only spread fire stacks if we're on fire
- fire_stacks /= 2
- L.fire_stacks += fire_stacks
- L.IgniteMob()
-
- if(L_old_on_fire) //Only ignite us and gain their stacks if they were onfire before we bumped them
- L.fire_stacks /= 2
- fire_stacks += L.fire_stacks
- IgniteMob()
-
//Mobs on Fire end
/mob/living/acid_act(var/acidpwr, var/toxpwr, var/acid_volume)
take_organ_damage(min(10*toxpwr, acid_volume * toxpwr))
-/mob/living/proc/grabbedby(mob/living/carbon/user,var/supress_message = 0)
+/mob/living/proc/grabbedby(mob/living/carbon/user)
if(user == src || anchored)
return 0
if(!(status_flags & CANPUSH))
@@ -176,11 +158,10 @@ proc/vol_by_throwforce_and_or_w_class(var/obj/item/I)
LAssailant = user
playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- if(!supress_message)
- visible_message("[user] has grabbed [src] passively!")
+ visible_message("[user] has grabbed [src] passively!")
-/mob/living/attack_slime(mob/living/simple_animal/slime/M as mob)
+/mob/living/attack_slime(mob/living/carbon/slime/M as mob)
if (!ticker)
M << "You cannot attack people before the game has started."
return
@@ -189,11 +170,26 @@ proc/vol_by_throwforce_and_or_w_class(var/obj/item/I)
return // can't attack while eating!
if (stat != DEAD)
- add_logs(M, src, "attacked", admin=0)
M.do_attack_animation(src)
visible_message("The [M.name] glomps [src]!", \
"The [M.name] glomps [src]!")
- return 1
+
+ if(M.powerlevel > 0)
+ var/stunprob = M.powerlevel * 7 + 10 // 17 at level 1, 80 at level 10
+ if(prob(stunprob))
+ M.powerlevel -= 3
+ if(M.powerlevel < 0)
+ M.powerlevel = 0
+
+ visible_message("The [M.name] has shocked [src]!", \
+ "The [M.name] has shocked [src]!")
+
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(5, 1, src)
+ s.start()
+ return 1
+ add_logs(M, src, "attacked", admin=0)
+ return
/mob/living/attack_animal(mob/living/simple_animal/M as mob)
if(M.melee_damage_upper == 0)
@@ -278,8 +274,3 @@ proc/vol_by_throwforce_and_or_w_class(var/obj/item/I)
/mob/living/incapacitated()
if(stat || paralysis || stunned || weakened || restrained())
return 1
-
-/mob/living/proc/irradiate(amount)
- if(amount)
- var/blocked = run_armor_check(null, "rad", "Your clothes feel warm", "Your clothes feel warm")
- apply_effect(amount, IRRADIATE, blocked)
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index c75676e411512..f949030014d9f 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -32,6 +32,7 @@
var/cameraFollow = null
var/tod = null // Time of death
+ var/update_slimes = 1
var/on_fire = 0 //The "Are we on fire?" var
var/fire_stacks = 0 //Tracks how many stacks of fire we have on, max is usually 20
@@ -40,6 +41,5 @@
var/floating = 0
var/mob_size = MOB_SIZE_HUMAN
var/metabolism_efficiency = 1 //more or less efficiency to metabolize helpful/harmful reagents and regulate body temperature..
- var/list/image/staticOverlays = list()
- var/has_limbs = 0 //does the mob have distinct limbs?(arms,legs, chest,head)
- var/list/datum/action/actions = list()
\ No newline at end of file
+
+ var/list/image/staticOverlays = list()
\ No newline at end of file
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index e5986aa8589d5..d158b3648c1d2 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -1,3 +1,22 @@
+//bitflag #defines for radio return.
+#define ITALICS 1
+#define REDUCE_RANGE 2
+#define NOPASS 4
+
+//message modes. you're not supposed to mess with these.
+#define MODE_HEADSET "headset"
+#define MODE_ROBOT "robot"
+#define MODE_R_HAND "right hand"
+#define MODE_L_HAND "left hand"
+#define MODE_INTERCOM "intercom"
+#define MODE_BINARY "binary"
+#define MODE_WHISPER "whisper"
+#define MODE_SECURE_HEADSET "secure headset"
+#define MODE_DEPARTMENT "department"
+#define MODE_ALIEN "alientalk"
+#define MODE_HOLOPAD "holopad"
+#define MODE_CHANGELING "changeling"
+
var/list/department_radio_keys = list(
":r" = "right hand", "#r" = "right hand", ".r" = "right hand",
":l" = "left hand", "#l" = "left hand", ".l" = "left hand",
@@ -16,7 +35,6 @@ var/list/department_radio_keys = list(
":v" = "Service", "#v" = "Service", ".v" = "Service",
":o" = "AI Private", "#o" = "AI Private", ".o" = "AI Private",
":g" = "changeling", "#g" = "changeling", ".g" = "changeling",
- ":y" = "Centcom", "#y" = "Centcom", ".y" = "Centcom",
":R" = "right hand", "#R" = "right hand", ".R" = "right hand",
":L" = "left hand", "#L" = "left hand", ".L" = "left hand",
@@ -35,7 +53,6 @@ var/list/department_radio_keys = list(
":V" = "Service", "#V" = "Service", ".V" = "Service",
":O" = "AI Private", "#O" = "AI Private", ".O" = "AI Private",
":G" = "changeling", "#G" = "changeling", ".G" = "changeling",
- ":Y" = "Centcom", "#Y" = "Centcom", ".Y" = "Centcom",
//kinda localization -- rastaf0
//same keys as above, but on russian keyboard layout. This file uses cp1251 as encoding.
@@ -56,7 +73,10 @@ var/list/department_radio_keys = list(
":ï" = "changeling", "#ï" = "changeling", ".ï" = "changeling"
)
-/mob/living/say(message, bubble_type,)
+/mob/proc/binarycheck()
+ return 0
+
+/mob/living/say(message, bubble_type)
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
if(stat == DEAD)
@@ -88,18 +108,17 @@ var/list/department_radio_keys = list(
return
message = treat_message(message)
- var/spans = list()
- spans += get_spans()
if(!message || message == "")
return
+ var/italics = 0
var/message_range = 7
- var/radio_return = radio(message, message_mode, spans)
+ var/radio_return = radio(message, message_mode)
if(radio_return & NOPASS) //There's a whisper() message_mode, no need to continue the proc if that is called
return
if(radio_return & ITALICS)
- spans |= SPAN_ITALICS
+ italics = 1
if(radio_return & REDUCE_RANGE)
message_range = 1
@@ -111,50 +130,64 @@ var/list/department_radio_keys = list(
message_range = 1
if(pressure < ONE_ATMOSPHERE*0.4) //Thin air, let's italicise the message
- spans |= SPAN_ITALICS
+ italics = 1
+
+ if(italics)
+ message = "[message]"
- send_speech(message, message_range, src, bubble_type, spans)
+ send_speech(message, message_range, src, bubble_type)
log_say("[name]/[key] : [message]")
return 1
-/mob/living/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans)
+/mob/living/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq)
if(!client)
return
var/deaf_message
var/deaf_type
if(speaker != src)
if(!radio_freq) //These checks have to be seperate, else people talking on the radio will make "You can't hear yourself!" appear when hearing people over the radio while deaf.
- deaf_message = "[speaker] [speaker.verb_say] something but you cannot hear them."
+ deaf_message = "[speaker] talks but you cannot hear them."
deaf_type = 1
else
deaf_message = "You can't hear yourself!"
deaf_type = 2 // Since you should be able to hear yourself without looking
if(!(message_langs & languages) || force_compose) //force_compose is so AIs don't end up without their hrefs.
- message = compose_message(speaker, message_langs, raw_message, radio_freq, spans)
+ message = compose_message(speaker, message_langs, raw_message, radio_freq)
show_message(message, 2, deaf_message, deaf_type)
return message
-/mob/living/send_speech(message, message_range = 7, obj/source = src, bubble_type, list/spans)
+/mob/living/send_speech(message, message_range = 7, obj/source = src, bubble_type)
var/list/listening = get_hearers_in_view(message_range, source)
+ var/list/listening_dead = list()
for(var/mob/M in player_list)
if(M.stat == DEAD && M.client && ((M.client.prefs.chat_toggles & CHAT_GHOSTEARS) || (get_dist(M, src) <= 7)) && client) // client is so that ghosts don't have to listen to mice
- listening |= M
+ listening_dead |= M
- var/rendered = compose_message(src, languages, message, , spans)
+ listening -= listening_dead //so ghosts dont hear stuff twice
+
+ var/rendered = compose_message(src, languages, message)
for(var/atom/movable/AM in listening)
- AM.Hear(rendered, src, languages, message, , spans)
+ AM.Hear(rendered, src, languages, message)
+
+ for(var/mob/M in listening_dead)
+ M.Hear(rendered, src, languages, message)
//speech bubble
var/list/speech_bubble_recipients = list()
- for(var/mob/M in listening)
+ for(var/mob/M in (listening + listening_dead))
if(M.client)
speech_bubble_recipients.Add(M.client)
spawn(0)
flick_overlay(image('icons/mob/talk.dmi', src, "h[bubble_type][say_test(message)]",MOB_LAYER+1), speech_bubble_recipients, 30)
-/mob/proc/binarycheck()
- return 0
+/mob/living/proc/say_test(var/text)
+ var/ending = copytext(text, length(text))
+ if (ending == "?")
+ return "1"
+ else if (ending == "!")
+ return "2"
+ return "0"
/mob/living/can_speak(message) //For use outside of Say()
if(can_speak_basic(message) && can_speak_vocal(message))
@@ -235,21 +268,21 @@ var/list/department_radio_keys = list(
return message
-/mob/living/proc/radio(message, message_mode, list/spans)
+/mob/living/proc/radio(message, message_mode, steps)
switch(message_mode)
if(MODE_R_HAND)
if (r_hand)
- r_hand.talk_into(src, message, , spans)
+ r_hand.talk_into(src, message)
return ITALICS | REDUCE_RANGE
if(MODE_L_HAND)
if (l_hand)
- l_hand.talk_into(src, message, , spans)
+ l_hand.talk_into(src, message)
return ITALICS | REDUCE_RANGE
if(MODE_INTERCOM)
for (var/obj/item/device/radio/intercom/I in view(1, null))
- I.talk_into(src, message, , spans)
+ I.talk_into(src, message)
return ITALICS | REDUCE_RANGE
if(MODE_BINARY)
@@ -269,10 +302,9 @@ var/list/department_radio_keys = list(
return 1
return 0
-/mob/living/say_quote(input, list/spans)
- var/tempinput = attach_spans(input, spans)
+/mob/living/say_quote()
if (stuttering)
- return "stammers, \"[tempinput]\""
+ return "stammers, \"[text]\""
if (getBrainLoss() >= 60)
- return "gibbers, \"[tempinput]\""
+ return "gibbers, \"[text]\""
return ..()
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index e03f3c5464d63..1b3b9fbe1871d 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -234,11 +234,6 @@ var/list/ai_list = list()
else
stat(null, text("Systems nonfunctional"))
-/mob/living/silicon/ai/canUseTopic()
- if(stat)
- return
- return 1
-
/mob/living/silicon/ai/proc/ai_alerts()
var/dat = "Current Station Alerts\n"
dat += "Close
"
+ if (count == 0)
+ dat += "None detected. "
+ if(4)
+ dat += {"
+
Ninja Manual:
+
Who they are:
+ Space ninjas are a special type of ninja, specifically one of the space-faring type. The vast majority of space ninjas belong to the Spider Clan, a cult-like sect, which has existed for several hundred years. The Spider Clan practice a sort of augmentation of human flesh in order to achieve a more perfect state of being and follow Postmodern Space Bushido. They also kill people for money. Their leaders are chosen from the oldest of the grand-masters, people that have lived a lot longer than any mortal man should. Being a sect of technology-loving fanatics, the Spider Clan have the very best to choose from in terms of hardware--cybernetic implants, exoskeleton rigs, hyper-capacity batteries, and you get the idea. Some believe that much of the Spider Clan equipment is based on reverse-engineered alien technology while others doubt such claims. Whatever the case, their technology is absolutely superb.
+
How they relate to other SS13 organizations:
+
+
*Nanotrasen and the Syndicate are two sides of the same coin and that coin is valuable.
+
*The Space Wizard Federation is a problem, mainly because they are an extremely dangerous group of unpredictable individuals--not to mention the wizards hate technology and are in direct opposition of the Spider Clan. Best avoided or left well-enough alone. How to battle: wizards possess several powerful abilities to steer clear off. Blind in particular is a nasty spell--jaunt away if you are blinded and never approach a wizard in melee. Stealth may also work if the wizard is not wearing thermal scanners--don't count on this. Run away if you feel threatened and await a better opportunity.
+
*Changeling Hivemind: extremely dangerous and to be killed on sight. How to battle: they will likely try to absorb you. Adrenaline boost, then phase shift into them. If you get stung, use SpiderOS to inject counter-agents. Stealth may also work but detecting a changeling is the real battle.
+
*Xeno Hivemind: their skulls make interesting kitchen decorations and are challenging to best, especially in larger nests. How to battle: they can see through your stealth guise and energy stars will not work on them. Best killed with a Phase Shift or at range. If you happen on a projectile stun weapon, use it and then close in to melee.
+
+
The reason they (you) are here:
+ Space ninjas are renowned throughout the known controlled space as fearless spies, infiltrators, and assassins. They are sent on missions of varying nature by Nanotrasen, the Syndicate, and other shady organizations and people. To hire a space ninja means serious business.
+
Their playstyle:
+ A mix of traitor, changeling, and wizard. Ninjas rely on energy, or electricity to be precise, to keep their suits running (when out of energy, a suit hibernates). Suits gain energy from objects or creatures that contain electrical charge. APCs, cell batteries, rechargers, SMES batteries, cyborgs, mechs, and exposed wires are currently supported. Through energy ninjas gain access to special powers--while all powers are tied to the ninja suit, the most useful of them are verb activated--to help them in their mission. It is a constant struggle for a ninja to remain hidden long enough to recharge the suit and accomplish their objective; despite their arsenal of abilities, ninjas can die like any other. Unlike wizards, ninjas do not possess good crowd control and are typically forced to play more subdued in order to achieve their goals. Some of their abilities are specifically designed to confuse and disorient others. With that said, it should be perfectly possible to completely flip the fuck out and rampage as a ninja.
+
Their powers:
+ There are two primary types: Equipment and Abilties. Passive effect are always on. Active effect must be turned on and remain active only when there is energy to do so. Ability costs are listed next to them.
+ Equipment: cannot be tracked by AI (passive), faster speed (passive), stealth (active), vision switch (passive if toggled), voice masking (passive), SpiderOS (passive if toggled), energy drain (passive if toggled).
+
+
Voice masking generates a random name the ninja can use over the radio and in-person. Although, the former use is recommended.
+
Toggling vision cycles to one of the following: thermal, meson, or darkness vision. The starting mode allows one to scout the identity of those in view, revealing their role. Traitors, revolutionaries, wizards, and other such people will be made known to you.
+
Stealth, when activated, drains more battery charge and works similarly to a syndicate cloak. The cloak will deactivate when most Abilities are utilized.
+
On-board AI: The suit is able to download an AI much like an intellicard. Check with SpiderOS for details once downloaded.
+
SpiderOS is a specialized, PDA-like screen that allows for a small variety of functions, such as injecting healing chemicals directly from the suit. You are using it now, if that was not already obvious. You may also download AI modules directly to the OS.
+
+ Abilities:
+
+
*Phase Shift (2000E) and Phase Jaunt (1000E) are unique powers in that they can both be used for defense and offense. Jaunt launches the ninja forward facing up to 9 squares, somewhat randomly selecting the final destination. Shift can only be used on turf in view but is precise (cannot be used on walls). Any living mob in the area teleported to is instantly gibbed (mechs are damaged, huggers and other similar critters are killed). It is possible to teleport with a target, provided you grab them before teleporting.
+
*Energy Blade (500E) is a highly effective weapon. It is summoned directly to the ninja's hand and can also function as an EMAG for certain objects (doors/lockers/etc). You may also use it to cut through walls and disabled doors. Experiment! The blade will crit humans in two hits. This item cannot be placed in containers and when dropped or thrown disappears. Having an energy blade drains more power from the battery each tick.
+
*EM Pulse (2500E) is a highly useful ability that will create an electromagnetic shockwave around the ninja, disabling technology whenever possible. If used properly it can render a security force effectively useless. Of course, getting beat up with a toolbox is not accounted for.
+
*Energy Star (500E) is a ninja star made of green energy AND coated in poison. It works by picking a random living target within range and can be spammed to great effect in incapacitating foes. Just remember that the poison used is also used by the Xeno Hivemind (and will have no effect on them).
+
*Energy Net (2000E) is a non-lethal solution to incapacitating humanoids. The net is made of non-harmful phase energy and will halt movement as long as it remains in effect--it can be destroyed. If the net is not destroyed, after a certain time it will teleport the target to a holding facility for the Spider Clan and then vanish. You will be notified if the net fails or succeeds in capturing a target in this manner. Combine with energy stars or stripping to ensure success. Abduction never looked this leet.
+
*Adrenaline Boost (1 E. Boost/3) recovers the user from stun, weakness, and paralysis. Also injects 20 units of radium into the bloodstream.
+
*Smoke Bomb (1 Sm.Bomb/10) is a weak but potentially useful ability. It creates harmful smoke and can be used in tandem with other powers to confuse enemies.
+
*???: unleash the True Ultimate Power!
+
IMPORTANT:
+
+
*Make sure to toggle Special Interaction from the Ninja Equipment menu to interact differently with certain objects.
+
*Your starting power cell can be replaced if you find one with higher maximum energy capacity by clicking on your suit with the higher capacity cell.
+
*Conserve your energy. Without it, you are very vulnerable.
+
+ That is all you will need to know. The rest will come with practice and talent. Good luck!
+
"
+ if(istype(stored_research,/list))//If there is stored research. Should be but just in case.
+ for(var/datum/tech/current_data in stored_research)
+ dat += "
"
+ dat += "[current_data.name]: [current_data.level]"
+ if(t_disk)//If there is a disk inserted. We can either write or overwrite.
+ dat += " *Copy to Disk "
+ dat += "
"
+ dat += "
"
+ dat += ""
+
+ //Setting the can>resize etc to 0 remove them from the drag bar but still allows the window to be draggable.
+ display_to << browse(dat,"window=spideros;size=400x444;border=1;can_resize=1;can_close=0;can_minimize=0")
+
+//=======//SPIDEROS TOPIC PROC//=======//
+
+/obj/item/clothing/suit/space/space_ninja/Topic(href, href_list)
+ ..()
+ var/mob/living/carbon/human/U = affecting
+ var/display_to = U
+
+
+ if(!affecting||U.stat||!s_initialized)//Check to make sure the guy is wearing the suit after clicking and it's on.
+ U << "Your suit must be worn and active to use this function."
+ U << browse(null, "window=spideros")//Closes the window.
+ return
+
+ switch(href_list["choice"])
+ if("Close")
+ display_to << browse(null, "window=spideros")
+ return
+ if("Refresh")//Refresh, goes to the end of the proc.
+ if("Return")//Return
+ if(spideros<=9)
+ spideros=0
+ else
+ spideros = round(spideros/10)//Best way to do this, flooring to nearest integer.
+
+ if("Message")
+ var/obj/item/device/pda/P = locate(href_list["target"])
+ var/t = input(U, "Please enter untraceable message.") as text
+ t = copytext(sanitize(t), 1, MAX_MESSAGE_LEN)
+ if(!t||U.stat||U.wear_suit!=src||!s_initialized)//Wow, another one of these. Man...
+ display_to << browse(null, "window=spideros")
+ return
+ if(isnull(P)||P.toff)//So it doesn't freak out if the object no-longer exists.
+ display_to << "Error: unable to deliver message."
+ display_spideros()
+ return
+ P.tnote += "← From an unknown source: [t] "
+ if (!P.silent)
+ playsound(P.loc, 'sound/machines/twobeep.ogg', 50, 1)
+ P.audible_message("\icon[P] *[P.ttone]*", null, 3)
+ P.overlays.Cut()
+ P.overlays += image('icons/obj/pda.dmi', "pda-r")
+
+ if("Inject")
+ if( (href_list["tag"]=="radium"? (reagents.get_reagent_amount("radium"))<=(a_boost*a_transfer) : !reagents.get_reagent_amount(href_list["tag"])) )//Special case for radium. If there are only a_boost*a_transfer radium units left.
+ display_to << "Error: the suit cannot perform this function. Out of [href_list["name"]]."
+ else
+ reagents.reaction(U, 2)
+ reagents.trans_id_to(U, href_list["tag"], href_list["tag"]=="nutriment"?5:a_transfer)//Nutriment is a special case since it's very potent. Shouldn't influence actual refill amounts or anything.
+ display_to << "Injecting..."
+ U << "You feel a tiny prick and a sudden rush of substance in to your veins."
+
+ if("Trigger Ability")
+ var/ability_name = href_list["name"]+href_list["cost"]//Adds the name and cost to create the full proc name.
+ var/proc_arguments//What arguments to later pass to the proc, if any.
+ var/list/targets = list()//To later check for.
+ var/safety = 0//To later make sure we're triggering the proc when needed.
+ switch(href_list["name"])//Special case.
+ if("Phase Shift")
+ safety = 1
+ for(var/turf/T in oview(5,loc))
+ targets.Add(T)
+ if("Energy Net")
+ safety = 1
+ for(var/mob/living/carbon/M in oview(5,loc))
+ targets.Add(M)
+ if(targets.len)//Let's create an argument for the proc if needed.
+ proc_arguments = pick(targets)
+ safety = 0
+ if(!safety)
+ U << "[href_list["name"]] suddenly triggered!"
+ call(src,ability_name)(proc_arguments)
+
+ if("Eject Disk")
+ var/turf/T = get_turf(loc)
+ if(!U.get_active_hand())
+ U.put_in_hands(t_disk)
+ t_disk.add_fingerprint(U)
+ t_disk = null
+ else
+ if(T)
+ t_disk.loc = T
+ t_disk = null
+ else
+ U << "ERROR: Could not eject disk."
+
+ if("Copy to Disk")
+ var/datum/tech/current_data = locate(href_list["target"])
+ U << "[current_data.name] successfully [(!t_disk.stored) ? "copied" : "overwritten"] to disk."
+ t_disk.stored = current_data
+
+
+ display_spideros()//Refreshes the screen by calling it again (which replaces current screen with new screen).
+ return
diff --git a/code/modules/ninja/suit/gloves.dm b/code/modules/ninja/suit/gloves.dm
index 13d52efec9a67..3f23ac333e2ae 100644
--- a/code/modules/ninja/suit/gloves.dm
+++ b/code/modules/ninja/suit/gloves.dm
@@ -10,16 +10,8 @@
...
I guess you're a little cool.
-Sayu
-
-
- see ninjaDrainAct.dm for ninjadrain_act()
- Touch() simply calls this on it's target now
- Ninja's electricuting people when?
- -Remie
-
*/
-
/obj/item/clothing/gloves/space_ninja
desc = "These nano-enhanced gloves insulate from electricity and provide fire resistance."
name = "ninja gloves"
@@ -36,39 +28,303 @@
var/mindrain = 200
var/maxdrain = 400
+/*
+ This runs the gamut of what ninja gloves can do
+ The other option would be a dedicated ninja touch bullshit proc on everything
+ which would probably more efficient, but ninjas are pretty rare.
+ This was mostly introduced to keep ninja code from contaminating other code;
+ with this in place it would be easier to untangle the rest of it.
+ For the drain proc, see events/ninja.dm
+*/
/obj/item/clothing/gloves/space_ninja/Touch(var/atom/A,var/proximity)
if(!candrain || draining)
return 0
- if(!istype(loc, /mob/living/carbon/human))
- return 0 //Only works while worn
-
var/mob/living/carbon/human/H = loc
-
+ if(!istype(H))
+ return 0 // what
var/obj/item/clothing/suit/space/space_ninja/suit = H.wear_suit
if(!istype(suit))
return 0
if(isturf(A))
return 0
- if(!proximity)
+ if(!proximity) // todo: you could add ninja stars or computer hacking here
return 0
A.add_fingerprint(H)
- draining = 1
- var/drained = A.ninjadrain_act(suit,H,src)
- draining = 0
+ // steal energy from powered things
+ if(istype(A,/mob/living/silicon/robot))
+ drain("CYBORG",A,suit)
+ return 1
+
+ if(istype(A, /obj/item/weapon/stock_parts/cell))
+ drain("CELL", A,suit)
+ return 1
+
+ if(istype(A,/obj/machinery/power/apc))
+ drain("APC",A,suit)
+ return 1
+
+ if(istype(A,/obj/structure/cable))
+ drain("WIRE",A,suit)
+ return 1
+
+ if(istype(A,/obj/structure/grille))
+ var/obj/structure/cable/C = locate() in A.loc
+ if(C)
+ drain("WIRE",C,suit)
+ return 1
+
+ if(istype(A,/obj/machinery/power/smes))
+ drain("SMES",A,suit)
+ return 1
+
+ if(istype(A,/obj/mecha))
+ drain("MECHA",A,suit)
+ return 1
+
+ if(istype(A,/obj/machinery/computer/rdconsole)) // download research
+ drain("RESEARCH",A,suit)
+ return 1
+
+ if(istype(A,/obj/machinery/r_n_d/server))
+ A.add_fingerprint(H)
+ var/obj/machinery/r_n_d/server/S = A
+ if(S.disabled)
+ return 1
+ if(S.shocked)
+ S.shock(H,50)
+ return 1
+ drain("RESEARCH",A,suit)
+ return 1
+
+
+/obj/item/clothing/gloves/space_ninja/proc/drain(target_type as text, target, obj/suit)
+ //Var Initialize
+ var/obj/item/clothing/suit/space/space_ninja/S = suit
+ var/mob/living/carbon/human/U = S.affecting
+ var/obj/item/clothing/gloves/space_ninja/G = S.n_gloves
+
+ var/drain = 0//To drain from battery.
+ var/maxcapacity = 0//Safety check for full battery.
+ var/totaldrain = 0//Total energy drained.
+
+ G.draining = 1
+
+ if(target_type!="RESEARCH")//I lumped research downloading here for ease of use.
+ U << "Now charging battery..."
+
+ switch(target_type)
+
+ if("APC")
+ var/obj/machinery/power/apc/A = target
+ if(A.cell&&A.cell.charge)
+ var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
+ spark_system.set_up(5, 0, A.loc)
+ while(G.candrain&&A.cell.charge>0&&!maxcapacity)
+ drain = rand(G.mindrain,G.maxdrain)
+ if(A.cell.chargeS.cell.maxcharge)
+ drain = S.cell.maxcharge-S.cell.charge
+ maxcapacity = 1//Reached maximum battery capacity.
+ if (do_after(U,10))
+ spark_system.start()
+ playsound(A.loc, "sparks", 50, 1)
+ A.cell.charge-=drain
+ S.cell.charge+=drain
+ totaldrain+=drain
+ else break
+ U << "Gained [totaldrain] energy from the APC."
+ if(!A.emagged)
+ flick("apc-spark", src)
+ A.emagged = 1
+ A.locked = 0
+ A.update_icon()
+ else
+ U << "This APC has run dry of power. You must find another source."
+
+ if("SMES")
+ var/obj/machinery/power/smes/A = target
+ if(A.charge)
+ var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
+ spark_system.set_up(5, 0, A.loc)
+ while(G.candrain&&A.charge>0&&!maxcapacity)
+ drain = rand(G.mindrain,G.maxdrain)
+ if(A.chargeS.cell.maxcharge)
+ drain = S.cell.maxcharge-S.cell.charge
+ maxcapacity = 1
+ if (do_after(U,10))
+ spark_system.start()
+ playsound(A.loc, "sparks", 50, 1)
+ A.charge-=drain
+ S.cell.charge+=drain
+ totaldrain+=drain
+ else break
+ U << "Gained [totaldrain] energy from the SMES cell."
+ else
+ U << "This SMES cell has run dry of power. You must find another source."
+
+ if("CELL")
+ var/obj/item/weapon/stock_parts/cell/A = target
+ if(A.charge)
+ if (G.candrain&&do_after(U,30))
+ U << "Gained [A.charge] energy from the cell."
+ if(S.cell.charge+A.charge>S.cell.maxcharge)
+ S.cell.charge=S.cell.maxcharge
+ else
+ S.cell.charge+=A.charge
+ A.charge = 0
+ G.draining = 0
+ A.corrupt()
+ A.updateicon()
+ else
+ U << "Procedure interrupted. Protocol terminated."
+ else
+ U << "This cell is empty and of no use."
+
+ if("MACHINERY")//Can be applied to generically to all powered machinery. I'm leaving this alone for now.
+ var/obj/machinery/A = target
+ if(A.powered())//If powered.
+
+ var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
+ spark_system.set_up(5, 0, A.loc)
+
+ var/area/A_Area = get_area(A)
+ var/obj/machinery/power/apc/B = A_Area.get_apc() //find APC
+ if(B)//If APC exists. Might not if the area is unpowered like Centcom.
+ var/datum/powernet/PN = B.terminal.powernet
+ while(G.candrain&&!maxcapacity&&!isnull(A))//And start a proc similar to drain from wire.
+ drain = rand(G.mindrain,G.maxdrain)
+ var/drained = 0
+ if(PN&&do_after(U,10))
+ drained = min(drain, PN.avail)
+ PN.load += drained
+ if(drained < drain)//if no power on net, drain apcs
+ for(var/obj/machinery/power/terminal/T in PN.nodes)
+ if(istype(T.master, /obj/machinery/power/apc))
+ var/obj/machinery/power/apc/AP = T.master
+ if(AP.operating && AP.cell && AP.cell.charge>0)
+ AP.cell.charge = max(0, AP.cell.charge - 5)
+ drained += 5
+ else break
+ S.cell.charge += drained
+ if(S.cell.charge>S.cell.maxcharge)
+ totaldrain += (drained-(S.cell.charge-S.cell.maxcharge))
+ S.cell.charge = S.cell.maxcharge
+ maxcapacity = 1
+ else
+ totaldrain += drained
+ spark_system.start()
+ if(drained==0) break
+ U << "Gained [totaldrain] energy from the power network."
+ else
+ U << "Power network could not be found. Aborting."
+ else
+ U << "This recharger is not providing energy. You must find another source."
+
+ if("RESEARCH")
+ var/obj/machinery/A = target
+ U << "Hacking \the [A]..."
+ spawn(0)
+ var/turf/location = get_turf(U)
+ for(var/mob/living/silicon/ai/AI in player_list)
+ AI << "Network Alert: Hacking attempt detected[location?" in [location]":". Unable to pinpoint location"]."
+ if(A:files&&A:files.known_tech.len)
+ for(var/datum/tech/current_data in S.stored_research)
+ U << "Checking \the [current_data.name] database."
+ if(do_after(U, S.s_delay)&&G.candrain&&!isnull(A))
+ for(var/datum/tech/analyzing_data in A:files.known_tech)
+ if(current_data.id==analyzing_data.id)
+ if(analyzing_data.level>current_data.level)
+ U << "Database:UPDATED."
+ current_data.level = analyzing_data.level
+ break//Move on to next.
+ else break//Otherwise, quit processing.
+ U << "Data analyzed. Process finished."
+
+ if("WIRE")
+ var/obj/structure/cable/A = target
+ var/datum/powernet/PN = A.powernet
+ while(G.candrain&&!maxcapacity&&!isnull(A))
+ drain = (round((rand(G.mindrain,G.maxdrain))/2))
+ var/drained = 0
+ if(PN&&do_after(U,10))
+ drained = min(drain, PN.avail)
+ PN.load += drained
+ if(drained < drain)//if no power on net, drain apcs
+ for(var/obj/machinery/power/terminal/T in PN.nodes)
+ if(istype(T.master, /obj/machinery/power/apc))
+ var/obj/machinery/power/apc/AP = T.master
+ if(AP.operating && AP.cell && AP.cell.charge>0)
+ AP.cell.charge = max(0, AP.cell.charge - 5)
+ drained += 5
+ else break
+ S.cell.charge += drained
+ if(S.cell.charge>S.cell.maxcharge)
+ totaldrain += (drained-(S.cell.charge-S.cell.maxcharge))
+ S.cell.charge = S.cell.maxcharge
+ maxcapacity = 1
+ else
+ totaldrain += drained
+ S.spark_system.start()
+ if(drained==0) break
+ U << "Gained [totaldrain] energy from the power network."
+
+ if("MECHA")
+ var/obj/mecha/A = target
+ A.occupant_message("Warning: Unauthorized access through sub-route 4, block H, detected.")
+ if(A.get_charge())
+ while(G.candrain&&A.cell.charge>0&&!maxcapacity)
+ drain = rand(G.mindrain,G.maxdrain)
+ if(A.cell.chargeS.cell.maxcharge)
+ drain = S.cell.maxcharge-S.cell.charge
+ maxcapacity = 1
+ if (do_after(U,10))
+ A.spark_system.start()
+ playsound(A.loc, "sparks", 50, 1)
+ A.cell.use(drain)
+ S.cell.charge+=drain
+ totaldrain+=drain
+ else break
+ U << "Gained [totaldrain] energy from [src]."
+ else
+ U << "The exosuit's battery has run dry. You must find another source of power."
+
+ if("CYBORG")
+ var/mob/living/silicon/robot/A = target
+ A << "Warning: Unauthorized access through sub-route 12, block C, detected."
+ G.draining = 1
+ if(A.cell&&A.cell.charge)
+ while(G.candrain&&A.cell.charge>0&&!maxcapacity)
+ drain = rand(G.mindrain,G.maxdrain)
+ if(A.cell.chargeS.cell.maxcharge)
+ drain = S.cell.maxcharge-S.cell.charge
+ maxcapacity = 1
+ if (do_after(U,10))
+ A.spark_system.start()
+ playsound(A.loc, "sparks", 50, 1)
+ A.cell.charge-=drain
+ S.cell.charge+=drain
+ totaldrain+=drain
+ else break
+ U << "Gained [totaldrain] energy from [A]."
+ else
+ U << "Their battery has run dry of power. You must find another source."
+
+ else//Else nothing :<
- if(isnum(drained)) //Numerical values of drained handle their feedback here, Alpha values handle it themselves (Research hacking)
- if(drained)
- H << "Gained [drained] energy from \the [A]."
- else
- H << "\The [A] has run dry of power, you must find another source!"
- else
- drained = 0 //as to not cancel attack_hand()
+ G.draining = 0
- return drained
+ return
/obj/item/clothing/gloves/space_ninja/proc/toggled()
diff --git a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
index ed6c723626785..86d1cc128f82f 100644
--- a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm
@@ -39,9 +39,6 @@ It is possible to destroy the net by the occupant or someone else.
var/check = 30//30 seconds before teleportation. Could be extended I guess.
var/mob_name = affecting.name//Since they will report as null if terminated before teleport.
//The person can still try and attack the net when inside.
-
- M.notransform = 1 //No moving for you!
-
while(!isnull(M)&&!isnull(src)&&check>0)//While M and net exist, and 30 seconds have not passed.
check--
sleep(10)
@@ -50,7 +47,6 @@ It is possible to destroy the net by the occupant or someone else.
if(!isnull(master))//As long as they still exist.
master << "ERROR: unable to locate \the [mob_name]. Procedure terminated."
qdel(src)//Get rid of the net.
- M.notransform = 0
return
if(!isnull(src))//As long as both net and person exist.
@@ -86,11 +82,11 @@ It is possible to destroy the net by the occupant or someone else.
if(!isnull(master))//As long as they still exist.
master << "SUCCESS: transport procedure of \the [affecting] complete."
- M.notransform = 0
+
+ M.anchored = 0//Important.
else//And they are free.
M << "You are free of the net!"
- M.notransform = 0
return
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
index 428f417ca44e2..0a28094ca914e 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
@@ -16,6 +16,7 @@
return
spawn(0)
H.Beam(C,"n_beam",,15)
+ C.anchored = 1//Anchors them so they can't move.
H.say("Get over here!")
var/obj/effect/energy_net/E = new /obj/effect/energy_net(C.loc)
E.layer = C.layer+1//To have it appear one layer above the mob.
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm
index aef3d012dd88d..8d2ff7c3cfec1 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm
@@ -9,11 +9,11 @@
if(!ninjacost(0,N_SMOKE_BOMB))
var/mob/living/carbon/human/H = affecting
+ H << "There are [s_bombs] smoke bombs remaining."
var/datum/effect/effect/system/bad_smoke_spread/smoke = new /datum/effect/effect/system/bad_smoke_spread()
smoke.set_up(10, 0, H.loc)
smoke.start()
playsound(H.loc, 'sound/effects/bamf.ogg', 50, 2)
s_bombs--
- H << "There are [s_bombs] smoke bombs remaining."
s_coold = 1
return
\ No newline at end of file
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm
index 1fa003fa76aba..9196ed92be775 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_stars.dm
@@ -1,23 +1,33 @@
-//Creates a throwing star
+//Shoots ninja stars at a random target
/obj/item/clothing/suit/space/space_ninja/proc/ninjastar()
- set name = "Create Throwing Stars (1E)"
- set desc = "Creates some throwing stars"
+ set name = "Energy Star (5E)"
+ set desc = "Launches an energy star at a random living target."
set category = "Ninja Ability"
set popup_menu = 0
- if(!ninjacost(10))
+ if(!ninjacost(50))
var/mob/living/carbon/human/H = affecting
- var/slot = H.hand ? slot_l_hand : slot_r_hand
+ var/list/targets = list()
+ for(var/mob/living/M in oview(loc))
+ if(M.stat) continue//Doesn't target corpses or paralyzed persons.
+ targets.Add(M)
+ if(targets.len)
+ var/mob/living/target=pick(targets)//The point here is to pick a random, living mob in oview to shoot stuff at.
- if(H.equip_to_slot_or_del(new /obj/item/weapon/throwing_star/ninja(H), slot))
- H << "A throwing star has been created in your hand!"
+ var/turf/curloc = get_turf(H)
+ var/turf/targloc = get_turf(target)
+ if (!targloc || !curloc)
+ return
+ if (targloc == curloc)
+ return
+ var/obj/item/projectile/energy/dart/A = new /obj/item/projectile/energy/dart(curloc)
+ A.current = curloc
+ A.yo = targloc.y - curloc.y
+ A.xo = targloc.x - curloc.x
- H.throw_mode_on() //So they can quickly throw it.
-
-
-/obj/item/weapon/throwing_star/ninja
- name = "ninja throwing star"
- throwforce = 30
- embedded_pain_multiplier = 6
+ A.fire()
+ else
+ H << "There are no targets in view."
+ return
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_sword_recall.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_sword_recall.dm
deleted file mode 100644
index c117cd40d8e4b..0000000000000
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_sword_recall.dm
+++ /dev/null
@@ -1,48 +0,0 @@
-
-/obj/item/clothing/suit/space/space_ninja/proc/ninja_sword_recall()
- set name = "Recall Energy Katana (Variable Cost)"
- set desc = "Teleports the Energy Katana linked to this suit to it's wearer, cost based on distance."
- set category = "Ninja Ability"
- set popup_menu = 0
-
- var/mob/living/carbon/human/H = affecting
-
- var/cost = 0
- var/inview = 1
-
- if(!energyKatana)
- H << "Could not locate Energy Katana!"
- return
-
- if(energyKatana in H)
- return
-
- var/distance = get_dist(H,energyKatana)
-
- if(!(energyKatana in view(H)))
- cost = distance //Actual cost is cost x 10, so 5 turfs is 50 cost.
- inview = 0
-
- if(!ninjacost(cost))
- if(istype(energyKatana.loc, /mob/living/carbon))
- var/mob/living/carbon/C = energyKatana.loc
- C.unEquip(energyKatana)
-
- //Somebody swollowed my sword, probably the clown doing a circus act.
- if(energyKatana in C.stomach_contents)
- C.stomach_contents -= energyKatana
-
- if(energyKatana in C.internal_organs)
- C.internal_organs -= energyKatana
-
- energyKatana.loc = get_turf(energyKatana)
-
- if(inview) //If we can see the katana, throw it towards ourselves, damaging people as we go.
- energyKatana.spark_system.start()
- playsound(H, "sparks", 50, 1)
- H.visible_message("\the [energyKatana] flies towards [H]!","You hold out your hand and \the [energyKatana] flies towards you!")
- energyKatana.throw_at(H, distance+1, energyKatana.throw_speed)
-
- else //Else just TP it to us.
- energyKatana.returnToOwner(H,1)
-
diff --git a/code/modules/ninja/suit/ninjaDrainAct.dm b/code/modules/ninja/suit/ninjaDrainAct.dm
deleted file mode 100644
index 71f729da24983..0000000000000
--- a/code/modules/ninja/suit/ninjaDrainAct.dm
+++ /dev/null
@@ -1,285 +0,0 @@
-
-/*
-
-Contents:
-- Assorted ninjadrain_act() procs
-- What is Object Oriented Programming
-
-They *could* go in their appropriate files, but this is supposed to be modular
-
-*/
-
-
-//Needs to return the amount drained from the atom, if no drain on a power object, return 0, otherwise, return a define.
-/atom/proc/ninjadrain_act()
- return INVALID_DRAIN
-
-
-
-
-//APC//
-/obj/machinery/power/apc/ninjadrain_act(var/obj/item/clothing/suit/space/space_ninja/S, var/mob/living/carbon/human/H, var/obj/item/clothing/gloves/space_ninja/G)
- if(!S || !H || !G)
- return INVALID_DRAIN
-
- var/maxcapacity = 0 //Safety check for batteries
- var/drain = 0 //Drain amount from batteries
-
- . = 0
-
- if(cell && cell.charge)
- var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
- spark_system.set_up(5, 0, loc)
-
- while(G.candrain && cell.charge> 0 && !maxcapacity)
- drain = rand(G.mindrain, G.maxdrain)
-
- if(cell.charge < drain)
- drain = cell.charge
-
- if(S.cell.charge + drain > S.cell.maxcharge)
- drain = S.cell.maxcharge - S.cell.charge
- maxcapacity = 1//Reached maximum battery capacity.
-
- if (do_after(H,10))
- spark_system.start()
- playsound(loc, "sparks", 50, 1)
- cell.charge -= drain
- S.cell.charge += drain
- . += drain
- else
- break
-
- if(!emagged)
- flick("apc-spark", G)
- emagged = 1
- locked = 0
- update_icon()
-
-
-
-
-
-//SMES//
-/obj/machinery/power/smes/ninjadrain_act(var/obj/item/clothing/suit/space/space_ninja/S, var/mob/living/carbon/human/H, var/obj/item/clothing/gloves/space_ninja/G)
- if(!S || !H || !G)
- return INVALID_DRAIN
-
- var/maxcapacity = 0 //Safety check for batteries
- var/drain = 0 //Drain amount from batteries
-
- . = 0
-
- if(charge)
- var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
- spark_system.set_up(5, 0, loc)
-
- while(G.candrain && charge > 0 && !maxcapacity)
- drain = rand(G.mindrain, G.maxdrain)
-
- if(charge < drain)
- drain = charge
-
- if(S.cell.charge + drain > S.cell.maxcharge)
- drain = S.cell.maxcharge - S.cell.charge
- maxcapacity = 1
-
- if (do_after(H,10))
- spark_system.start()
- playsound(loc, "sparks", 50, 1)
- charge -= drain
- S.cell.charge += drain
- . += drain
-
- else
- break
-
-
-//CELL//
-/obj/item/weapon/stock_parts/cell/ninjadrain_act(var/obj/item/clothing/suit/space/space_ninja/S, var/mob/living/carbon/human/H, var/obj/item/clothing/gloves/space_ninja/G)
- if(!S || !H || !G)
- return INVALID_DRAIN
-
- . = 0
-
- if(charge)
- if(G.candrain && do_after(H,30))
- . = charge
- if(S.cell.charge + charge > S.cell.maxcharge)
- S.cell.charge = S.cell.maxcharge
- else
- S.cell.charge += charge
- charge = 0
- corrupt()
- updateicon()
-
-
-//RDCONSOLE//
-/obj/machinery/computer/rdconsole/ninjadrain_act(var/obj/item/clothing/suit/space/space_ninja/S, var/mob/living/carbon/human/H, var/obj/item/clothing/gloves/space_ninja/G)
- if(!S || !H || !G)
- return INVALID_DRAIN
-
- . = DRAIN_RD_HACK_FAILED
-
- H << "Hacking \the [src]..."
- spawn(0)
- var/turf/location = get_turf(H)
- for(var/mob/living/silicon/ai/AI in player_list)
- AI << "Network Alert: Hacking attempt detected[location?" in [location]":". Unable to pinpoint location"]."
-
- if(files && files.known_tech.len)
- for(var/datum/tech/current_data in S.stored_research)
- H << "Checking \the [current_data.name] database."
- if(do_after(H, S.s_delay) && G.candrain && src)
- for(var/datum/tech/analyzing_data in files.known_tech)
- if(current_data.id == analyzing_data.id)
- if(analyzing_data.level > current_data.level)
- H << "Database:UPDATED."
- current_data.level = analyzing_data.level
- . = DRAIN_RD_HACKED
- break//Move on to next.
- else
- break//Otherwise, quit processing.
-
- H << "Data analyzed. Process finished."
-
-
-//RD SERVER//
-//Shamelessly copypasted from above, since these two used to be the same proc, but with MANY colon operators
-/obj/machinery/r_n_d/server/ninjadrain_act(var/obj/item/clothing/suit/space/space_ninja/S, var/mob/living/carbon/human/H, var/obj/item/clothing/gloves/space_ninja/G)
- if(!S || !H || !G)
- return INVALID_DRAIN
-
- . = DRAIN_RD_HACK_FAILED
-
- H << "Hacking \the [src]..."
- spawn(0)
- var/turf/location = get_turf(H)
- for(var/mob/living/silicon/ai/AI in player_list)
- AI << "Network Alert: Hacking attempt detected[location?" in [location]":". Unable to pinpoint location"]."
-
- if(files && files.known_tech.len)
- for(var/datum/tech/current_data in S.stored_research)
- H << "Checking \the [current_data.name] database."
- if(do_after(H, S.s_delay) && G.candrain && src)
- for(var/datum/tech/analyzing_data in files.known_tech)
- if(current_data.id == analyzing_data.id)
- if(analyzing_data.level > current_data.level)
- H << "Database:UPDATED."
- current_data.level = analyzing_data.level
- . = DRAIN_RD_HACKED
- break//Move on to next.
- else
- break//Otherwise, quit processing.
-
- H << "Data analyzed. Process finished."
-
-
-//WIRE//
-/obj/structure/cable/ninjadrain_act(var/obj/item/clothing/suit/space/space_ninja/S, var/mob/living/carbon/human/H, var/obj/item/clothing/gloves/space_ninja/G)
- if(!S || !H || !G)
- return INVALID_DRAIN
-
- var/maxcapacity = 0 //Safety check
- var/drain = 0 //Drain amount
-
- . = 0
-
- var/datum/powernet/PN = powernet
- while(G.candrain && !maxcapacity && src)
- drain = (round((rand(G.mindrain, G.maxdrain))/2))
- var/drained = 0
- if(PN && do_after(H,10))
- drained = min(drain, PN.avail)
- PN.load += drained
- if(drained < drain)//if no power on net, drain apcs
- for(var/obj/machinery/power/terminal/T in PN.nodes)
- if(istype(T.master, /obj/machinery/power/apc))
- var/obj/machinery/power/apc/AP = T.master
- if(AP.operating && AP.cell && AP.cell.charge > 0)
- AP.cell.charge = max(0, AP.cell.charge - 5)
- drained += 5
- else
- break
-
- S.cell.charge += drained
- if(S.cell.charge > S.cell.maxcharge)
- . += (drained-(S.cell.charge - S.cell.maxcharge))
- S.cell.charge = S.cell.maxcharge
- maxcapacity = 1
- else
- . += drained
- S.spark_system.start()
-
-//MECH//
-/obj/mecha/ninjadrain_act(var/obj/item/clothing/suit/space/space_ninja/S, var/mob/living/carbon/human/H, var/obj/item/clothing/gloves/space_ninja/G)
- if(!S || !H || !G)
- return INVALID_DRAIN
-
- var/maxcapacity = 0 //Safety check
- var/drain = 0 //Drain amount
- . = 0
-
- occupant_message("Warning: Unauthorized access through sub-route 4, block H, detected.")
- if(get_charge())
- while(G.candrain && cell.charge > 0 && !maxcapacity)
- drain = rand(G.mindrain,G.maxdrain)
- if(cell.charge < drain)
- drain = cell.charge
- if(S.cell.charge + drain > S.cell.maxcharge)
- drain = S.cell.maxcharge - S.cell.charge
- maxcapacity = 1
- if (do_after(H,10))
- spark_system.start()
- playsound(loc, "sparks", 50, 1)
- cell.use(drain)
- S.cell.charge += drain
- . += drain
- else
- break
-
-//BORG//
-/mob/living/silicon/robot/ninjadrain_act(var/obj/item/clothing/suit/space/space_ninja/S, var/mob/living/carbon/human/H, var/obj/item/clothing/gloves/space_ninja/G)
- if(!S || !H || !G)
- return INVALID_DRAIN
-
- var/maxcapacity = 0 //Safety check
- var/drain = 0 //Drain amount
- . = 0
-
- src << "Warning: Unauthorized access through sub-route 12, block C, detected."
-
- if(cell && cell.charge)
- while(G.candrain && cell.charge > 0 && !maxcapacity)
- drain = rand(G.mindrain,G.maxdrain)
- if(cell.charge < drain)
- drain = cell.charge
- if(S.cell.charge+drain > S.cell.maxcharge)
- drain = S.cell.maxcharge - S.cell.charge
- maxcapacity = 1
- if (do_after(H,10))
- spark_system.start()
- playsound(loc, "sparks", 50, 1)
- cell.charge -= drain
- S.cell.charge += drain
- . += drain
- else
- break
-
-
-//CARBON MOBS//
-/mob/living/carbon/ninjadrain_act(var/obj/item/clothing/suit/space/space_ninja/S, var/mob/living/carbon/human/H, var/obj/item/clothing/gloves/space_ninja/G)
- if(!S || !H || !G)
- return INVALID_DRAIN
-
- . = DRAIN_MOB_SHOCK_FAILED
-
- //Default cell = 10,000 charge, 10,000/1000 = 10 uses without charging/upgrading
- if(S.cell && S.cell.charge && S.cell.use(1000))
- . = DRAIN_MOB_SHOCK
- //Got that electric touch
- var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
- spark_system.set_up(5, 0, loc)
- playsound(src, "sparks", 50, 1)
- visible_message("[H] electrocutes [src] with their touch!", "[H] electrocutes you with their touch!")
- electrocute_act(25, H)
diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm
index a1273f1049811..cfe6dc3c80767 100644
--- a/code/modules/ninja/suit/suit.dm
+++ b/code/modules/ninja/suit/suit.dm
@@ -29,7 +29,6 @@ Contents:
var/list/reagent_list = list("omnizine","salbutamol","spaceacillin","charcoal","nutriment","radium","potass_iodide")//The reagents ids which are added to the suit at New().
var/list/stored_research = list()//For stealing station research.
var/obj/item/weapon/disk/tech_disk/t_disk//To copy design onto disk.
- var/obj/item/weapon/katana/energy/energyKatana //For teleporting the katana back to the ninja (It's an ability)
//Other articles of ninja gear worn together, used to easily reference them after initializing.
var/obj/item/clothing/head/helmet/space/space_ninja/n_hood
diff --git a/code/modules/ninja/suit/suit_attackby.dm b/code/modules/ninja/suit/suit_attackby.dm
index a2683d39d8ccf..e7098179d6a2e 100644
--- a/code/modules/ninja/suit/suit_attackby.dm
+++ b/code/modules/ninja/suit/suit_attackby.dm
@@ -20,7 +20,7 @@
return
else if(istype(I, /obj/item/weapon/stock_parts/cell))
- var/obj/item/weapon/stock_parts/cell/CELL = I
+ var/obj/item/weapon/stock_parts/cell/CELL
if(CELL.maxcharge > cell.maxcharge && n_gloves && n_gloves.candrain)
U << "Higher maximum capacity detected.\nUpgrading..."
if (n_gloves && n_gloves.candrain && do_after(U,s_delay))
diff --git a/code/modules/ninja/suit/suit_verbs_handlers.dm b/code/modules/ninja/suit/suit_verbs_handlers.dm
index 24797a272b0f5..17ba1ca3910c7 100644
--- a/code/modules/ninja/suit/suit_verbs_handlers.dm
+++ b/code/modules/ninja/suit/suit_verbs_handlers.dm
@@ -11,6 +11,7 @@ Contents:
/obj/item/clothing/suit/space/space_ninja/proc/grant_equip_verbs()
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/init
verbs += /obj/item/clothing/suit/space/space_ninja/proc/deinit
+ verbs += /obj/item/clothing/suit/space/space_ninja/proc/spideros
verbs += /obj/item/clothing/suit/space/space_ninja/proc/stealth
n_gloves.verbs += /obj/item/clothing/gloves/space_ninja/proc/toggled
@@ -20,6 +21,7 @@ Contents:
/obj/item/clothing/suit/space/space_ninja/proc/remove_equip_verbs()
verbs += /obj/item/clothing/suit/space/space_ninja/proc/init
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/deinit
+ verbs -= /obj/item/clothing/suit/space/space_ninja/proc/spideros
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/stealth
if(n_gloves)
n_gloves.verbs -= /obj/item/clothing/gloves/space_ninja/proc/toggled
@@ -35,7 +37,6 @@ Contents:
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjastar
verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninjanet
- verbs += /obj/item/clothing/suit/space/space_ninja/proc/ninja_sword_recall
s_initialized=1
slowdown=0
@@ -49,4 +50,3 @@ Contents:
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjapulse
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjastar
verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninjanet
- verbs -= /obj/item/clothing/suit/space/space_ninja/proc/ninja_sword_recall
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index cf006b775ccf9..5d4d98b84a826 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -81,7 +81,7 @@
/obj/item/weapon/paper/attack_self(mob/user)
user.examinate(src)
- if(rigged && (SSevent.holidays && SSevent.holidays[APRIL_FOOLS]))
+ if(rigged && (SSevent.holiday == "April Fool's Day"))
if(spam_flag == 0)
spam_flag = 1
playsound(loc, 'sound/items/bikehorn.ogg', 50, 1)
diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm
index a26c0497223ab..248f36b8967f6 100644
--- a/code/modules/paperwork/paperbin.dm
+++ b/code/modules/paperwork/paperbin.dm
@@ -47,7 +47,7 @@
papers.Remove(P)
else
P = new /obj/item/weapon/paper
- if(SSevent.holidays && SSevent.holidays[APRIL_FOOLS])
+ if(SSevent.holiday == "April Fool's Day")
if(prob(30))
P.info = "HONK HONK HONK HONK HONK HONK HONK HOOOOOOOOOOOOOOOOOOOOOONK APRIL FOOLS"
P.rigged = 1
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index 75303ca55c596..abde18761911b 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -70,58 +70,6 @@
/obj/item/weapon/pen/sleepy/New()
create_reagents(55)
- reagents.add_reagent("morphine", 30)
+ reagents.add_reagent("zombiepowder", 5)
reagents.add_reagent("mutetoxin", 15)
- reagents.add_reagent("tirizene", 10)
..()
-
-/*
- * Gang Boss Pens
- */
-/obj/item/weapon/pen/gang
- origin_tech = "materials=2;syndicate=5"
- var/cooldown
-
-/obj/item/weapon/pen/gang/attack(mob/living/M, mob/user)
- if(!istype(M)) return
- if(..())
- if(ishuman(M) && ishuman(user) && M.stat != DEAD)
- if(user.mind && ((user.mind in ticker.mode.A_bosses) || (user.mind in ticker.mode.B_bosses)))
- if(cooldown)
- user << "[src] needs more time to recharge before it can be used."
- return
- if(M.client)
- M.mind_initialize() //give them a mind datum if they don't have one.
- if(user.mind in ticker.mode.A_bosses)
- if(ticker.mode.add_gangster(M.mind,"A"))
- M.Paralyse(5)
- M.Jitter(500)
- cooldown(ticker.mode.A_gang.len, )
- spawn(40)
- M.jitteriness -= 490
- else
- user << "This mind is resistant to recruitment!"
- else if(user.mind in ticker.mode.B_bosses)
- if(ticker.mode.add_gangster(M.mind,"B"))
- M.Paralyse(5)
- M.Jitter(500)
- cooldown(ticker.mode.B_gang.len)
- spawn(40)
- M.jitteriness -= 490
- else
- user << "This mind is resistant to recruitment!"
- else
- user << "This mind is so vacant that it is not susceptible to influence!"
-
-/obj/item/weapon/pen/gang/proc/cooldown(modifier)
- if(!modifier)
- return
- cooldown = 1
- icon_state = "pen_blink"
- //The more gang members there are the longer the cooldown will be
- var/time = 500 + (100 * modifier) //50 seconds + 10 seconds for every member in the gang
- spawn(time)
- cooldown = 0
- icon_state = "pen"
- var/mob/M = get(src, /mob)
- M << "\icon[src] [src][(src.loc == M)?(""):(" in your [src.loc]")] vibrates softly."
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index 95220c1e344b1..6822c9b65f49d 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -190,7 +190,7 @@
var/datum/picture/selection
var/mob/living/silicon/ai/tempAI = usr
if(tempAI.aicamera.aipictures.len == 0)
- usr << "No images saved"
+ usr << "No images saved"
return
for(var/datum/picture/t in tempAI.aicamera.aipictures)
nametemp += t.fields["name"]
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index a759a817464c9..f24dc00964382 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -336,7 +336,7 @@ obj/item/device/camera/siliconcam/proc/selectpicture(var/obj/item/device/camera/
var/list/nametemp = list()
var/find
if(targetloc.aipictures.len == 0)
- usr << "No images saved"
+ usr << "No images saved"
return
for(var/datum/picture/t in targetloc.aipictures)
nametemp += t.fields["name"]
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 10054d21e5208..ad6c46d0540d9 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -627,7 +627,7 @@ obj/structure/cable/proc/avail()
if(!isturf(user.loc))
return
- if(!T.can_have_cabling())
+ if(!T.cancable)
user << "You can only lay cables on catwalks and plating!"
return
@@ -639,6 +639,10 @@ obj/structure/cable/proc/avail()
user << "You can't lay cable at a place that far away."
return
+ if(T.intact) // Ff floor is intact, complain
+ user << "You can't lay cable there unless the floor tiles are removed."
+ return
+
else
var/dirn
@@ -702,7 +706,7 @@ obj/structure/cable/proc/avail()
// one end of the clicked cable is pointing towards us
if(C.d1 == dirn || C.d2 == dirn)
- if(!U.can_have_cabling()) //checking if it's a plating or catwalk
+ if(!U.cancable) //checking if it's a plating or catwalk
user << "You can only lay cables on catwalks and plating!"
return
if(U.intact) //can't place a cable if it's a plating with a tile on it
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index 43b649fb5cd5a..61d2bb8a9f666 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -347,7 +347,7 @@ var/const/GRAV_NEEDS_WRENCH = 3
/obj/machinery/gravity_generator/main/proc/pulse_radiation()
for(var/mob/living/L in view(7, src))
- L.irradiate(20)
+ L.apply_effect(20, IRRADIATE)
// Shake everyone on the z level to let them know that gravity was enagaged/disenagaged.
/obj/machinery/gravity_generator/main/proc/shake_everyone()
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 89642e298381f..31e2944aa969d 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -277,7 +277,7 @@
update_icon()
if(on)
- if(!light || light.radius != brightness)
+ if(luminosity != brightness)
switchcount++
if(rigged)
if(status == LIGHT_OK && trigger)
@@ -295,11 +295,11 @@
use_power = 1
SetLuminosity(0)
- active_power_usage = (brightness * 10)
+ active_power_usage = (luminosity * 10)
if(on != on_gs)
on_gs = on
if(on)
- static_power_used = brightness * 20 //20W per unit luminosity
+ static_power_used = luminosity * 20 //20W per unit luminosity
addStaticPower(static_power_used, STATIC_LIGHT)
else
removeStaticPower(static_power_used, STATIC_LIGHT)
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index 36936dfdc80f5..d7554e0cbb687 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -464,7 +464,7 @@
// return a knot cable (O-X) if one is present in the turf
// null if there's none
/turf/proc/get_cable_node()
- if(!can_have_cabling())
+ if(!istype(src, /turf/simulated/floor))
return null
for(var/obj/structure/cable/C in src)
if(C.d1 == 0)
@@ -475,4 +475,4 @@
for(var/area/RA in src.related)
var/obj/machinery/power/apc/FINDME = locate() in RA
if (FINDME)
- return FINDME
+ return FINDME
\ No newline at end of file
diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm
index 1d86b12c94483..c502e814eff63 100644
--- a/code/modules/power/singularity/narsie.dm
+++ b/code/modules/power/singularity/narsie.dm
@@ -42,7 +42,7 @@
user << "Your soul is too far away."
return
makeNewConstruct(/mob/living/simple_animal/construct/harvester, user, null, 1)
- PoolOrNew(/obj/effect/effect/sleep_smoke, user.loc)
+ new /obj/effect/effect/sleep_smoke(user.loc)
/obj/singularity/narsie/process()
diff --git a/code/modules/power/singularity/particle_accelerator/particle.dm b/code/modules/power/singularity/particle_accelerator/particle.dm
index e7e3632b93e3f..ed5d1f760d2f1 100644
--- a/code/modules/power/singularity/particle_accelerator/particle.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle.dm
@@ -56,8 +56,16 @@
/obj/effect/accelerated_particle/proc/toxmob(var/mob/living/M)
- M.irradiate(energy*6)
+/* var/radiation = (energy*2) //We don't need to do two multiplications and a single goddamn
+ if(istype(M,/mob/living/carbon/human))
+ if(M:wear_suit) //TODO: check for radiation protection
+ radiation = round(radiation/2,1)
+ if(istype(M,/mob/living/carbon/monkey))
+ if(M:wear_suit) //TODO: check for radiation protection
+ radiation = round(radiation/2,1)*/
+ M.apply_effect((energy*6),IRRADIATE,0)
M.updatehealth()
+ //M << "\red You feel odd."
return
diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm
index 85d8089d926bd..5d193e714e0c7 100644
--- a/code/modules/power/singularity/singularity.dm
+++ b/code/modules/power/singularity/singularity.dm
@@ -25,7 +25,7 @@
var/target = null //its target. moves towards the target if it has one
var/last_failed_movement = 0//Will not move in the same dir if it couldnt before, will help with the getting stuck on fields thing
var/last_warning
- allow_spin = 0
+
/obj/singularity/New(loc, var/starting_energy = 50, var/temp = 0)
//CARN: admin-alert for chuckle-fuckery.
admin_investigate_setup()
@@ -56,8 +56,8 @@
consume(user)
return 1
-/obj/singularity/Process_Spacemove() //The singularity stops drifting for no man!
- return 0
+/obj/singularity/Process_Spacemove()
+ return 1
/obj/singularity/blob_act(severity)
return
@@ -237,6 +237,11 @@
if(!move_self)
return 0
+ // Don't move every tick because lag
+ if(prob(50))
+ return 0
+
+
var/movement_dir = pick(alldirs - last_failed_movement)
if(force_move)
@@ -341,7 +346,7 @@
radiation = round(((src.energy-150)/50)*5,1)
radiationmin = round((radiation/5),1)//
for(var/mob/living/M in view(toxrange, src.loc))
- M.irradiate(rand(radiationmin,radiation))
+ M.apply_effect(rand(radiationmin,radiation), IRRADIATE)
toxdamage = (toxdamage - (toxdamage*M.getarmor(null, "rad")))
M.apply_effect(toxdamage, TOX)
return
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 6e926c209f92a..6152f0e07ab12 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -119,7 +119,7 @@
var/mob/living/carbon/human/H = mob
H.hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) )
var/rads = DETONATION_RADS * sqrt( 1 / (get_dist(mob, src) + 1) )
- mob.irradiate(rads)
+ mob.apply_effect(rads, IRRADIATE)
explode()
@@ -181,7 +181,7 @@
for(var/mob/living/l in range(src, round((power / 100) ** 0.25)))
var/rads = (power / 10) * sqrt( 1 / max(get_dist(l, src),1) )
- l.irradiate(rads)
+ l.apply_effect(rads, IRRADIATE)
power -= (power/500)**3
@@ -248,7 +248,7 @@
playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, 1)
- user.irradiate(150)
+ user.apply_effect(150, IRRADIATE)
/obj/machinery/power/supermatter_shard/Bumped(atom/AM as mob|obj)
@@ -283,7 +283,7 @@
//Some poor sod got eaten, go ahead and irradiate people nearby.
for(var/mob/living/L in range(10))
var/rads = 500 * sqrt( 1 / (get_dist(L, src) + 1) )
- L.irradiate(rads)
+ L.apply_effect(rads, IRRADIATE)
investigate_log("has irradiated [L] after consuming [AM].", "supermatter")
if(L in view())
L.show_message("As \the [src] slowly stops resonating, you find your skin covered in new radiation burns.", 1,\
diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm
index 5ff242be8aa67..8793962e77fe7 100644
--- a/code/modules/projectiles/ammunition.dm
+++ b/code/modules/projectiles/ammunition.dm
@@ -34,25 +34,6 @@
BB = new projectile_type(src)
return
-/obj/item/ammo_casing/attackby(obj/item/ammo_box/box as obj, mob/user as mob, params)
- if (!istype(box, /obj/item/ammo_box))
- return
- if(isturf(src.loc))
- var/boolets = 0
- for(var/obj/item/ammo_casing/bullet in src.loc)
- if (box.stored_ammo.len >= box.max_ammo)
- break
- if (bullet.BB)
- if (box.give_round(bullet, 0))
- boolets++
- else
- continue
- if (boolets > 0)
- box.update_icon()
- user << "You collect [boolets] shell\s. [box] now contains [box.stored_ammo.len] shell\s."
- else
- user << "You fail to collect anything."
-
//Boxes of ammo
/obj/item/ammo_box
name = "ammo box (null_reference_exception)"
@@ -74,6 +55,7 @@
var/caliber
var/multiload = 1
+
/obj/item/ammo_box/New()
for(var/i = 1, i <= max_ammo, i++)
stored_ammo += new ammo_type(src)
@@ -90,8 +72,7 @@
return b
/obj/item/ammo_box/proc/give_round(var/obj/item/ammo_casing/R, var/replace_spent = 0)
- // Boxes don't have a caliber type, magazines do. Not sure if it's intended or not, but if we fail to find a caliber, then we fall back to ammo_type.
- if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type))
+ if(!R || (R.caliber != caliber))
return 0
if (stored_ammo.len < max_ammo)
diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm
index e26c9b31e92ba..00cda09da838a 100644
--- a/code/modules/projectiles/ammunition/ammo_casings.dm
+++ b/code/modules/projectiles/ammunition/ammo_casings.dm
@@ -61,28 +61,13 @@
/obj/item/ammo_casing/shotgun/improvised
name = "improvised shell"
desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards."
- icon_state = "improvshell"
+ icon_state = "gshell"
projectile_type = /obj/item/projectile/bullet/pellet/weak
m_amt = 250
pellets = 5
variance = 0.8
-/obj/item/ammo_casing/shotgun/improvised/overload
- name = "overloaded improvised shell"
- desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards. This one has been packed with even more \
- propellant. It's like playing russian roulette, with a shotgun."
- icon_state = "improvshell"
- projectile_type = /obj/item/projectile/bullet/pellet/random
- m_amt = 250
- pellets = 5
- variance = 1.0
-
-/obj/item/ammo_casing/shotgun/improvised/overload/New()
- ..()
- pellets = rand(3, 8)
-
-
/obj/item/ammo_casing/shotgun/stunslug
name = "taser slug"
desc = "A stunning taser slug."
@@ -125,21 +110,6 @@
pellets = 4
variance = 0.9
-/obj/item/ammo_casing/shotgun/ion
- name = "ion shell"
- desc = "An advanced shotgun shell which uses a subspace ansible crystal to produce an effect similar to a standard ion rifle. \
- The unique properties of the crystal splot the pulse into a spread of individually weaker bolts."
- icon_state = "ionshell"
- projectile_type = /obj/item/projectile/ion/weak
- pellets = 4
- variance = 0.9
-
-/obj/item/ammo_casing/shotgun/laserslug
- name = "laser slug"
- desc = "An advanced shotgun shell that uses a micro laser to replicate the effects of a laser weapon in a ballistic package."
- icon_state = "lshell"
- projectile_type = /obj/item/projectile/beam
-
/obj/item/ammo_casing/shotgun/techshell
name = "unloaded technological shell"
desc = "A high-tech shotgun shell which can be loaded with materials to produce unique effects."
@@ -183,14 +153,10 @@
else
return 0
-/obj/item/ammo_casing/caseless/update_icon()
- ..()
- icon_state = "[initial(icon_state)]"
/obj/item/ammo_casing/caseless/a75
desc = "A .75 bullet casing."
caliber = "75"
- icon_state = "s-casing-live"
projectile_type = /obj/item/projectile/bullet/gyro
/obj/item/ammo_casing/a40mm
@@ -203,45 +169,8 @@
/obj/item/ammo_casing/caseless/magspear
name = "magnetic spear"
desc = "A reusable spear that is typically loaded into kinetic spearguns."
- projectile_type = /obj/item/projectile/bullet/reusable/magspear
+ projectile_type = /obj/item/projectile/bullet/magspear
caliber = "speargun"
icon_state = "magspear"
throwforce = 15 //still deadly when thrown
throw_speed = 3
-
-/obj/item/ammo_casing/caseless/foam_dart
- name = "foam dart"
- desc = "Its nerf or nothing! Ages 8 and up."
- projectile_type = /obj/item/projectile/bullet/reusable/foam_dart
- caliber = "foam_force"
- icon = 'icons/obj/guns/toy.dmi'
- icon_state = "foamdart"
- var/modified = 0
-
-/obj/item/ammo_casing/caseless/foam_dart/update_icon()
- ..()
- if (modified)
- icon_state = "foamdart_empty"
- desc = "Its nerf or nothing! ...Although, this one doesn't look too safe."
-
-/obj/item/ammo_casing/caseless/foam_dart/attackby(var/obj/item/A as obj, mob/user as mob, params)
- ..()
- if (istype(A, /obj/item/weapon/screwdriver) && !modified)
- modified = 1
- BB.damage_type = BRUTE
- icon_state = "foamdart_empty"
- desc = "Its nerf or nothing! ...Although, this one doesn't look too safe."
- user << "You pop the safety cap off of [src]."
- else if ((istype(A, /obj/item/weapon/pen)) && modified && !BB.contents.len)
- user.drop_item()
- A.loc = BB
- BB.damage = 5
- BB.nodamage = 0
- user << "You insert [A] into [src]."
- return
-
-/obj/item/ammo_casing/caseless/foam_dart/riot
- name = "riot foam dart"
- desc = "Who's smart idea was it to use toys as crowd control? Ages 18 and up."
- projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/riot
- icon_state = "foamdart_riot"
diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm
index a7d14066c3868..59076dc6da823 100644
--- a/code/modules/projectiles/ammunition/boxes.dm
+++ b/code/modules/projectiles/ammunition/boxes.dm
@@ -47,14 +47,3 @@
ammo_type = /obj/item/ammo_casing/a762
max_ammo = 5
multiple_sprites = 1
-
-/obj/item/ammo_box/foambox
- name = "ammo box (Foam Darts)"
- icon = 'icons/obj/guns/toy.dmi'
- icon_state = "foambox"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart
- max_ammo = 40
-
-/obj/item/ammo_box/foambox/riot
- icon_state = "foambox_riot"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
\ No newline at end of file
diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm
index d170962a7ae94..adfe379d53cc7 100644
--- a/code/modules/projectiles/ammunition/energy.dm
+++ b/code/modules/projectiles/ammunition/energy.dm
@@ -59,7 +59,6 @@
select_name = "stun"
fire_sound = 'sound/weapons/taser.ogg'
e_cost = 200
- delay = 15
/obj/item/ammo_casing/energy/electrode/gun
fire_sound = 'sound/weapons/gunshot.ogg'
@@ -122,18 +121,6 @@
e_cost = 50
fire_sound = "sound/weapons/taser2.ogg"
-/obj/item/ammo_casing/energy/plasma
- projectile_type = /obj/item/projectile/plasma
- select_name = "plasma burst"
- fire_sound = 'sound/weapons/Laser.ogg'
- delay = 10
- e_cost = 25
-
-/obj/item/ammo_casing/energy/plasma/adv
- projectile_type = /obj/item/projectile/plasma/adv
- delay = 8
- e_cost = 10
-
/obj/item/ammo_casing/energy/wormhole
projectile_type = /obj/item/projectile/beam/wormhole
e_cost = 0
diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm
index b1296f8b2cf8c..6addb24a5240d 100644
--- a/code/modules/projectiles/ammunition/magazines.dm
+++ b/code/modules/projectiles/ammunition/magazines.dm
@@ -104,14 +104,6 @@
max_ammo = 5
multiload = 1
-/obj/item/ammo_box/magazine/internal/shot/toy
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart
- caliber = "foam_force"
- max_ammo = 4
-
-/obj/item/ammo_box/magazine/internal/shot/toy/crossbow
- max_ammo = 5
-
///////////EXTERNAL MAGAZINES////////////////
/obj/item/ammo_box/magazine/m10mm
@@ -224,49 +216,3 @@ obj/item/ammo_box/magazine/tommygunm45
name = "shotgun magazine (12g dragon's breath)"
icon_state = "m12gf"
ammo_type = /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath
-
-/obj/item/ammo_box/magazine/toy
- name = "foam force META magazine"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart
- caliber = "foam_force"
-
-/obj/item/ammo_box/magazine/toy/smg
- name = "foam force SMG magazine"
- icon_state = "smg9mm-20"
- max_ammo = 20
-
-/obj/item/ammo_box/magazine/toy/smg/update_icon()
- ..()
- icon_state = "smg9mm-[round(ammo_count(),5)]"
-
-/obj/item/ammo_box/magazine/toy/smg/riot
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
-
-/obj/item/ammo_box/magazine/toy/pistol
- name = "foam force pistol magazine"
- icon_state = "9x19p"
- max_ammo = 8
- multiple_sprites = 2
-
-/obj/item/ammo_box/magazine/toy/pistol/riot
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
-
-/obj/item/ammo_box/magazine/toy/smgm45
- name = "donksoft SMG magazine"
- caliber = "foam_force"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
- max_ammo = 20
-
-/obj/item/ammo_box/magazine/toy/smgm45/update_icon()
- ..()
- icon_state = "c20r45-[round(ammo_count(),2)]"
-
-/obj/item/ammo_box/magazine/toy/m762
- name = "donksoft box magazine"
- caliber = "foam_force"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
- max_ammo = 50
-
-/obj/item/ammo_box/magazine/toy/m762/update_icon()
- ..()
- icon_state = "a762-[round(ammo_count(),10)]"
\ No newline at end of file
diff --git a/code/modules/projectiles/firing.dm b/code/modules/projectiles/firing.dm
index d130f56e32b44..c5f2b3a0e7d53 100644
--- a/code/modules/projectiles/firing.dm
+++ b/code/modules/projectiles/firing.dm
@@ -25,7 +25,8 @@
if(reagents && BB.reagents)
reagents.trans_to(BB, reagents.total_volume) //For chemical darts/bullets
- qdel(reagents)
+ reagents.delete()
+ return
/obj/item/ammo_casing/proc/throw_proj(var/turf/targloc, mob/living/user as mob|obj, params)
var/turf/curloc = user.loc
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 57606d89072c1..9b14f51bf4d5b 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -17,7 +17,6 @@
throw_range = 5
force = 5.0
origin_tech = "combat=1"
- needs_permit = 1
attack_verb = list("struck", "hit", "bashed")
var/fire_sound = "gunshot"
@@ -156,7 +155,7 @@
if(pin.pin_auth(user) || pin.emagged)
return 1
else
- pin.auth_fail(user)
+ user << "INVALID USER."
return 0
else
user << "\The [src]'s trigger is locked. This weapon doesn't have a firing pin installed!"
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index d342e89b0d400..8f885b321f6d4 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -9,7 +9,6 @@
var/modifystate = 0
var/list/ammo_type = list(/obj/item/ammo_casing/energy)
var/select = 1 //The state of the select fire switch. Determines from the ammo_type list what kind of shot is fired next.
- var/can_charge = 1 //Can it be charged in a recharger?
/obj/item/weapon/gun/energy/emp_act(severity)
power_supply.use(round(power_supply.charge / severity))
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index f1e7f779d14cf..d255add402845 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -14,7 +14,6 @@
desc = "A modified version of the basic laser gun, this one fires less concentrated energy bolts designed for target practice."
ammo_type = list(/obj/item/ammo_casing/energy/laser/practice)
clumsy_check = 0
- needs_permit = 0
obj/item/weapon/gun/energy/laser/retro
name ="retro laser"
@@ -106,7 +105,6 @@ obj/item/weapon/gun/energy/laser/retro
ammo_type = list(/obj/item/ammo_casing/energy/laser/bluetag)
origin_tech = "combat=1;magnets=2"
clumsy_check = 0
- needs_permit = 0
var/charge_tick = 0
pin = /obj/item/device/firing_pin/tag/blue
@@ -137,7 +135,6 @@ obj/item/weapon/gun/energy/laser/retro
ammo_type = list(/obj/item/ammo_casing/energy/laser/redtag)
origin_tech = "combat=1;magnets=2"
clumsy_check = 0
- needs_permit = 0
var/charge_tick = 0
pin = /obj/item/device/firing_pin/tag/red
diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm
index dff570dca52af..a18668d23b2db 100644
--- a/code/modules/projectiles/guns/energy/nuclear.dm
+++ b/code/modules/projectiles/guns/energy/nuclear.dm
@@ -1,9 +1,9 @@
/obj/item/weapon/gun/energy/gun
name = "energy gun"
- desc = "A basic hybrid energy gun with two settings: Disable and kill."
+ desc = "A basic hybrid energy gun with two settings: Stun and kill."
icon_state = "energy"
item_state = null //so the human update icon uses the icon_state instead.
- ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser)
+ ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser)
origin_tech = "combat=3;magnets=2"
modifystate = 2
can_flashlight = 1
@@ -29,7 +29,6 @@
modifystate = 0
can_flashlight = 0
pin = null
- can_charge = 0
/obj/item/weapon/gun/energy/gun/nuclear/New()
..()
@@ -62,14 +61,14 @@
M << "Your gun feels pleasantly warm for a moment."
else
M << "You feel a warm sensation."
- M.irradiate(rand(3,120))
+ M.apply_effect(rand(3,120), IRRADIATE)
lightfail = 1
else
for (var/mob/living/M in range(rand(1,4),src)) //Big failure, TIME FOR RADIATION BITCHES
if (src in M.contents)
M << "Your gun's reactor overloads!"
M << "You feel a wave of heat wash over you."
- M.irradiate(300)
+ M.apply_effect(300, IRRADIATE)
crit_fail = 1 //break the gun so it stops recharging
SSobj.processing.Remove(src)
update_icon()
diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm
index d638e39a10be4..5fc0bbb93d6b1 100644
--- a/code/modules/projectiles/guns/energy/pulse.dm
+++ b/code/modules/projectiles/guns/energy/pulse.dm
@@ -40,7 +40,6 @@
icon_state = "pulse_pistol"
item_state = "gun"
cell_type = "/obj/item/weapon/stock_parts/cell/pulse/pistol"
- can_charge = 0
/obj/item/weapon/gun/energy/pulse/pistol/loyalpin
pin = /obj/item/device/firing_pin/implant/loyalty
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 58baa81e92833..96822335fcee7 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -123,19 +123,52 @@
item_state = "kineticgun"
ammo_type = list(/obj/item/ammo_casing/energy/kinetic)
cell_type = "/obj/item/weapon/stock_parts/cell/emproof"
- needs_permit = 0 // Aparently these are safe to carry? I'm sure Golliaths would disagree.
var/overheat = 0
- var/overheat_time = 16
var/recent_reload = 1
+ var/range_add = 0
+ var/overheat_time = 20
+ upgrades = list("diamond" = 0, "screwdriver" = 0, "plasma" = 0)
unique_rename = 1
+/obj/item/weapon/gun/energy/kinetic_accelerator/newshot()
+ ..()
+ if(chambered && chambered.BB)
+ var/obj/item/projectile/kinetic/charge = chambered.BB
+ charge.range += range_add
+
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+ if(istype(W, /obj/item/weapon/screwdriver) && upgrades["screwdriver"] < 3)
+ upgrades["screwdriver"]++
+ overheat_time -= 1
+ user << "You tweak [src]'s thermal exchanger."
+
+
+ else if(istype(W, /obj/item/stack))
+ var/obj/item/stack/S = W
+
+ if(istype(S, /obj/item/stack/sheet/mineral/diamond) && upgrades["diamond"] < 3)
+ upgrades["diamond"]++
+ overheat_time -= 3
+ user << "You upgrade [src]'s thermal exchanger with diamonds."
+ S.use(1)
+
+ if(istype(S, /obj/item/stack/sheet/mineral/plasma) && upgrades["plasma"] < 2)
+ upgrades["plasma"]++
+ range_add++
+ user << "You upgrade [src]'s accelerating chamber with plasma."
+ if(prob(5 * (range_add + 1) * (range_add + 1)) && power_supply)
+ power_supply.rigged = 1 // This is dangerous!
+ S.use(1)
+
+ ..()
+
/obj/item/weapon/gun/energy/kinetic_accelerator/shoot_live_shot()
overheat = 1
spawn(overheat_time)
overheat = 0
recent_reload = 0
..()
-
/obj/item/weapon/gun/energy/kinetic_accelerator/emp_act(severity)
return
@@ -162,7 +195,6 @@
suppressed = 1
ammo_type = list(/obj/item/ammo_casing/energy/bolt)
unique_rename = 0
- overheat_time = 20
/obj/item/weapon/gun/energy/kinetic_accelerator/crossbow/large
name = "energy crossbow"
@@ -175,42 +207,6 @@
ammo_type = list(/obj/item/ammo_casing/energy/bolt/large)
pin = null
-/obj/item/weapon/gun/energy/plasmacutter
- name = "plasma cutter"
- desc = "A mining tool capable of expelling concentrated plasma bursts. You could use it to cut limbs off of xenos! Or, you know, mine stuff."
- icon_state = "plasmacutter"
- item_state = "plasmacutter"
- modifystate = -1
- origin_tech = "combat=1;materials=3;magnets=2;plasmatech=2;engineering=1"
- ammo_type = list(/obj/item/ammo_casing/energy/plasma)
- flags = CONDUCT | OPENCONTAINER
- attack_verb = list("attacked", "slashed", "cut", "sliced")
- can_charge = 0
-
-/obj/item/weapon/gun/energy/plasmacutter/examine(mob/user)
- ..()
- if(power_supply)
- user <<"[src] is [round(power_supply.percent())]% charged."
-
-/obj/item/weapon/gun/energy/plasmacutter/attackby(var/obj/item/A, var/mob/user)
- if(istype(A, /obj/item/stack/sheet/mineral/plasma))
- var/obj/item/stack/sheet/S = A
- S.use(1)
- power_supply.give(1000)
- user << "You insert [A] in [src], recharging it."
- else if(istype(A, /obj/item/weapon/ore/plasma))
- qdel(A)
- power_supply.give(500)
- user << "You insert [A] in [src], recharging it."
- else
- ..()
-
-/obj/item/weapon/gun/energy/plasmacutter/adv
- name = "advanced plasma cutter"
- icon_state = "adv_plasmacutter"
- origin_tech = "combat=3;materials=4;magnets=3;plasmatech=3;engineering=2"
- ammo_type = list(/obj/item/ammo_casing/energy/plasma/adv)
-
/obj/item/weapon/gun/energy/disabler
name = "disabler"
desc = "A self-defense weapon that exhausts organic targets, weakening them until they collapse."
@@ -223,7 +219,6 @@
desc = "An integrated disabler that draws from a cyborg's power cell. This weapon contains a limiter to prevent the cyborg's power cell from overheating."
var/charge_tick = 0
var/recharge_time = 2.5
- can_charge = 0
/obj/item/weapon/gun/energy/disabler/cyborg/New()
..()
diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm
index 1281adc83e55b..acce8548cde8c 100644
--- a/code/modules/projectiles/guns/projectile.dm
+++ b/code/modules/projectiles/guns/projectile.dm
@@ -11,8 +11,7 @@
/obj/item/weapon/gun/projectile/New()
..()
- if (!magazine)
- magazine = new mag_type(src)
+ magazine = new mag_type(src)
chamber_round()
update_icon()
return
@@ -134,7 +133,7 @@
return boolets
/obj/item/weapon/gun/projectile/suicide_act(mob/user)
- if (src.chambered && src.chambered.BB && !src.chambered.BB.nodamage)
+ if (src.chambered)
user.visible_message("[user] is putting the barrel of the [src.name] in \his mouth. It looks like \he's trying to commit suicide.")
sleep(25)
if(user.l_hand == src || user.r_hand == src)
diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm
index 7639fbaca5feb..aa1b315ef2675 100644
--- a/code/modules/projectiles/guns/projectile/automatic.dm
+++ b/code/modules/projectiles/guns/projectile/automatic.dm
@@ -88,9 +88,6 @@
burst_size = 2
pin = /obj/item/device/firing_pin/implant/pindicate
-/obj/item/weapon/gun/projectile/automatic/c20r/unrestricted
- pin = /obj/item/device/firing_pin
-
/obj/item/weapon/gun/projectile/automatic/c20r/New()
..()
update_icon()
@@ -110,7 +107,7 @@
/obj/item/weapon/gun/projectile/automatic/l6_saw
name = "syndicate LMG"
- desc = "A heavily modified 7.62 light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the receiver below the designation."
+ desc = "A heavily modified 7.62 light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the reciever below the designation."
icon_state = "l6closed100"
item_state = "l6closedmag"
w_class = 5
@@ -178,9 +175,6 @@
fire_delay = 2
pin = /obj/item/device/firing_pin/implant/pindicate
-/obj/item/weapon/gun/projectile/automatic/m90/unrestricted
- pin = /obj/item/device/firing_pin
-
/obj/item/weapon/gun/projectile/automatic/m90/New()
..()
underbarrel = new /obj/item/weapon/gun/projectile/revolver/grenadelauncher(src)
diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm
index 0073e04b2fee8..40879ceb0cf94 100644
--- a/code/modules/projectiles/guns/projectile/revolver.dm
+++ b/code/modules/projectiles/guns/projectile/revolver.dm
@@ -127,7 +127,7 @@
/obj/item/weapon/gun/projectile/revolver/russian
name = "russian revolver"
- desc = "A Russian-made revolver for drinking games. Uses .357 ammo, and has a mechanism requiring you to spin the chamber before each trigger pull."
+ desc = "A Russian-made revolver for drinking games. Uses .357 ammo, and has a mechanism requiring to spin the chamber before each trigger pull."
origin_tech = "combat=2;materials=2"
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rus357
var/spun = 0
diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm
index 0baee44780b4b..b4de0731b063f 100644
--- a/code/modules/projectiles/guns/projectile/shotgun.dm
+++ b/code/modules/projectiles/guns/projectile/shotgun.dm
@@ -83,7 +83,7 @@
/obj/item/weapon/gun/projectile/shotgun/riot/attackby(var/obj/item/A as obj, mob/user as mob, params)
..()
- if(istype(A, /obj/item/weapon/circular_saw) || istype(A, /obj/item/weapon/gun/energy/plasmacutter))
+ if(istype(A, /obj/item/weapon/circular_saw) || istype(A, /obj/item/weapon/pickaxe/plasmacutter))
sawoff(user)
if(istype(A, /obj/item/weapon/melee/energy))
var/obj/item/weapon/melee/energy/W = A
@@ -160,7 +160,7 @@
var/obj/item/weapon/melee/energy/W = A
if(W.active)
sawoff(user)
- if(istype(A, /obj/item/weapon/circular_saw) || istype(A, /obj/item/weapon/gun/energy/plasmacutter))
+ if(istype(A, /obj/item/weapon/circular_saw) || istype(A, /obj/item/weapon/pickaxe/plasmacutter))
sawoff(user)
/obj/item/weapon/gun/projectile/revolver/doublebarrel/attack_self(mob/living/user as mob)
diff --git a/code/modules/projectiles/guns/projectile/toy.dm b/code/modules/projectiles/guns/projectile/toy.dm
deleted file mode 100644
index ed3a7e38e6855..0000000000000
--- a/code/modules/projectiles/guns/projectile/toy.dm
+++ /dev/null
@@ -1,86 +0,0 @@
-/obj/item/weapon/gun/projectile/automatic/toy
- name = "foam force SMG"
- desc = "A prototype three-round burst toy submachine gun. Ages 8 and up."
- icon = 'icons/obj/guns/toy.dmi'
- icon_state = "saber"
- item_state = "gun"
- mag_type = /obj/item/ammo_box/magazine/toy/smg
- fire_sound = 'sound/weapons/Gunshot_smg.ogg'
- force = 0
- throwforce = 0
- burst_size = 3
- can_suppress = 0
- clumsy_check = 0
- needs_permit = 0
-
-/obj/item/weapon/gun/projectile/automatic/toy/process_chamber(var/eject_casing = 0, var/empty_chamber = 1)
- ..()
-
-/obj/item/weapon/gun/projectile/automatic/toy/pistol
- name = "foam force pistol"
- desc = "A small, easily concealable toy handgun. Ages 8 and up."
- icon_state = "pistol"
- w_class = 2
- mag_type = /obj/item/ammo_box/magazine/toy/pistol
- fire_sound = 'sound/weapons/Gunshot.ogg'
- can_suppress = 0
- burst_size = 1
- fire_delay = 0
- action_button_name = null
-
-/obj/item/weapon/gun/projectile/automatic/toy/pistol/update_icon()
- ..()
- icon_state = "[initial(icon_state)][chambered ? "" : "-e"]"
-
-/obj/item/weapon/gun/projectile/automatic/toy/pistol/riot/New()
- magazine = new /obj/item/ammo_box/magazine/toy/pistol/riot(src)
- ..()
-
-/obj/item/weapon/gun/projectile/shotgun/toy
- name = "foam force shotgun"
- desc = "A toy shotgun with wood furniture and a four-shell capacity underneath. Ages 8 and up."
- icon = 'icons/obj/guns/toy.dmi'
- force = 0
- throwforce = 0
- origin_tech = null
- mag_type = /obj/item/ammo_box/magazine/internal/shot/toy
- clumsy_check = 0
- needs_permit = 0
-
-/obj/item/weapon/gun/projectile/shotgun/toy/process_chamber()
- ..()
- if(chambered && !chambered.BB)
- qdel(chambered)
-
-/obj/item/weapon/gun/projectile/shotgun/toy/crossbow
- name = "foam force crossbow"
- desc = "A weapon favored by many overactive children. Ages 8 and up."
- icon = 'icons/obj/toy.dmi'
- icon_state = "foamcrossbow"
- item_state = "crossbow"
- mag_type = /obj/item/ammo_box/magazine/internal/shot/toy/crossbow
- fire_sound = 'sound/items/syringeproj.ogg'
- slot_flags = SLOT_BELT
- w_class = 2
-
-/obj/item/weapon/gun/projectile/automatic/c20r/toy
- name = "donksoft SMG"
- desc = "A bullpup two-round burst toy SMG, designated 'C-20r'. Ages 8 and up."
- icon = 'icons/obj/guns/toy.dmi'
- can_suppress = 0
- needs_permit = 0
- mag_type = /obj/item/ammo_box/magazine/toy/smgm45
-
-/obj/item/weapon/gun/projectile/automatic/c20r/toy/process_chamber(var/eject_casing = 0, var/empty_chamber = 1)
- ..()
-
-/obj/item/weapon/gun/projectile/automatic/l6_saw/toy
- name = "donksoft LMG"
- desc = "A heavily modified toy light machine gun, designated 'L6 SAW'. Ages 8 and up."
- icon = 'icons/obj/guns/toy.dmi'
- can_suppress = 0
- needs_permit = 0
- mag_type = /obj/item/ammo_box/magazine/toy/m762
-
-/obj/item/weapon/gun/projectile/automatic/l6_saw/toy/process_chamber(var/eject_casing = 0, var/empty_chamber = 1)
- ..()
\ No newline at end of file
diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm
index 92e5326599b09..a176ec5b55b95 100644
--- a/code/modules/projectiles/pins.dm
+++ b/code/modules/projectiles/pins.dm
@@ -1,38 +1,22 @@
/obj/item/device/firing_pin
name = "electronic firing pin"
- desc = "A small authentication device, to be inserted into a firearm receiver to allow operation. NT safety regulations require all new designs to incorporate one."
+ desc = "A small authentication device, to be inserted into a firearm reciever to allow operation. NT safety regulations require all new designs to incorporate one."
icon = 'icons/obj/device.dmi'
icon_state = "firing_pin"
item_state = "pen"
- flags = CONDUCT
+ flags = CONDUCT
w_class = 1
attack_verb = list("poked")
var/emagged = 0
- var/fail_message = "INVALID USER."
- var/selfdestruct = 0 // Explode when user check is failed.
- var/force_replace = 0 // Can forcefully replace other pins.
- var/pin_removeable = 0 // Can be replaced by any pin.
- var/obj/item/weapon/gun/gun
-
-
-/obj/item/device/firing_pin/New(newloc)
- ..()
- if(istype(newloc, /obj/item/weapon/gun))
- gun = newloc
/obj/item/device/firing_pin/afterattack(atom/target, mob/user, proximity_flag)
if(proximity_flag)
if(istype(target, /obj/item/weapon/gun))
var/obj/item/weapon/gun/G = target
- if(G.pin && (force_replace || G.pin.pin_removeable))
- G.pin.loc = get_turf(G)
- G.pin.gun_remove(user)
- user << "You remove [G]'s old pin."
-
if(!G.pin)
user.drop_item()
- gun_insert(user, G)
- user << "You insert [src] into [G]."
+ G.pin = src
+ loc = G
else
user << "This firearm already has a firing pin installed."
@@ -41,54 +25,25 @@
emagged = 1
user << "You override the authentication mechanism."
-/obj/item/device/firing_pin/proc/gun_insert(mob/living/user, var/obj/item/weapon/gun/G)
- gun = G
- loc = gun
- gun.pin = src
- return
-
-/obj/item/device/firing_pin/proc/gun_remove(mob/living/user)
- gun.pin = null
- gun = null
- return
-
/obj/item/device/firing_pin/proc/pin_auth(mob/living/user)
return 1
-/obj/item/device/firing_pin/proc/auth_fail(mob/living/user)
- user.show_message(fail_message, 1)
- if(selfdestruct)
- user.show_message("SELF-DESTRUCTING... ", 1)
- user << "Your [gun] explodes!"
- explosion(get_turf(gun), -1, 0, 2, 3)
- if(gun)
- qdel(gun)
-
-
-
-/obj/item/device/firing_pin/magic
- name = "magic crystal shard"
- desc = "A small enchanted shard which allows magical weapons to fire."
-
-
-// Test pin, works only near firing range.
/obj/item/device/firing_pin/test_range
name = "test-range firing pin"
desc = "This safety firing pin allows weapons to be fired within proximity to a firing range."
- fail_message = "TEST RANGE CHECK FAILED."
- pin_removeable = 1
/obj/item/device/firing_pin/test_range/pin_auth(mob/living/user)
for(var/obj/machinery/magnetic_controller/M in range(user, 3))
return 1
return 0
+/obj/item/device/firing_pin/magic
+ name = "magic crystal shard"
+ desc = "A small enchanted shard which allows magical weapons to fire."
-// Implant pin, checks for implant
/obj/item/device/firing_pin/implant
name = "implant-keyed firing pin"
desc = "This is a security firing pin which only authorizes users who are implanted with a certain device."
- fail_message = "IMPLANT CHECK FAILED."
var/obj/item/weapon/implant/req_implant = null
/obj/item/device/firing_pin/implant/pin_auth(mob/living/user)
@@ -109,84 +64,19 @@
req_implant = /obj/item/weapon/implant/weapons_auth
-
-// Honk pin, clown's joke item.
-// Can replace other pins. Replace a pin in cap's laser for extra fun!
/obj/item/device/firing_pin/clown
name = "hilarious firing pin"
desc = "Advanced clowntech that can convert any firearm into a far more useful object."
color = "yellow"
- fail_message = "HONK!"
- force_replace = 1
/obj/item/device/firing_pin/clown/pin_auth(mob/living/user)
playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1)
return 0
-// Ultra-honk pin, clown's deadly joke item.
-// A gun with ultra-honk pin is useful for clown and useless for everyone else.
-/obj/item/device/firing_pin/clown/ultra/pin_auth(mob/living/user)
- playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1)
- if(!(user.disabilities & CLUMSY) && !(user.mind && user.mind.assigned_role == "Clown"))
- return 0
- return 1
-
-/obj/item/device/firing_pin/clown/ultra/gun_insert(mob/living/user, var/obj/item/weapon/gun/G)
- ..()
- G.clumsy_check = 0
-
-/obj/item/device/firing_pin/clown/ultra/gun_remove(mob/living/user)
- gun.clumsy_check = initial(gun.clumsy_check)
- ..()
-
-// Now two times deadlier!
-/obj/item/device/firing_pin/clown/ultra/selfdestruct
- desc = "Advanced clowntech that can convert any firearm into a far more useful object. It has a small nitrobananium charge on it."
- selfdestruct = 1
-
-
-// DNA-keyed pin.
-// When you want to keep your toys for youself.
-/obj/item/device/firing_pin/dna
- name = "DNA-keyed firing pin"
- desc = "This is a DNA-locked firing pin which only authorizes one user."
- icon_state = "firing_pin_dna"
- fail_message = "DNA CHECK FAILED."
- var/unique_enzymes = null
-
-/obj/item/device/firing_pin/dna/afterattack(atom/target, mob/user, proximity_flag)
- ..()
- if(proximity_flag && iscarbon(target))
- var/mob/living/carbon/M = target
- if(M.dna && M.dna.unique_enzymes)
- unique_enzymes = M.dna.unique_enzymes
- user << "DNA-LOCK SET."
-
-/obj/item/device/firing_pin/dna/pin_auth(mob/living/carbon/user)
- if(istype(user) && user.dna && user.dna.unique_enzymes)
- if(user.dna.unique_enzymes == unique_enzymes)
- return 1
-
- return 0
-
-/obj/item/device/firing_pin/dna/auth_fail(mob/living/carbon/user)
- if(!unique_enzymes)
- if(istype(user) && user.dna && user.dna.unique_enzymes)
- unique_enzymes = user.dna.unique_enzymes
- user << "DNA-LOCK SET."
- else
- ..()
-
-/obj/item/device/firing_pin/dna/dredd
- desc = "This is a DNA-locked firing pin which only authorizes one user. It has a small explosive charge on it."
- selfdestruct = 1
-
-
-// Laser tag pins
+//muh laser tag
/obj/item/device/firing_pin/tag
name = "laser tag firing pin"
desc = "A recreational firing pin, used in laser tag units to ensure users have their vests on."
- fail_message = "SUIT CHECK FAILED."
var/obj/item/clothing/suit/suit_requirement = null
/obj/item/device/firing_pin/tag/pin_auth(mob/living/user)
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 4a7438fe954db..bf61095ee95a4 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -2,11 +2,12 @@
name = "projectile"
icon = 'icons/obj/projectiles.dmi'
icon_state = "bullet"
- density = 0
+ density = 1
unacidable = 1
pass_flags = PASSTABLE
mouse_opacity = 0
hitsound = 'sound/weapons/pierce.ogg'
+ var/bumped = 0 //Prevents it from hitting more than one guy at once
var/def_zone = "" //Aiming at
var/mob/firer = null//Who shot it
var/suppressed = 0 //Attack message
@@ -38,8 +39,9 @@
var/stamina = 0
var/jitter = 0
var/forcedodge = 0
- // 1 to pass solid objects, 2 to pass solid turfs (results in bugs, bugs and tons of bugs)
+
var/range = 0
+ var/proj_hit = 0
/obj/item/projectile/proc/Range()
if(range)
@@ -50,34 +52,13 @@
return
/obj/item/projectile/proc/on_range() //if we want there to be effects when they reach the end of their range
+ proj_hit = 1
qdel(src)
/obj/item/projectile/proc/on_hit(atom/target, blocked = 0, hit_zone)
- if(!isliving(target))
- return 0
+ if(!isliving(target)) return 0
+ if(isanimal(target)) return 0
var/mob/living/L = target
-
- var/organ_hit_text = ""
- if(L.has_limbs)
- organ_hit_text = " in \the [parse_zone(def_zone)]"
- if(suppressed)
- playsound(loc, hitsound, 5, 1, -1)
- L << "You've been shot by \a [src][organ_hit_text]!"
- else
- if(hitsound)
- var/volume = vol_by_damage()
- playsound(loc, hitsound, volume, 1, -1)
- L.visible_message("[L] is hit by \a [src][organ_hit_text]!", \
- "[L] is hit by \a [src][organ_hit_text]!") //X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter
-
- var/reagent_note
- if(reagents && reagents.reagent_list)
- reagent_note = " REAGENTS:"
- for(var/datum/reagent/R in reagents.reagent_list)
- reagent_note += R.id + " ("
- reagent_note += num2text(R.volume) + ") "
- add_logs(firer, L, "shot", object="[src]", addition=reagent_note)
-
L.on_hit(type)
return L.apply_effects(stun, weaken, paralyze, irradiate, stutter, slur, eyeblur, drowsy, blocked, stamina, jitter)
@@ -87,35 +68,51 @@
else
return 50 //if the projectile doesn't do damage, play its hitsound at 50% volume
-/obj/item/projectile/Bump(atom/A, yes)
- if(!yes) //prevents multi bumps.
- return
- if(A == firer || A == src)
+/obj/item/projectile/Bump(atom/A)
+ if(A == firer)
loc = A.loc
return 0 //cannot shoot yourself
-
- var/distance = get_dist(get_turf(A), starting) // Get the distance between the turf shot from and the mob we hit and use that for the calculations.
- def_zone = ran_zone(def_zone, max(100-(7*distance), 5)) //Lower accurancy/longer range tradeoff. 7 is a balanced number to use.
-
- var/turf/target_turf = get_turf(A)
-
+ if(bumped)//Stops multihit projectiles
+ return 1
+ bumped = 1
+ if(isliving(A))
+ var/mob/living/M = A
+ var/reagent_note
+ if(reagents && reagents.reagent_list)
+ reagent_note = " REAGENTS:"
+ for(var/datum/reagent/R in reagents.reagent_list)
+ reagent_note += R.id + " ("
+ reagent_note += num2text(R.volume) + ") "
+ var/distance = get_dist(get_turf(A), starting) // Get the distance between the turf shot from and the mob we hit and use that for the calculations.
+ def_zone = ran_zone(def_zone, max(100-(7*distance), 5)) //Lower accurancy/longer range tradeoff. 7 is a balanced number to use.
+ if(suppressed)
+ playsound(loc, hitsound, 5, 1, -1)
+ M << "You've been shot by \a [src] in \the [parse_zone(def_zone)]!"
+ else
+ if(hitsound)
+ var/volume = vol_by_damage()
+ playsound(loc, hitsound, volume, 1, -1)
+ M.visible_message("[M] is hit by \a [src] in the [parse_zone(def_zone)]!", \
+ "[M] is hit by \a [src] in the [parse_zone(def_zone)]!") //X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter
+ add_logs(firer, M, "shot", object="[src]", addition=reagent_note)
+
+ var/turf/new_loc = get_turf(A)
var/permutation = A.bullet_act(src, def_zone) // searches for return value, could be deleted after run so check A isn't null
if(permutation == -1 || forcedodge)// the bullet passes through a dense object!
- loc = target_turf
- if(A)
- permutated.Add(A)
- Range()
+ bumped = 0 // reset bumped variable!
+ loc = new_loc
+ permutated.Add(A)
return 0
- else
- if(A && A.density && !ismob(A) && !(A.flags & ON_BORDER)) //if we hit a dense non-border obj or dense turf then we also hit one of the mobs on that tile.
- var/list/mobs_list = list()
- for(var/mob/living/L in target_turf)
- mobs_list += L
- if(mobs_list.len)
- var/mob/living/picked_mob = pick(mobs_list)
- picked_mob.bullet_act(src, def_zone)
qdel(src)
+/obj/item/projectile/CanPass(atom/movable/mover, turf/target, height=0)
+ if(height==0) return 1
+
+ if(istype(mover, /obj/item/projectile))
+ return prob(95)
+ else
+ return 1
+
/obj/item/projectile/Process_Spacemove(var/movement_dir = 0)
return 1 //Bullets don't drift in space
@@ -130,14 +127,9 @@
if((!( current ) || loc == current))
current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z)
step_towards(src, current)
- if((original && original.layer>=2.75) || ismob(original))
+ if(!bumped && ((original && original.layer>=2.75) || ismob(original)))
if(loc == get_turf(original))
if(!(original in permutated))
- Bump(original, 1)
+ Bump(original)
Range()
sleep(1)
-
-/obj/item/projectile/Crossed(atom/movable/AM as mob) //A mob moving on a tile with a projectile is hit by it.
- ..()
- if(isliving(AM) && AM.density && !checkpass(PASSMOB))
- Bump(AM, 1)
\ No newline at end of file
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index 88bacc7679051..87dd1b387823f 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -2,7 +2,7 @@
name = "laser"
icon_state = "laser"
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
- damage = 20
+ damage = 25
damage_type = BURN
hitsound = 'sound/weapons/sear.ogg'
flag = "laser"
@@ -17,25 +17,25 @@
/obj/item/projectile/beam/scatter
name = "laser pellet"
icon_state = "scatterlaser"
- damage = 5
+ damage = 10
/obj/item/projectile/beam/heavylaser
name = "heavy laser"
icon_state = "heavylaser"
- damage = 40
+ damage = 50
/obj/item/projectile/beam/xray
name = "xray beam"
icon_state = "xray"
- damage = 15
+ damage = 20
irradiate = 30
forcedodge = 1
/obj/item/projectile/beam/disabler
name = "disabler beam"
icon_state = "omnilaser"
- damage = 36
+ damage = 40
damage_type = STAMINA
flag = "energy"
hitsound = 'sound/weapons/tap.ogg'
@@ -44,20 +44,20 @@
/obj/item/projectile/beam/pulse
name = "pulse"
icon_state = "u_laser"
- damage = 50
+ damage = 60
/obj/item/projectile/beam/pulse/on_hit(var/atom/target, var/blocked = 0)
- . = ..()
if(istype(target,/turf/)||istype(target,/obj/structure/))
target.ex_act(2)
+ ..()
/obj/item/projectile/beam/pulse/shot
- damage = 40
+ damage = 50
/obj/item/projectile/beam/emitter
name = "emitter beam"
icon_state = "emitter"
- damage = 30
+ damage = 50
/obj/item/projectile/beam/emitter/singularity_pull()
return //don't want the emitters to miss
@@ -77,13 +77,12 @@ obj/item/projectile/beam/emitter/Destroy()
var/suit_types = list(/obj/item/clothing/suit/redtag, /obj/item/clothing/suit/bluetag)
/obj/item/projectile/lasertag/on_hit(var/atom/target, var/blocked = 0)
- . = ..()
- if(ishuman(target))
+ if(istype(target, /mob/living/carbon/human))
var/mob/living/carbon/human/M = target
if(istype(M.wear_suit))
if(M.wear_suit.type in suit_types)
M.adjustStaminaLoss(34)
-
+ return 1
/obj/item/projectile/lasertag/redtag
icon_state = "laser"
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 09cae32719923..1cf6c2065ac54 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -27,11 +27,8 @@
/obj/item/projectile/bullet/pellet/weak
damage = 3
-/obj/item/projectile/bullet/pellet/random/New()
- damage = rand(10)
-
/obj/item/projectile/bullet/midbullet
- damage = 20
+ damage = 25
stamina = 65 //two round bursts from the c20r knocks people down
@@ -39,7 +36,7 @@
damage = 25
/obj/item/projectile/bullet/midbullet3
- damage = 30
+ damage = 35
/obj/item/projectile/bullet/heavybullet
damage = 35
@@ -57,8 +54,8 @@
color = "#FFFF00"
/obj/item/projectile/bullet/incendiary/on_hit(var/atom/target, var/blocked = 0)
- . = ..()
- if(iscarbon(target))
+ ..()
+ if(istype(target, /mob/living/carbon))
var/mob/living/carbon/M = target
M.adjust_fire_stacks(1)
M.IgniteMob()
@@ -66,14 +63,13 @@
/obj/item/projectile/bullet/incendiary/shell
name = "incendiary slug"
- damage = 20
+ damage = 25
/obj/item/projectile/bullet/incendiary/shell/Move()
..()
var/turf/location = get_turf(src)
- if(location)
- new /obj/effect/hotspot(location)
- location.hotspot_expose(700, 50, 1)
+ new/obj/effect/hotspot(location)
+ location.hotspot_expose(700, 50, 1)
/obj/item/projectile/bullet/incendiary/shell/dragonsbreath
name = "dragonsbreath round"
@@ -90,7 +86,7 @@
hitsound = 'sound/effects/meteorimpact.ogg'
/obj/item/projectile/bullet/meteorshot/on_hit(var/atom/target, var/blocked = 0)
- . = ..()
+ ..()
if(istype(target, /atom/movable))
var/atom/movable/M = target
var/atom/throw_target = get_edge_target_turf(M, get_dir(src, get_step_away(M, src)))
@@ -105,8 +101,7 @@
damage = 20
/obj/item/projectile/bullet/mime/on_hit(var/atom/target, var/blocked = 0)
- . = ..()
- if(iscarbon(target))
+ if(istype(target, /mob/living/carbon))
var/mob/living/carbon/M = target
M.silent = max(M.silent, 10)
@@ -116,28 +111,23 @@
icon_state = "cbbolt"
damage = 6
-/obj/item/projectile/bullet/dart/New()
- ..()
- flags |= NOREACT
- create_reagents(50)
-
-/obj/item/projectile/bullet/dart/on_hit(var/atom/target, var/blocked = 0, var/hit_zone)
- var/deflect = 0
- if(iscarbon(target))
- var/mob/living/carbon/M = target
- if(M.can_inject(null,0,hit_zone)) // Pass the hit zone to see if it can inject by whether it hit the head or the body.
- ..()
- reagents.trans_to(M, reagents.total_volume)
- return 1
- else
- deflect = 1
- target.visible_message("The [name] was deflected!", \
- "You were protected against the [name]!")
- if(!deflect)
+ New()
..()
- flags &= ~NOREACT
- reagents.handle_reactions()
- return 1
+ flags |= NOREACT
+ create_reagents(50)
+
+ on_hit(var/atom/target, var/blocked = 0, var/hit_zone)
+ if(istype(target, /mob/living/carbon))
+ var/mob/living/carbon/M = target
+ if(M.can_inject(null,0,hit_zone)) // Pass the hit zone to see if it can inject by whether it hit the head or the body.
+ reagents.trans_to(M, reagents.total_volume)
+ return 1
+ else
+ target.visible_message("The [name] was deflected!", \
+ "You were protected against the [name]!")
+ flags &= ~NOREACT
+ reagents.handle_reactions()
+ return 1
/obj/item/projectile/bullet/dart/metalfoam
New()
@@ -161,6 +151,5 @@
/obj/item/projectile/bullet/neurotoxin/on_hit(var/atom/target, var/blocked = 0)
if(isalien(target))
- weaken = 0
- nodamage = 1
- . = ..() // Execute the rest of the code.
+ return 0
+ ..() // Execute the rest of the code.
diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm
index ea3b048e13edc..68816c1494648 100644
--- a/code/modules/projectiles/projectile/energy.dm
+++ b/code/modules/projectiles/projectile/energy.dm
@@ -11,31 +11,34 @@
icon_state = "spark"
color = "#FFFF00"
nodamage = 1
- stun = 5
- weaken = 5
+ stun = 10
+ weaken = 10
stutter = 5
jitter = 20
hitsound = 'sound/weapons/taserhit.ogg'
- range = 7
/obj/item/projectile/energy/electrode/on_hit(var/atom/target, var/blocked = 0)
- . = ..()
- if(!ismob(target) || blocked >= 2) //Fully blocked by mob or collided with dense object - burst into sparks!
+ if(!proj_hit)
+ if(!ismob(target) || blocked >= 2) //Fully blocked by mob or collided with dense object - burst into sparks!
+ var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread
+ sparks.set_up(1, 1, src)
+ sparks.start()
+ proj_hit = 1
+ else if(iscarbon(target))
+ var/mob/living/carbon/C = target
+ if(C.dna && C.dna.check_mutation(HULK))
+ C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
+ else if(C.status_flags & CANWEAKEN)
+ spawn(10)
+ C.do_jitter_animation(jitter)
+ ..()
+
+/obj/item/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet
+ if(!proj_hit)
var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread
sparks.set_up(1, 1, src)
sparks.start()
- else if(iscarbon(target))
- var/mob/living/carbon/C = target
- if(C.dna && C.dna.check_mutation(HULK))
- C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
- else if(C.status_flags & CANWEAKEN)
- spawn(5)
- C.do_jitter_animation(jitter)
-
-/obj/item/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet
- var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread
- sparks.set_up(1, 1, src)
- sparks.start()
+ proj_hit = 1
..()
/obj/item/projectile/energy/declone
@@ -64,12 +67,4 @@
stutter = 5
/obj/item/projectile/energy/bolt/large
- damage = 20
-
-/obj/item/ammo_casing/energy/plasma
- projectile_type = /obj/item/projectile/plasma
- select_name = "plasma burst"
- fire_sound = 'sound/weapons/pulse.ogg'
-
-/obj/item/ammo_casing/energy/plasma/adv
- projectile_type = /obj/item/projectile/plasma/adv
\ No newline at end of file
+ damage = 20
\ No newline at end of file
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index 1dd1129f74f40..845f914ac154c 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -11,7 +11,6 @@
icon_state = "pulse1_bl"
/obj/item/projectile/magic/death/on_hit(var/target)
- . = ..()
if(ismob(target))
var/mob/M = target
M.death(0)
@@ -32,7 +31,6 @@
..()
/obj/item/projectile/magic/fireball/on_hit(var/target)
- . = ..()
var/turf/T = get_turf(target)
explosion(T, -1, 0, 2, 3, 0, flame_range = 2)
if(ismob(target)) //multiple flavors of pain
@@ -48,8 +46,8 @@
flag = "magic"
/obj/item/projectile/magic/resurrection/on_hit(var/mob/living/carbon/target)
- . = ..()
- if(ismob(target))
+
+ if(istype(target,/mob))
var/old_stat = target.stat
target.revive()
target.suiciding = 0
@@ -74,7 +72,6 @@
var/outer_tele_radius = 6
/obj/item/projectile/magic/teleport/on_hit(var/mob/target)
- . = ..()
var/teleammount = 0
var/teleloc = target
if(!isturf(target))
@@ -96,7 +93,6 @@
flag = "magic"
/obj/item/projectile/magic/door/on_hit(var/atom/target)
- . = ..()
var/atom/T = target.loc
if(isturf(target) && target.density)
CreateDoor(target)
@@ -120,7 +116,6 @@
flag = "magic"
/obj/item/projectile/magic/change/on_hit(var/atom/change)
- . = ..()
wabbajack(change)
proc/wabbajack(mob/living/M)
@@ -169,9 +164,9 @@ proc/wabbajack(mob/living/M)
else
new_mob.languages |= HUMAN
if("slime")
- new_mob = new /mob/living/simple_animal/slime(M.loc)
+ new_mob = new /mob/living/carbon/slime(M.loc)
if(prob(50))
- var/mob/living/simple_animal/slime/Slime = new_mob
+ var/mob/living/carbon/slime/Slime = new_mob
Slime.is_adult = 1
new_mob.languages |= HUMAN
if("xeno")
@@ -208,15 +203,15 @@ proc/wabbajack(mob/living/M)
var/animal = pick("parrot","corgi","crab","pug","cat","mouse","chicken","cow","lizard","chick","fox","butterfly")
switch(animal)
if("parrot") new_mob = new /mob/living/simple_animal/parrot(M.loc)
- if("corgi") new_mob = new /mob/living/simple_animal/pet/corgi(M.loc)
+ if("corgi") new_mob = new /mob/living/simple_animal/corgi(M.loc)
if("crab") new_mob = new /mob/living/simple_animal/crab(M.loc)
- if("pug") new_mob = new /mob/living/simple_animal/pet/pug(M.loc)
- if("cat") new_mob = new /mob/living/simple_animal/pet/cat(M.loc)
+ if("pug") new_mob = new /mob/living/simple_animal/pug(M.loc)
+ if("cat") new_mob = new /mob/living/simple_animal/cat(M.loc)
if("mouse") new_mob = new /mob/living/simple_animal/mouse(M.loc)
if("chicken") new_mob = new /mob/living/simple_animal/chicken(M.loc)
if("cow") new_mob = new /mob/living/simple_animal/cow(M.loc)
if("lizard") new_mob = new /mob/living/simple_animal/lizard(M.loc)
- if("fox") new_mob = new /mob/living/simple_animal/pet/fox(M.loc)
+ if("fox") new_mob = new /mob/living/simple_animal/fox(M.loc)
if("butterfly") new_mob = new /mob/living/simple_animal/butterfly(M.loc)
else new_mob = new /mob/living/simple_animal/chick(M.loc)
new_mob.languages |= HUMAN
diff --git a/code/modules/projectiles/projectile/reusable.dm b/code/modules/projectiles/projectile/reusable.dm
deleted file mode 100644
index 414be55b31a96..0000000000000
--- a/code/modules/projectiles/projectile/reusable.dm
+++ /dev/null
@@ -1,46 +0,0 @@
-/obj/item/projectile/bullet/reusable
- name = "reusable bullet"
- desc = "How do you even reuse a bullet?"
- var/obj/item/ammo_casing/caseless/ammo_type = /obj/item/ammo_casing/caseless/
-
-/obj/item/projectile/bullet/reusable/on_hit(var/atom/target, var/blocked = 0)
- . = ..()
- if (src.contents.len)
- var/obj/content
- for(content in src.contents)
- content.loc = src.loc
- else
- new ammo_type(src.loc)
-
-/obj/item/projectile/bullet/reusable/on_range()
- if (src.contents.len)
- var/obj/content
- for(content in src.contents)
- content.loc = src.loc
- else
- new ammo_type(src.loc)
- ..()
-
-/obj/item/projectile/bullet/reusable/magspear
- name = "magnetic spear"
- desc = "WHITE WHALE, HOLY GRAIL"
- damage = 30 //takes 3 spears to kill a mega carp, one to kill a normal carp
- icon_state = "magspear"
- ammo_type = /obj/item/ammo_casing/caseless/magspear
-
-/obj/item/projectile/bullet/reusable/foam_dart
- name = "foam dart"
- desc = "I hope you're wearing eye protection."
- damage = 0 // It's a damn toy.
- damage_type = OXY
- nodamage = 1
- icon = 'icons/obj/guns/toy.dmi'
- icon_state = "foamdart"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart
- range = 10
-
-/obj/item/projectile/bullet/reusable/foam_dart/riot
- name = "riot foam dart"
- icon_state = "foamdart_riot"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
- stamina = 25
\ No newline at end of file
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index 5714b2f7b122f..130f131e4a8c6 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -8,19 +8,10 @@
/obj/item/projectile/ion/on_hit(atom/target, blocked = 0)
- ..()
empulse(target, 1, 1)
return 1
-/obj/item/projectile/ion/weak
-
-/obj/item/projectile/ion/weak/on_hit(atom/target, blocked = 0)
- ..()
- empulse(target, 0, 0)
- return 1
-
-
/obj/item/projectile/bullet/gyro
name ="explosive bolt"
icon_state= "bolter"
@@ -28,7 +19,6 @@
flag = "bullet"
/obj/item/projectile/bullet/gyro/on_hit(atom/target, blocked = 0)
- ..()
explosion(target, -1, 0, 2)
return 1
@@ -40,7 +30,6 @@
flag = "bullet"
/obj/item/projectile/bullet/a40mm/on_hit(atom/target, blocked = 0)
- ..()
explosion(target, -1, 0, 2, 1, 0, flame_range = 3)
return 1
@@ -55,8 +44,7 @@
/obj/item/projectile/temp/on_hit(atom/target, blocked = 0)//These two could likely check temp protection on the mob
- ..()
- if(isliving(target))
+ if(istype(target, /mob/living))
var/mob/M = target
M.bodytemperature = temperature
return 1
@@ -74,9 +62,7 @@
nodamage = 1
flag = "bullet"
-/obj/item/projectile/meteor/Bump(atom/A, yes)
- if(!yes) //prevents multi bumps.
- return
+/obj/item/projectile/meteor/Bump(atom/A)
if(A == firer)
loc = A.loc
return
@@ -107,7 +93,6 @@
name = "flayer ray"
/obj/item/projectile/beam/mindflayer/on_hit(atom/target, blocked = 0)
- . = ..()
if(ishuman(target))
var/mob/living/carbon/human/M = target
M.adjustBrainLoss(20)
@@ -116,7 +101,7 @@
/obj/item/projectile/kinetic
name = "kinetic force"
icon_state = null
- damage = 10
+ damage = 15
damage_type = BRUTE
flag = "bomb"
range = 3
@@ -129,24 +114,31 @@ obj/item/projectile/kinetic/New()
var/pressure = environment.return_pressure()
if(pressure < 50)
name = "full strength kinetic force"
- damage *= 4
+ damage *= 2
..()
/obj/item/projectile/kinetic/Range()
range--
if(range <= 0)
new /obj/item/effect/kinetic_blast(src.loc)
+ for(var/turf/T in range(1, src.loc))
+ if(istype(T, /turf/simulated/mineral))
+ var/turf/simulated/mineral/M = T
+ M.gets_drilled(firer)
qdel(src)
/obj/item/projectile/kinetic/on_hit(atom/target)
- . = ..()
var/turf/target_turf= get_turf(target)
if(istype(target_turf, /turf/simulated/mineral))
var/turf/simulated/mineral/M = target_turf
M.gets_drilled(firer)
new /obj/item/effect/kinetic_blast(target_turf)
-
-
+ if(isturf(target))
+ for(var/turf/T in range(1, target_turf))
+ if(istype(T, /turf/simulated/mineral))
+ var/turf/simulated/mineral/M = T
+ M.gets_drilled(firer)
+ ..()
/obj/item/effect/kinetic_blast
name = "kinetic explosion"
@@ -179,14 +171,14 @@ obj/item/projectile/kinetic/New()
/obj/item/projectile/beam/wormhole/on_hit(var/atom/target)
if(ismob(target))
- return ..()
+ ..()
+ return
if(!gun)
qdel(src)
gun.create_portal(src)
/obj/item/projectile/bullet/gyro/on_hit(atom/target, blocked = 0)
- ..()
explosion(target, -1, 0, 2)
return 1
@@ -196,39 +188,19 @@ obj/item/projectile/kinetic/New()
damage = 25
weaken = 5
-/obj/item/projectile/bullet/frag12/on_hit(atom/target, blocked = 0)
- ..()
- explosion(target, -1, 0, 1)
- return 1
+/obj/item/projectile/bullet/magspear
+ name = "magnetic spear"
+ desc = "WHITE WHALE, HOLY GRAIL"
+ damage = 30 //takes 3 spears to kill a mega carp, one to kill a normal carp
+ icon_state = "magspear"
-/obj/item/projectile/plasma
- name = "plasma blast"
- icon_state = "plasmacutter"
- damage_type = BRUTE
- damage = 5
- range = 1
-
-obj/item/projectile/plasma/New()
- var/turf/proj_turf = get_turf(src)
- if(!istype(proj_turf, /turf))
- return
- var/datum/gas_mixture/environment = proj_turf.return_air()
- var/pressure = environment.return_pressure()
- if(pressure < 30)
- name = "full strength plasma blast"
- damage *= 3
- range += 3
+/obj/item/projectile/bullet/magspear/on_hit(var/atom/target, var/blocked = 0)
+ if(!proj_hit)
+ proj_hit = 1
+ new /obj/item/ammo_casing/caseless/magspear(src.loc)
..()
-/obj/item/projectile/plasma/on_hit(var/atom/target)
- if(istype(target, /turf/simulated/mineral))
- var/turf/simulated/mineral/M = target
- M.gets_drilled(firer)
- return ..()
-
-/obj/item/projectile/plasma/adv
- range = 2
-
-/obj/item/projectile/plasma/adv/mech
- damage = 10
- range = 3
+/obj/item/projectile/bullet/magspear/on_range()
+ if(!proj_hit)
+ new /obj/item/ammo_casing/caseless/magspear(src.loc)
+ ..()
diff --git a/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm b/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm
new file mode 100644
index 0000000000000..79160a9debc7d
--- /dev/null
+++ b/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm
@@ -0,0 +1,435 @@
+#define SOLID 1
+#define LIQUID 2
+#define GAS 3
+
+#define REM REAGENTS_EFFECT_MULTIPLIER
+
+datum/reagent/nicotine
+ name = "Nicotine"
+ id = "nicotine"
+ description = "Stun reduction per cycle, slight stamina regeneration buff. Overdoses become rapidly deadly."
+ reagent_state = LIQUID
+ color = "#60A584" // rgb: 96, 165, 132
+ overdose_threshold = 35
+ addiction_threshold = 30
+
+datum/reagent/nicotine/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ var/smoke_message = pick("You can just feel your lungs dying!", "You feel relaxed.", "You feel calmed.", "You feel the lung cancer forming.", "You feel the money you wasted.", "You feel like a space cowboy.", "You feel rugged.")
+ if(prob(5))
+ M << "[smoke_message]"
+ M.AdjustStunned(-1)
+ M.adjustStaminaLoss(-1*REM)
+ ..()
+ return
+
+datum/reagent/nicotine/overdose_process(var/mob/living/M as mob)
+ if(prob(20))
+ M << "You feel like you smoked too much."
+ M.adjustToxLoss(1*REM)
+ M.adjustOxyLoss(1*REM)
+ ..()
+ return
+
+datum/reagent/crank
+ name = "Crank"
+ id = "crank"
+ description = "2x stun reduction per cycle. Warms you up, makes you jittery as hell."
+ reagent_state = LIQUID
+ color = "#60A584" // rgb: 96, 165, 132
+ overdose_threshold = 20
+ addiction_threshold = 10
+
+datum/reagent/crank/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ var/high_message = pick("You feel jittery.", "You feel like you gotta go fast.", "You feel like you need to step it up.")
+ if(prob(5))
+ M << "[high_message]"
+ M.AdjustParalysis(-2)
+ M.AdjustStunned(-2)
+ M.AdjustWeakened(-2)
+ ..()
+ return
+datum/reagent/crank/overdose_process(var/mob/living/M as mob)
+ M.adjustBrainLoss(rand(1,10)*REM)
+ M.adjustToxLoss(rand(1,10)*REM)
+ M.adjustBruteLoss(rand(1,10)*REM)
+ ..()
+ return
+
+datum/reagent/crank/addiction_act_stage1(var/mob/living/M as mob)
+ M.adjustBrainLoss(rand(1,10)*REM)
+ ..()
+ return
+datum/reagent/crank/addiction_act_stage2(var/mob/living/M as mob)
+ M.adjustToxLoss(rand(1,10)*REM)
+ ..()
+ return
+datum/reagent/crank/addiction_act_stage3(var/mob/living/M as mob)
+ M.adjustBruteLoss(rand(1,10)*REM)
+ ..()
+ return
+datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob)
+ M.adjustBrainLoss(rand(1,10)*REM)
+ M.adjustToxLoss(rand(1,10)*REM)
+ M.adjustBruteLoss(rand(1,10)*REM)
+ ..()
+ return
+/datum/chemical_reaction/crank
+ name = "Crank"
+ id = "crank"
+ result = "crank"
+ required_reagents = list("diphenhydramine" = 1, "ammonia" = 1, "lithium" = 1, "sacid" = 1, "fuel" = 1)
+ result_amount = 5
+ mix_message = "The mixture violently reacts, leaving behind a few crystalline shards."
+ required_temp = 390
+
+/datum/reagent/krokodil
+ name = "Krokodil"
+ id = "krokodil"
+ description = "Cools and calms you down, occasional BRAIN and TOX damage."
+ reagent_state = LIQUID
+ color = "#60A584" // rgb: 96, 165, 132
+ overdose_threshold = 20
+ addiction_threshold = 15
+
+
+/datum/reagent/krokodil/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ var/high_message = pick("You feel calm.", "You feel collected.", "You feel like you need to relax.")
+ if(prob(5))
+ M << "[high_message]"
+ ..()
+ return
+
+/datum/reagent/krokodil/overdose_process(var/mob/living/M as mob)
+ if(prob(10))
+ M.adjustBrainLoss(rand(1,5)*REM)
+ M.adjustToxLoss(rand(1,5)*REM)
+ ..()
+ return
+
+
+/datum/reagent/krokodil/addiction_act_stage1(var/mob/living/M as mob)
+ M.adjustBrainLoss(rand(1,5)*REM)
+ M.adjustToxLoss(rand(1,5)*REM)
+ ..()
+ return
+/datum/reagent/krokodil/addiction_act_stage2(var/mob/living/M as mob)
+ if(prob(25))
+ M << "Your skin feels loose..."
+ ..()
+ return
+/datum/reagent/krokodil/addiction_act_stage3(var/mob/living/M as mob)
+ if(prob(25))
+ M << "Your skin starts to peel away..."
+ M.adjustBruteLoss(3*REM)
+ ..()
+ return
+/datum/reagent/krokodil/addiction_act_stage4(var/mob/living/carbon/human/M as mob)
+ if(!istype(M.dna.species, /datum/species/skeleton))
+ M << "Your skin appears to be disintegrating... it's almost as though you are a.. a.. SPOOKY SCARY SKELETON!"
+ M.adjustBruteLoss(rand(50,80)*REM) // holy shit your skin just FELL THE FUCK OFF
+ hardset_dna(M, null, null, null, null, /datum/species/skeleton)
+ else
+ M.adjustBruteLoss(5*REM)
+ ..()
+ return
+
+/datum/chemical_reaction/krokodil
+ name = "Krokodil"
+ id = "krokodil"
+ result = "krokodil"
+ required_reagents = list("diphenhydramine" = 1, "morphine" = 1, "cleaner" = 1, "potassium" = 1, "phosphorus" = 1, "fuel" = 1)
+ result_amount = 6
+ mix_message = "The mixture dries into a pale blue powder."
+ required_temp = 380
+
+/datum/reagent/methamphetamine
+ name = "Methamphetamine"
+ id = "methamphetamine"
+ description = "3x stun reduction per cycle, significant stamina regeneration buff, makes you really jittery, dramatically increases movement speed."
+ reagent_state = LIQUID
+ color = "#60A584" // rgb: 96, 165, 132
+ overdose_threshold = 20
+ addiction_threshold = 10
+ metabolization_rate = 0.6
+
+/datum/reagent/methamphetamine/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ var/high_message = pick("You feel hyper.", "You feel like you need to go faster.", "You feel like you can run the world.")
+ if(prob(5))
+ M << "[high_message]"
+ M.AdjustParalysis(-3)
+ M.AdjustStunned(-3)
+ M.AdjustWeakened(-3)
+ M.adjustStaminaLoss(-3)
+ M.status_flags |= GOTTAGOREALLYFAST
+ M.Jitter(3)
+ M.adjustBrainLoss(0.5)
+ if(prob(5))
+ M.emote(pick("twitch", "shiver"))
+ ..()
+ return
+
+/datum/reagent/methamphetamine/overdose_process(var/mob/living/M as mob)
+ if(M.canmove && !istype(M.loc, /turf/space))
+ for(var/i = 0, i < 4, i++)
+ step(M, pick(cardinal))
+ if(prob(20))
+ M.emote("laugh")
+ if(prob(33))
+ M.visible_message("[M]'s hands flip out and flail everywhere!")
+ var/obj/item/I = M.get_active_hand()
+ if(I)
+ M.drop_item()
+ ..()
+ if(prob(20))
+ M.adjustToxLoss(5)
+ M.adjustBrainLoss(pick(0.5, 0.6, 0.7, 0.8, 0.9, 1))
+ return
+
+/datum/reagent/methamphetamine/addiction_act_stage1(var/mob/living/M as mob)
+ M.Jitter(5)
+ if(prob(20))
+ M.emote(pick("twitch","drool","moan"))
+ ..()
+ return
+/datum/reagent/methamphetamine/addiction_act_stage2(var/mob/living/M as mob)
+ M.Jitter(10)
+ M.Dizzy(10)
+ if(prob(30))
+ M.emote(pick("twitch","drool","moan"))
+ ..()
+ return
+/datum/reagent/methamphetamine/addiction_act_stage3(var/mob/living/M as mob)
+ if(M.canmove && !istype(M.loc, /turf/space))
+ for(var/i = 0, i < 4, i++)
+ step(M, pick(cardinal))
+ M.Jitter(15)
+ M.Dizzy(15)
+ if(prob(40))
+ M.emote(pick("twitch","drool","moan"))
+ ..()
+ return
+/datum/reagent/methamphetamine/addiction_act_stage4(var/mob/living/carbon/human/M as mob)
+ if(M.canmove && !istype(M.loc, /turf/space))
+ for(var/i = 0, i < 8, i++)
+ step(M, pick(cardinal))
+ M.Jitter(20)
+ M.Dizzy(20)
+ M.adjustToxLoss(5)
+ if(prob(50))
+ M.emote(pick("twitch","drool","moan"))
+ ..()
+ return
+
+/datum/chemical_reaction/methamphetamine
+ name = "methamphetamine"
+ id = "methamphetamine"
+ result = "methamphetamine"
+ required_reagents = list("ephedrine" = 1, "iodine" = 1, "phosphorus" = 1, "hydrogen" = 1)
+ result_amount = 4
+ required_temp = 374
+
+/datum/chemical_reaction/saltpetre
+ name = "saltpetre"
+ id = "saltpetre"
+ result = "saltpetre"
+ required_reagents = list("potassium" = 1, "nitrogen" = 1, "oxygen" = 3)
+ result_amount = 3
+
+/datum/reagent/saltpetre
+ name = "Saltpetre"
+ id = "saltpetre"
+ description = "Volatile."
+ reagent_state = LIQUID
+ color = "#60A584" // rgb: 96, 165, 132
+
+/datum/reagent/bath_salts
+ name = "Bath Salts"
+ id = "bath_salts"
+ description = "Makes you nearly impervious to stuns and grants a stamina regeneration buff, but you will be a nearly uncontrollable tramp-bearded raving lunatic."
+ reagent_state = LIQUID
+ color = "#60A584" // rgb: 96, 165, 132
+ overdose_threshold = 20
+ addiction_threshold = 10
+
+
+/datum/reagent/bath_salts/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.")
+ if(prob(5))
+ M << "[high_message]"
+ M.AdjustParalysis(-5)
+ M.AdjustStunned(-5)
+ M.AdjustWeakened(-5)
+ M.adjustStaminaLoss(-10)
+ M.adjustBrainLoss(1)
+ M.adjustToxLoss(0.1)
+ M.hallucination += 10
+ if(M.canmove && !istype(M.loc, /turf/space))
+ step(M, pick(cardinal))
+ step(M, pick(cardinal))
+ ..()
+ return
+
+/datum/chemical_reaction/bath_salts
+ name = "bath_salts"
+ id = "bath_salts"
+ result = "bath_salts"
+ required_reagents = list("????" = 1, "saltpetre" = 1, "nutriment" = 1, "cleaner" = 1, "enzyme" = 1, "tea" = 1, "mercury" = 1)
+ result_amount = 7
+ required_temp = 374
+
+/datum/reagent/bath_salts/overdose_process(var/mob/living/M as mob)
+ M.hallucination += 10
+ if(M.canmove && !istype(M.loc, /turf/space))
+ for(var/i = 0, i < 8, i++)
+ step(M, pick(cardinal))
+ if(prob(20))
+ M.emote(pick("twitch","drool","moan"))
+ if(prob(33))
+ var/obj/item/I = M.get_active_hand()
+ if(I)
+ M.drop_item()
+ ..()
+ return
+
+/datum/reagent/bath_salts/addiction_act_stage1(var/mob/living/M as mob)
+ M.hallucination += 10
+ if(M.canmove && !istype(M.loc, /turf/space))
+ for(var/i = 0, i < 8, i++)
+ step(M, pick(cardinal))
+ M.Jitter(5)
+ M.adjustBrainLoss(10)
+ if(prob(20))
+ M.emote(pick("twitch","drool","moan"))
+ ..()
+ return
+/datum/reagent/bath_salts/addiction_act_stage2(var/mob/living/M as mob)
+ M.hallucination += 20
+ if(M.canmove && !istype(M.loc, /turf/space))
+ for(var/i = 0, i < 8, i++)
+ step(M, pick(cardinal))
+ M.Jitter(10)
+ M.Dizzy(10)
+ M.adjustBrainLoss(10)
+ if(prob(30))
+ M.emote(pick("twitch","drool","moan"))
+ ..()
+ return
+/datum/reagent/bath_salts/addiction_act_stage3(var/mob/living/M as mob)
+ M.hallucination += 30
+ if(M.canmove && !istype(M.loc, /turf/space))
+ for(var/i = 0, i < 12, i++)
+ step(M, pick(cardinal))
+ M.Jitter(15)
+ M.Dizzy(15)
+ M.adjustBrainLoss(10)
+ if(prob(40))
+ M.emote(pick("twitch","drool","moan"))
+ ..()
+ return
+/datum/reagent/bath_salts/addiction_act_stage4(var/mob/living/carbon/human/M as mob)
+ M.hallucination += 40
+ if(M.canmove && !istype(M.loc, /turf/space))
+ for(var/i = 0, i < 16, i++)
+ step(M, pick(cardinal))
+ M.Jitter(50)
+ M.Dizzy(50)
+ M.adjustToxLoss(5)
+ M.adjustBrainLoss(10)
+ if(prob(50))
+ M.emote(pick("twitch","drool","moan"))
+ ..()
+ return
+
+/datum/chemical_reaction/aranesp
+ name = "aranesp"
+ id = "aranesp"
+ result = "aranesp"
+ required_reagents = list("epinephrine" = 1, "atropine" = 1, "morphine" = 1)
+ result_amount = 3
+
+/datum/reagent/aranesp
+ name = "Aranesp"
+ id = "aranesp"
+ description = "Volatile."
+ reagent_state = LIQUID
+ color = "#60A584" // rgb: 96, 165, 132
+
+/datum/reagent/aranesp/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.")
+ if(prob(5))
+ M << "[high_message]"
+ M.adjustStaminaLoss(-35)
+ M.adjustToxLoss(1)
+ if(prob(rand(1,100)))
+ M.losebreath++
+ M.adjustOxyLoss(20)
+ ..()
+ return
+
+datum/reagent/hotline
+ name = "Hotline"
+ id = "hotline"
+ description = "It isn't just wrong. It's dead wrong."
+ reagent_state = LIQUID
+ color = "#60A584" // rgb: 96, 165, 132
+ overdose_threshold = 15
+ addiction_threshold = 10
+
+datum/reagent/hotline/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ var/high_message = pick("You feel alert.", "You feel like you can see everything more clearly.", "You feel like you need to relax and examine your surroundings.")
+ if(prob(5))
+ M << "[high_message]"
+ M.druggy = max(M.druggy, 15)
+ M.hallucination += 10
+ M.adjustBrainLoss(0.2)
+ M.adjustBruteLoss(-0.2)
+ M.adjustFireLoss(-0.2)
+ M.status_flags |= GOTTAGOFAST
+ M.adjustStaminaLoss(-3)
+ ..()
+ return
+datum/reagent/hotline/overdose_process(var/mob/living/M as mob)
+ M.adjustBrainLoss(rand(1,20)*REM)
+ M.adjustToxLoss(rand(1,20)*REM)
+ M.adjustBruteLoss(rand(1,20)*REM)
+ M.druggy = max(M.druggy, 30)
+ M.hallucination += 30
+ if(prob(5))
+ M << pick("Your head feels like it's ripping apart!","You wonder why the fuck did you decide to take [src.name].","It hurts so bad!","Please, end it now!","Dear [ticker.Bible_deity_name] please no it hurts!")
+ ..()
+ return
+
+datum/reagent/hotline/addiction_act_stage1(var/mob/living/M as mob)
+ M.adjustBrainLoss(rand(1,10))
+ M.hallucination += 30
+ M.druggy = max(M.druggy, 30)
+ ..()
+ return
+datum/reagent/hotline/addiction_act_stage2(var/mob/living/M as mob)
+ M.adjustBrainLoss(rand(1,20))
+ M.hallucination += 30
+ M.druggy = max(M.druggy, 30)
+ ..()
+ return
+datum/reagent/hotline/addiction_act_stage3(var/mob/living/M as mob)
+ M.adjustBrainLoss(rand(1,30))
+ M.hallucination += 30
+ M.druggy = max(M.druggy, 30)
+ ..()
+ return
+datum/reagent/hotline/addiction_act_stage4(var/mob/living/M as mob)
+ M.adjustBrainLoss(rand(1,30))
+ M.hallucination += 30
+ M.druggy = max(M.druggy, 30)
+ if(prob(1))
+ M.visible_message("[M] clutches at their chest! It looks like they're having a heart attack!")
+ M.adjustBruteLoss(80) // don't do drugs kids
+ ..()
+ return
diff --git a/code/modules/reagents/Chemistry-Goon-Medicine.dm b/code/modules/reagents/Chemistry-Goon-Medicine.dm
new file mode 100644
index 0000000000000..35326e661860d
--- /dev/null
+++ b/code/modules/reagents/Chemistry-Goon-Medicine.dm
@@ -0,0 +1,829 @@
+#define SOLID 1
+#define LIQUID 2
+#define GAS 3
+
+#define REM REAGENTS_EFFECT_MULTIPLIER
+
+datum/reagent/silver_sulfadiazine
+ name = "Silver Sulfadiazine"
+ id = "silver_sulfadiazine"
+ description = "100% chance per cycle of healing 2 points of BURN damage."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+ metabolization_rate = 2
+
+datum/reagent/silver_sulfadiazine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1)
+ if(iscarbon(M))
+ if(method == TOUCH)
+ M.adjustFireLoss(-volume)
+ if(show_message)
+ M << "You feel your burns healing!"
+ M.emote("scream")
+ if(method == INGEST)
+ M.adjustToxLoss(0.5*volume)
+ if(show_message)
+ M << "You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?"
+ ..()
+ return
+
+datum/reagent/silver_sulfadiazine/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.adjustFireLoss(-2*REM)
+ ..()
+ return
+
+datum/reagent/styptic_powder
+ name = "Styptic Powder"
+ id = "styptic_powder"
+ description = "100% chance per cycle of healing 2 points of BRUTE damage."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+ metabolization_rate = 2
+
+datum/reagent/styptic_powder/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1)
+ if(iscarbon(M))
+ if(method == TOUCH)
+ M.adjustBruteLoss(-volume)
+ if(show_message)
+ M << "You feel your wounds knitting back together!"
+ M.emote("scream")
+ if(method == INGEST)
+ M.adjustToxLoss(0.5*volume)
+ if(show_message)
+ M << "You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?"
+ ..()
+ return
+
+datum/reagent/styptic_powder/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if(prob(55))
+ M.adjustBruteLoss(-8*REM)
+ ..()
+ return
+
+datum/reagent/salglu_solution
+ name = "Saline-Glucose Solution"
+ id = "salglu_solution"
+ description = "33% chance per cycle of healing 1 point each of BRUTE and BURN damage."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+datum/reagent/salglu_solution/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if(prob(33))
+ M.adjustBruteLoss(-1*REM)
+ M.adjustFireLoss(-1*REM)
+ ..()
+ return
+
+datum/reagent/synthflesh
+ name = "Synthflesh"
+ id = "synthflesh"
+ description = "100% chance per cycle of healing 1 point each of BRUTE and BURN damage."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+datum/reagent/synthflesh/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume,var/show_message = 1)
+ if(!M) M = holder.my_atom
+ if(iscarbon(M))
+ if(method == TOUCH)
+ M.adjustBruteLoss(-1.5*volume)
+ M.adjustFireLoss(-1.5*volume)
+ if(show_message)
+ M << "You feel your burns healing and your flesh knitting together!"
+ ..()
+ return
+
+datum/reagent/charcoal
+ name = "Charcoal"
+ id = "charcoal"
+ description = "Heals 3 TOX damage per cycle and purges other chemicals slowly."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+datum/reagent/charcoal/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.adjustToxLoss(-3*REM)
+ for(var/datum/reagent/R in M.reagents.reagent_list)
+ if(R != src)
+ M.reagents.remove_reagent(R.id,1)
+ ..()
+ return
+
+/datum/chemical_reaction/charcoal
+ name = "Charcoal"
+ id = "charcoal"
+ result = "charcoal"
+ required_reagents = list("ash" = 1, "sodiumchloride" = 1)
+ result_amount = 2
+ mix_message = "The mixture yields a fine black powder."
+ required_temp = 380
+
+/datum/chemical_reaction/silver_sulfadiazine
+ name = "Silver Sulfadiazine"
+ id = "silver_sulfadiazine"
+ result = "silver_sulfadiazine"
+ required_reagents = list("ammonia" = 1, "silver" = 1, "sulfur" = 1, "oxygen" = 1, "chlorine" = 1)
+ result_amount = 5
+
+/datum/chemical_reaction/salglu_solution
+ name = "Saline-Glucose Solution"
+ id = "salglu_solution"
+ result = "salglu_solution"
+ required_reagents = list("sodiumchloride" = 1, "water" = 1, "sugar" = 1)
+ result_amount = 3
+
+/datum/chemical_reaction/synthflesh
+ name = "Synthflesh"
+ id = "synthflesh"
+ result = "synthflesh"
+ required_reagents = list("blood" = 1, "carbon" = 1, "styptic_powder" = 1)
+ result_amount = 3
+
+/datum/chemical_reaction/styptic_powder
+ name = "Styptic Powder"
+ id = "styptic_powder"
+ result = "styptic_powder"
+ required_reagents = list("aluminium" = 1, "hydrogen" = 1, "oxygen" = 1, "sacid" = 1)
+ result_amount = 4
+ mix_message = "The solution yields an astringent powder."
+
+datum/reagent/omnizine
+ name = "Omnizine"
+ id = "omnizine"
+ description = "Heals one each of OXY, TOX, BRUTE and BURN per cycle."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+ metabolization_rate = 0.2
+ overdose_threshold = 30
+
+datum/reagent/omnizine/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.adjustToxLoss(-1*REM)
+ M.adjustOxyLoss(-1*REM)
+ M.adjustBruteLoss(-1*REM)
+ M.adjustFireLoss(-1*REM)
+ ..()
+ return
+
+datum/reagent/omnizine/overdose_process(var/mob/living/M as mob)
+ M.adjustToxLoss(3*REM)
+ M.adjustOxyLoss(3*REM)
+ M.adjustBruteLoss(3*REM)
+ M.adjustFireLoss(3*REM)
+ ..()
+ return
+
+datum/reagent/calomel
+ name = "Calomel"
+ id = "calomel"
+ description = "Increases all depletion rates by 5. +5 TOX damage while health > 20."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+datum/reagent/calomel/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ for(var/datum/reagent/R in M.reagents.reagent_list)
+ if(R != src)
+ M.reagents.remove_reagent(R.id,5)
+ if(M.health > 20)
+ M.adjustToxLoss(5*REM)
+ ..()
+ return
+
+/datum/chemical_reaction/calomel
+ name = "Calomel"
+ id = "calomel"
+ result = "calomel"
+ required_reagents = list("mercury" = 1, "chlorine" = 1)
+ result_amount = 2
+ required_temp = 374
+
+datum/reagent/potass_iodide
+ name = "Potassium Iodide"
+ id = "potass_iodide"
+ description = "80% chance of removing 1 RAD. Radiation is cumulative and causes tox+burn."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+datum/reagent/potass_iodide/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if(M.radiation > 0)
+ if(prob(80))
+ M.radiation--
+ if(M.radiation < 0)
+ M.radiation = 0
+ ..()
+ return
+
+/datum/chemical_reaction/potass_iodide
+ name = "Potassium Iodide"
+ id = "potass_iodide"
+ result = "potass_iodide"
+ required_reagents = list("potassium" = 1, "iodine" = 1)
+ result_amount = 2
+
+datum/reagent/pen_acid
+ name = "Pentetic Acid"
+ id = "pen_acid"
+ description = "Reduces 7 RAD, heals 4 TOX damage, increases all depletion rates by 4. 33% chance of taking 1 unit brute damage"
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+datum/reagent/pen_acid/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if(M.radiation > 0)
+ M.radiation -= 7
+ M.adjustToxLoss(-4*REM)
+ if(prob(33))
+ M.adjustBruteLoss(1*REM)
+ if(M.radiation < 0)
+ M.radiation = 0
+ for(var/datum/reagent/R in M.reagents.reagent_list)
+ if(R != src)
+ M.reagents.remove_reagent(R.id,4)
+ ..()
+ return
+
+/datum/chemical_reaction/pen_acid
+ name = "Pentetic Acid"
+ id = "pen_acid"
+ result = "pen_acid"
+ required_reagents = list("fuel" = 1, "chlorine" = 1, "ammonia" = 1, "formaldehyde" = 1, "sodium" = 1, "cyanide" = 1)
+ result_amount = 6
+
+datum/reagent/sal_acid
+ name = "Salicyclic Acid"
+ id = "sal_acid"
+ description = "If BRUTE damage is under 50, 50% chance to heal one unit."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+ overdose_threshold = 25
+
+datum/reagent/sal_acid/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if(M.getBruteLoss() < 50)
+ if(prob(50))
+ M.adjustBruteLoss(-1*REM)
+ ..()
+ return
+
+datum/reagent/sal_acid/overdose_process(var/mob/living/M as mob)
+ if(M.getBruteLoss() < 50)
+ if(prob(50))
+ M.adjustBruteLoss(2*REM)
+ ..()
+ return
+
+/datum/chemical_reaction/sal_acid
+ name = "Salicyclic Acid"
+ id = "sal_acid"
+ result = "sal_acid"
+ required_reagents = list("sodium" = 1, "phenol" = 1, "carbon" = 1, "oxygen" = 1, "sacid" = 1)
+ result_amount = 5
+
+datum/reagent/salbutamol
+ name = "Salbutamol"
+ id = "salbutamol"
+ description = "Heals 6 OXY damage, reduces LOSEBREATH by 4."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+ metabolization_rate = 0.2
+
+datum/reagent/salbutamol/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.adjustOxyLoss(-6*REM)
+ if(M.losebreath >= 4)
+ M.losebreath -= 4
+ ..()
+ return
+
+/datum/chemical_reaction/salbutamol
+ name = "Salbutamol"
+ id = "salbutamol"
+ result = "salbutamol"
+ required_reagents = list("sal_acid" = 1, "lithium" = 1, "aluminium" = 1, "bromine" = 1, "ammonia" = 1)
+ result_amount = 5
+
+datum/reagent/perfluorodecalin
+ name = "Perfluorodecalin"
+ id = "perfluorodecalin"
+ description = "Heals 25 OXY damage, but you can't talk. 33% chance of healing 1 BRUTE and 1 BURN."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+ metabolization_rate = 0.2
+
+datum/reagent/perfluorodecalin/on_mob_life(var/mob/living/carbon/human/M as mob)
+ if(!M) M = holder.my_atom
+ M.adjustOxyLoss(-25*REM)
+ M.silent = max(M.silent, 5)
+ if(prob(33))
+ M.adjustBruteLoss(-1*REM)
+ M.adjustFireLoss(-1*REM)
+ ..()
+ return
+
+/datum/chemical_reaction/perfluorodecalin
+ name = "Perfluorodecalin"
+ id = "perfluorodecalin"
+ result = "perfluorodecalin"
+ required_reagents = list("hydrogen" = 1, "fluorine" = 1, "oil" = 1)
+ result_amount = 3
+ required_temp = 370
+ mix_message = "The mixture rapidly turns into a dense pink liquid."
+
+datum/reagent/ephedrine
+ name = "Ephedrine"
+ id = "ephedrine"
+ description = "Stun reduction per cycle, increases run speed slightly, minor stamina regeneration buff, stabilizes crit."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+ metabolization_rate = 0.3
+ overdose_threshold = 45
+ addiction_threshold = 30
+
+datum/reagent/ephedrine/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.status_flags |= IGNORESLOWDOWN
+ M.AdjustParalysis(-1)
+ M.AdjustStunned(-1)
+ M.AdjustWeakened(-1)
+ M.adjustStaminaLoss(-1*REM)
+ ..()
+ return
+
+datum/reagent/ephedrine/overdose_process(var/mob/living/M as mob)
+ if(prob(33))
+ M.adjustToxLoss(1*REM)
+ M.losebreath++
+ ..()
+ return
+
+datum/reagent/ephedrine/addiction_act_stage1(var/mob/living/M as mob)
+ if(prob(33))
+ M.adjustToxLoss(2*REM)
+ M.losebreath += 2
+ ..()
+ return
+datum/reagent/ephedrine/addiction_act_stage2(var/mob/living/M as mob)
+ if(prob(33))
+ M.adjustToxLoss(3*REM)
+ M.losebreath += 3
+ ..()
+ return
+datum/reagent/ephedrine/addiction_act_stage3(var/mob/living/M as mob)
+ if(prob(33))
+ M.adjustToxLoss(4*REM)
+ M.losebreath += 4
+ ..()
+ return
+datum/reagent/ephedrine/addiction_act_stage4(var/mob/living/M as mob)
+ if(prob(33))
+ M.adjustToxLoss(5*REM)
+ M.losebreath += 5
+ ..()
+ return
+
+/datum/chemical_reaction/ephedrine
+ name = "Ephedrine"
+ id = "ephedrine"
+ result = "ephedrine"
+ required_reagents = list("sugar" = 1, "oil" = 1, "hydrogen" = 1, "diethylamine" = 1)
+ result_amount = 4
+ mix_message = "The solution fizzes and gives off toxic fumes."
+
+datum/reagent/diphenhydramine
+ name = "Diphenhydramine"
+ id = "diphenhydramine"
+ description = "Causes a little bit of drowsiness, reduces jitteriness. Raises histamine depletion rates by 3"
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+datum/reagent/diphenhydramine/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.drowsyness += 1
+ M.jitteriness -= 1
+ M.reagents.remove_reagent("histamine",3)
+ ..()
+ return
+
+/datum/chemical_reaction/diphenhydramine
+ name = "Diphenhydramine"
+ id = "diphenhydramine"
+ result = "diphenhydramine"
+ required_reagents = list("oil" = 1, "carbon" = 1, "bromine" = 1, "diethylamine" = 1, "ethanol" = 1)
+ result_amount = 4
+ mix_message = "The mixture dries into a pale blue powder."
+
+datum/reagent/morphine
+ name = "Morphine"
+ id = "morphine"
+ description = "Dramatically counters movement reduction from severe injury. Reduces jitteriness if someone is shaking like crazy from whatever. Will knock you out within 36 cycles if any remains in you."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+ var/cycle_count = 0
+ overdose_threshold = 30
+ addiction_threshold = 25
+
+
+datum/reagent/morphine/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.status_flags |= IGNORESLOWDOWN
+ if(cycle_count >= 36)
+ M.sleeping += 3
+ cycle_count++
+ ..()
+ return
+
+datum/reagent/morphine/overdose_process(var/mob/living/M as mob)
+ if(prob(33))
+ var/obj/item/I = M.get_active_hand()
+ if(I)
+ M.drop_item()
+ M.Dizzy(1)
+ M.Jitter(1)
+ ..()
+ return
+
+datum/reagent/morphine/addiction_act_stage1(var/mob/living/M as mob)
+ if(prob(33))
+ var/obj/item/I = M.get_active_hand()
+ if(I)
+ M.drop_item()
+ M.Dizzy(2)
+ M.Jitter(2)
+ ..()
+ return
+datum/reagent/morphine/addiction_act_stage2(var/mob/living/M as mob)
+ if(prob(33))
+ var/obj/item/I = M.get_active_hand()
+ if(I)
+ M.drop_item()
+ M.adjustToxLoss(1*REM)
+ M.Dizzy(3)
+ M.Jitter(3)
+ ..()
+ return
+datum/reagent/morphine/addiction_act_stage3(var/mob/living/M as mob)
+ if(prob(33))
+ var/obj/item/I = M.get_active_hand()
+ if(I)
+ M.drop_item()
+ M.adjustToxLoss(2*REM)
+ M.Dizzy(4)
+ M.Jitter(4)
+ ..()
+ return
+datum/reagent/morphine/addiction_act_stage4(var/mob/living/M as mob)
+ if(prob(33))
+ var/obj/item/I = M.get_active_hand()
+ if(I)
+ M.drop_item()
+ M.adjustToxLoss(3*REM)
+ M.Dizzy(5)
+ M.Jitter(5)
+ ..()
+ return
+
+datum/reagent/oculine/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ cycle_amount++
+ if(M.eye_blind > 0 && cycle_amount > 20)
+ if(prob(30))
+ M.eye_blind = 0
+ else if(prob(80))
+ M.eye_blind = 0
+ M.eye_blurry = 1
+ if(M.eye_blurry > 0)
+ if(prob(80))
+ M.eye_blurry = 0
+ ..()
+ return
+
+/datum/chemical_reaction/oculine
+ name = "Oculine"
+ id = "oculine"
+ result = "oculine"
+ required_reagents = list("charcoal" = 1, "carbon" = 1, "hydrogen" = 1)
+ result_amount = 3
+ mix_message = "The mixture sputters loudly and becomes a pale pink color."
+
+datum/reagent/oculine
+ name = "Oculine"
+ id = "oculine"
+ description = "30% chance to remove blindness, 80% chance to slightly reduce eye damage."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+ metabolization_rate = 0.4
+ var/cycle_amount = 0
+
+datum/reagent/atropine
+ name = "Atropine"
+ id = "atropine"
+ description = "1 TOX damage if used over -60 health. Causes dizziness and confusion. If under -25 health, heals 3 BRUTE + 3 BURN. Attempts to cap OXY damage at 65 and LOSEBREATH at 5."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+ metabolization_rate = 0.2
+ overdose_threshold = 35
+
+datum/reagent/atropine/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if(M.health > -60)
+ M.adjustToxLoss(1*REM)
+ if(M.health < -25)
+ M.adjustBruteLoss(-3*REM)
+ M.adjustFireLoss(-3*REM)
+ if(M.oxyloss > 65)
+ M.setOxyLoss(65)
+ if(M.losebreath > 5)
+ M.losebreath = 5
+ if(prob(30))
+ M.Dizzy(5)
+ M.Jitter(5)
+ ..()
+ return
+
+datum/reagent/atropine/overdose_process(var/mob/living/M as mob)
+ if(prob(50))
+ M.adjustToxLoss(2*REM)
+ M.Dizzy(1)
+ M.Jitter(1)
+ ..()
+ return
+
+/datum/chemical_reaction/atropine
+ name = "Atropine"
+ id = "atropine"
+ result = "atropine"
+ required_reagents = list("ethanol" = 1, "acetone" = 1, "diethylamine" = 1, "phenol" = 1, "sacid" = 1)
+ result_amount = 5
+
+datum/reagent/epinephrine
+ name = "Epinephrine"
+ id = "epinephrine"
+ description = "Reduces most of the knockout/stun effects, minor stamina regeneration buff. Attempts to cap OXY damage at 35 and LOSEBREATH at 10. If health is between -10 to -65, heals 1 TOX, 1 BRUTE, 1 BURN."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+ metabolization_rate = 0.2
+ overdose_threshold = 30
+
+datum/reagent/epinephrine/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if(M.health < -10 && M.health > -65)
+ M.adjustToxLoss(-1*REM)
+ M.adjustBruteLoss(-1*REM)
+ M.adjustFireLoss(-1*REM)
+ if(M.oxyloss > 35)
+ M.setOxyLoss(35)
+ if(M.losebreath >= 10)
+ M.losebreath = max(10, M.losebreath-5)
+ M.adjustStaminaLoss(-1*REM)
+ if(prob(30))
+ M.AdjustParalysis(-1)
+ M.AdjustStunned(-1)
+ M.AdjustWeakened(-1)
+ ..()
+ return
+
+datum/reagent/epinephrine/overdose_process(var/mob/living/M as mob)
+ if(prob(33))
+ M.adjustStaminaLoss(5*REM)
+ M.adjustToxLoss(2*REM)
+ M.losebreath++
+ ..()
+ return
+
+/datum/chemical_reaction/epinephrine
+ name = "Epinephrine"
+ id = "epinephrine"
+ result = "epinephrine"
+ required_reagents = list("phenol" = 1, "acetone" = 1, "diethylamine" = 1, "oxygen" = 1, "chlorine" = 1, "hydrogen" = 1)
+ result_amount = 6
+
+datum/reagent/strange_reagent
+ name = "Strange Reagent"
+ id = "strange_reagent"
+ description = "A miracle medical chem, this little beauty can bring the dead back to life!"
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+datum/reagent/strange_reagent/reaction_mob(var/mob/living/carbon/human/M as mob, var/method=TOUCH, var/volume)
+ if(M.stat == DEAD)
+ if(M.getBruteLoss() >= 100 || M.getFireLoss() >= 100)
+ M.visible_message("[M]'s body convulses a bit, and then falls still once more.")
+ return
+ var/mob/dead/observer/ghost = M.get_ghost()
+ M.visible_message("[M]'s body convulses a bit.")
+ if(!M.suiciding && !ghost && !(NOCLONE in M.mutations))
+ M.stat = 1
+ M.adjustOxyLoss(-20)
+ M.adjustToxLoss(-20)
+ dead_mob_list -= M
+ living_mob_list |= list(M)
+ M.emote("gasp")
+ add_logs(M, M, "revived", object="strange reagent")
+ ..()
+ return
+datum/reagent/strange_reagent/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if(prob(rand(1,100)))
+ M.adjustBruteLoss(2*REM)
+ M.adjustFireLoss(2*REM)
+ ..()
+ return
+
+/datum/chemical_reaction/strange_reagent
+ name = "Strange Reagent"
+ id = "strange_reagent"
+ result = "strange_reagent"
+ required_reagents = list("omnizine" = 1, "holywater" = 1, "mutagen" = 1)
+ result_amount = 3
+
+datum/reagent/life
+ name = "Life"
+ id = "life"
+ description = ""
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+ metabolization_rate = 0.2
+
+/datum/chemical_reaction/life
+ name = "Life"
+ id = "life"
+ result = "life"
+ required_reagents = list("strange_reagent" = 1, "synthflesh" = 1, "blood" = 1)
+ result_amount = 3
+ required_temp = 374
+
+/datum/chemical_reaction/life/on_reaction(var/datum/reagents/holder, var/created_volume)
+ chemical_mob_spawn(holder, 1, "Life")
+
+proc/chemical_mob_spawn(var/datum/reagents/holder, var/amount_to_spawn, var/reaction_name, var/mob_faction = "chemicalsummon")
+ if(holder && holder.my_atom)
+ var/blocked = list(/mob/living/simple_animal/hostile,
+ /mob/living/simple_animal/hostile/pirate,
+ /mob/living/simple_animal/hostile/pirate/ranged,
+ /mob/living/simple_animal/hostile/russian,
+ /mob/living/simple_animal/hostile/russian/ranged,
+ /mob/living/simple_animal/hostile/syndicate,
+ /mob/living/simple_animal/hostile/syndicate/melee,
+ /mob/living/simple_animal/hostile/syndicate/melee/space,
+ /mob/living/simple_animal/hostile/syndicate/ranged,
+ /mob/living/simple_animal/hostile/syndicate/ranged/space,
+ /mob/living/simple_animal/hostile/alien/queen/large,
+ /mob/living/simple_animal/hostile/retaliate,
+ /mob/living/simple_animal/hostile/retaliate/clown,
+ /mob/living/simple_animal/hostile/mushroom,
+ /mob/living/simple_animal/hostile/asteroid,
+ /mob/living/simple_animal/hostile/asteroid/basilisk,
+ /mob/living/simple_animal/hostile/asteroid/goldgrub,
+ /mob/living/simple_animal/hostile/asteroid/goliath,
+ /mob/living/simple_animal/hostile/asteroid/hivelord,
+ /mob/living/simple_animal/hostile/asteroid/hivelordbrood,
+ /mob/living/simple_animal/hostile/carp/holocarp,
+ /mob/living/simple_animal/hostile/mining_drone,
+ /mob/living/simple_animal/hostile/poison,
+ /mob/living/simple_animal/hostile/blob,
+ /mob/living/simple_animal/ascendant_shadowling
+ )//exclusion list for things you don't want the reaction to create.
+ var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs
+ var/atom/A = holder.my_atom
+ var/turf/T = get_turf(A)
+ var/area/my_area = get_area(T)
+ var/message = "A [reaction_name] reaction has occured in [my_area.name]. (JMP)"
+ message += " (VV)"
+
+ var/mob/M = get(A, /mob)
+ if(M)
+ message += " - Carried By: [M.real_name] ([M.key]) (PP) (?)"
+ else
+ message += " - Last Fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]"
+
+ message_admins(message, 0, 1)
+
+ playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
+
+ for(var/mob/living/carbon/human/H in viewers(get_turf(holder.my_atom), null))
+ H.flash_eyes()
+ for(var/i = 1, i <= amount_to_spawn, i++)
+ var/chosen = pick(critters)
+ var/mob/living/simple_animal/hostile/C = new chosen
+ C.faction |= mob_faction
+ C.loc = get_turf(holder.my_atom)
+ if(prob(50))
+ for(var/j = 1, j <= rand(1, 3), j++)
+ step(C, pick(NORTH,SOUTH,EAST,WEST))
+
+/datum/reagent/mannitol/on_mob_life(mob/living/M as mob)
+ M.adjustBrainLoss(-3)
+ ..()
+ return
+
+/datum/chemical_reaction/mannitol
+ name = "Mannitol"
+ id = "mannitol"
+ result = "mannitol"
+ required_reagents = list("sugar" = 1, "hydrogen" = 1, "water" = 1)
+ result_amount = 3
+ mix_message = "The solution slightly bubbles, becoming thicker."
+
+/datum/reagent/mannitol
+ name = "Mannitol"
+ id = "mannitol"
+ description = "Heals 3 BRAIN damage."
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+/datum/reagent/mutadone/on_mob_life(var/mob/living/carbon/human/M as mob)
+ M.jitteriness = 0
+ if(istype(M) && M.dna)
+ M.dna.remove_all_mutations()
+ ..()
+ return
+
+/datum/chemical_reaction/mutadone
+ name = "Mutadone"
+ id = "mutadone"
+ result = "mutadone"
+ required_reagents = list("mutagen" = 1, "acetone" = 1, "bromine" = 1)
+ result_amount = 3
+
+
+/datum/reagent/mutadone
+ name = "Mutadone"
+ id = "mutadone"
+ description = "Chance to remove genetic disabilities."
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+datum/reagent/antihol
+ name = "Antihol"
+ id = "antihol"
+ description = "A powerful oxidizer that reacts with ethanol."
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+datum/reagent/antihol/on_mob_life(var/mob/living/M as mob)
+ M.dizziness = 0
+ M.drowsyness = 0
+ M.slurring = 0
+ M.confused = 0
+ M.reagents.remove_reagent("ethanol", 8)
+ M.adjustToxLoss(-0.2*REM)
+ ..()
+
+/datum/chemical_reaction/antihol
+ name = "antihol"
+ id = "antihol"
+ result = "antihol"
+ required_reagents = list("ethanol" = 1, "charcoal" = 1)
+ result_amount = 2
+
+/datum/chemical_reaction/cryoxadone
+ name = "Cryoxadone"
+ id = "cryoxadone"
+ result = "cryoxadone"
+ required_reagents = list("stable_plasma" = 1, "acetone" = 1, "mutagen" = 1)
+ result_amount = 3
+
+/datum/reagent/stimulants
+ name = "Stimulants"
+ id = "stimulants"
+ description = "Sets all stun-related vars to zero, gets you running really fast. Heals 5 OXY, TOX, BRUTE, and BURN damage if health is below 50. Reduces all stuns."
+ color = "#C8A5DC" // rgb: 200, 165, 220
+ metabolization_rate = 0.4
+ overdose_threshold = 60
+
+datum/reagent/stimulants/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.status_flags |= IGNORESLOWDOWN
+ if(M.health < 50 && M.health > 0)
+ if(prob(50))
+ M.adjustOxyLoss(-5*REM)
+ M.adjustToxLoss(-5*REM)
+ M.adjustBruteLoss(-5*REM)
+ M.adjustFireLoss(-5*REM)
+ M.adjustFireLoss(-3*REM)
+ M.AdjustParalysis(-1)
+ M.AdjustStunned(-1)
+ M.AdjustWeakened(-1)
+ M.adjustStaminaLoss(-3*REM)
+ ..()
+
+datum/reagent/stimulants/overdose_process(var/mob/living/M as mob)
+ if(prob(33))
+ M.adjustStaminaLoss(5*REM)
+ M.adjustToxLoss(2*REM)
+ M.losebreath++
+ ..()
+ return
+
+datum/reagent/insulin
+ name = "Insulin"
+ id = "insulin"
+ description = "Increases sugar depletion rates."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+datum/reagent/insulin/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if(M.sleeping)
+ M.sleeping--
+ M.reagents.remove_reagent("sugar", 5)
+ ..()
+ return
diff --git a/code/modules/reagents/Chemistry-Goon-Other.dm b/code/modules/reagents/Chemistry-Goon-Other.dm
new file mode 100644
index 0000000000000..13bb4cabef676
--- /dev/null
+++ b/code/modules/reagents/Chemistry-Goon-Other.dm
@@ -0,0 +1,287 @@
+#define SOLID 1
+#define LIQUID 2
+#define GAS 3
+#define REM REAGENTS_EFFECT_MULTIPLIER
+
+var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d11141","#00b159","#00aedb","#f37735","#ffc425","#008744","#0057e7","#d62d20","#ffa700")
+
+datum/reagent/oil
+ name = "Oil"
+ id = "oil"
+ description = "A slippery solution."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+datum/reagent/stable_plasma
+ name = "Stable Plasma"
+ id = "stable_plasma"
+ description = "Non-flammable plasma locked into a liquid form that cannot ignite or become gaseous/solid."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+datum/reagent/iodine
+ name = "Iodine"
+ id = "iodine"
+ description = "A slippery solution."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+datum/reagent/fluorine
+ name = "Fluorine"
+ id = "fluorine"
+ description = "A slippery solution."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+datum/reagent/carpet
+ name = "Carpet"
+ id = "carpet"
+ description = "A slippery solution."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+/datum/reagent/carpet/reaction_turf(var/turf/simulated/T, var/volume)
+ if(istype(T, /turf/simulated/floor/plating) || istype(T, /turf/simulated/floor/plasteel))
+ var/turf/simulated/floor/F = T
+ F.visible_message("[T] gets a layer of carpeting applied!")
+ F.ChangeTurf(/turf/simulated/floor/fancy/carpet)
+ ..()
+ return
+
+datum/reagent/bromine
+ name = "Bromine"
+ id = "bromine"
+ description = "A slippery solution."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+datum/reagent/phenol
+ name = "Phenol"
+ id = "phenol"
+ description = "A slippery solution."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+datum/reagent/ash
+ name = "Ash"
+ id = "ash"
+ description = "A burnt solution."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+datum/reagent/acetone
+ name = "Acetone"
+ id = "acetone"
+ description = "A solution."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+/datum/chemical_reaction/acetone
+ name = "acetone"
+ id = "acetone"
+ result = "acetone"
+ required_reagents = list("oil" = 1, "fuel" = 1, "oxygen" = 1)
+ result_amount = 3
+
+/datum/chemical_reaction/carpet
+ name = "carpet"
+ id = "carpet"
+ result = "carpet"
+ required_reagents = list("space_drugs" = 1, "blood" = 1)
+ result_amount = 2
+
+
+/datum/chemical_reaction/oil
+ name = "Oil"
+ id = "oil"
+ result = "oil"
+ required_reagents = list("fuel" = 1, "carbon" = 1, "hydrogen" = 1)
+ result_amount = 3
+
+/datum/chemical_reaction/phenol
+ name = "phenol"
+ id = "phenol"
+ result = "phenol"
+ required_reagents = list("water" = 1, "chlorine" = 1, "oil" = 1)
+ result_amount = 3
+
+/datum/chemical_reaction/ash
+ name = "Ash"
+ id = "ash"
+ result = "ash"
+ required_reagents = list("oil" = 1)
+ result_amount = 1
+ required_temp = 480
+
+datum/reagent/colorful_reagent
+ name = "Colorful Reagent"
+ id = "colorful_reagent"
+ description = "A solution."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+/datum/chemical_reaction/colorful_reagent
+ name = "colorful_reagent"
+ id = "colorful_reagent"
+ result = "colorful_reagent"
+ required_reagents = list("stable_plasma" = 1, "radium" = 1, "space_drugs" = 1, "cryoxadone" = 1, "triple_citrus" = 1)
+ result_amount = 5
+
+datum/reagent/colorful_reagent/on_mob_life(var/mob/living/M as mob)
+ if(M && isliving(M))
+ M.color = pick(random_color_list)
+ ..()
+ return
+
+datum/reagent/colorful_reagent/reaction_mob(var/mob/living/M, var/volume)
+ if(M && isliving(M))
+ M.color = pick(random_color_list)
+ ..()
+ return
+datum/reagent/colorful_reagent/reaction_obj(var/obj/O, var/volume)
+ if(O)
+ O.color = pick(random_color_list)
+ ..()
+ return
+datum/reagent/colorful_reagent/reaction_turf(var/turf/T, var/volume)
+ if(T)
+ T.color = pick(random_color_list)
+ ..()
+ return
+
+
+datum/reagent/triple_citrus
+ name = "Triple Citrus"
+ id = "triple_citrus"
+ description = "A solution."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+/datum/chemical_reaction/triple_citrus
+ name = "triple_citrus"
+ id = "triple_citrus"
+ result = "triple_citrus"
+ required_reagents = list("lemonjuice" = 1, "limejuice" = 1, "orangejuice" = 1)
+ result_amount = 5
+
+datum/reagent/corn_starch
+ name = "Corn Starch"
+ id = "corn_starch"
+ description = "A slippery solution."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+/datum/chemical_reaction/corn_syrup
+ name = "corn_syrup"
+ id = "corn_syrup"
+ result = "corn_syrup"
+ required_reagents = list("corn_starch" = 1, "sacid" = 1)
+ result_amount = 5
+ required_temp = 374
+
+datum/reagent/corn_syrup
+ name = "Corn Syrup"
+ id = "corn_syrup"
+ description = "Decays into sugar."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+datum/reagent/corn_syrup/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.reagents.add_reagent("sugar", 3)
+ M.reagents.remove_reagent("corn_syrup", 1)
+ ..()
+ return
+
+/datum/chemical_reaction/corgium
+ name = "corgium"
+ id = "corgium"
+ result = "corgium"
+ required_reagents = list("nutriment" = 1, "colorful_reagent" = 1, "strange_reagent" = 1, "blood" = 1)
+ result_amount = 3
+ required_temp = 374
+
+datum/reagent/corgium
+ name = "Corgium"
+ id = "corgium"
+ description = "Creates a corgi at the reaction location."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+/datum/chemical_reaction/corgium/on_reaction(var/datum/reagents/holder, var/created_volume)
+ var/location = get_turf(holder.my_atom)
+ new /mob/living/simple_animal/corgi(location)
+ ..()
+ return
+
+datum/reagent/hair_dye
+ name = "Quantum Hair Dye"
+ id = "hair_dye"
+ description = "A solution."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+ var/list/potential_colors = list("0ad","a0f","f73","d14","d14","0b5","0ad","f73","fc2","084","05e","d22","fa0") // fucking hair code
+
+/datum/chemical_reaction/hair_dye
+ name = "hair_dye"
+ id = "hair_dye"
+ result = "hair_dye"
+ required_reagents = list("colorful_reagent" = 1, "radium" = 1, "space_drugs" = 1)
+ result_amount = 5
+
+datum/reagent/hair_dye/reaction_mob(var/mob/living/M, var/volume)
+ if(M && ishuman(M))
+ var/mob/living/carbon/human/H = M
+ H.hair_color = pick(potential_colors)
+ H.facial_hair_color = pick(potential_colors)
+ H.update_hair()
+ ..()
+ return
+
+datum/reagent/barbers_aid
+ name = "Barber's Aid"
+ id = "barbers_aid"
+ description = "A solution to hair loss across the world."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+/datum/chemical_reaction/barbers_aid
+ name = "barbers_aid"
+ id = "barbers_aid"
+ result = "barbers_aid"
+ required_reagents = list("carpet" = 1, "radium" = 1, "space_drugs" = 1)
+ result_amount = 5
+
+datum/reagent/barbers_aid/reaction_mob(var/mob/living/M, var/volume)
+ if(M && ishuman(M))
+ var/mob/living/carbon/human/H = M
+ var/datum/sprite_accessory/hair/picked_hair = pick(hair_styles_list)
+ var/datum/sprite_accessory/facial_hair/picked_beard = pick(facial_hair_styles_list)
+ H.hair_style = picked_hair
+ H.facial_hair_style = picked_beard
+ H.update_hair()
+ ..()
+ return
+
+datum/reagent/concentrated_barbers_aid
+ name = "Concentrated Barber's Aid"
+ id = "concentrated_barbers_aid"
+ description = "A concentrated solution to hair loss across the world."
+ reagent_state = LIQUID
+ color = "#C8A5DC" // rgb: 200, 165, 220
+
+/datum/chemical_reaction/concentrated_barbers_aid
+ name = "concentrated_barbers_aid"
+ id = "concentrated_barbers_aid"
+ result = "concentrated_barbers_aid"
+ required_reagents = list("barbers_aid" = 1, "mutagen" = 1)
+ result_amount = 2
+
+datum/reagent/concentrated_barbers_aid/reaction_mob(var/mob/living/M, var/volume)
+ if(M && ishuman(M))
+ var/mob/living/carbon/human/H = M
+ H.hair_style = "Very Long Hair"
+ H.facial_hair_style = "Very Long Beard"
+ H.update_hair()
+ ..()
+ return
\ No newline at end of file
diff --git a/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm b/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm
new file mode 100644
index 0000000000000..1190b7b77a822
--- /dev/null
+++ b/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm
@@ -0,0 +1,168 @@
+#define SOLID 1
+#define LIQUID 2
+#define GAS 3
+
+#define REM REAGENTS_EFFECT_MULTIPLIER
+
+/datum/reagent/clf3
+ name = "Chlorine Trifluoride"
+ id = "clf3"
+ description = "Makes a temporary 3x3 fireball when it comes into existence, so be careful when mixing. ClF3 applied to a surface burns things that wouldn't otherwise burn, sometimes through the very floors of the station and exposing it to the vacuum of space."
+ reagent_state = LIQUID
+ color = "#60A584" // rgb: 96, 165, 132
+ metabolization_rate = 4
+
+/datum/chemical_reaction/clf3
+ name = "Chlorine Trifluoride"
+ id = "clf3"
+ result = "clf3"
+ required_reagents = list("chlorine" = 1, "fluorine" = 3)
+ result_amount = 4
+ required_temp = 424
+
+/datum/reagent/clf3/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.adjust_fire_stacks(5)
+ M.IgniteMob()
+ M.adjustFireLoss(5*REM)
+ ..()
+ return
+
+/datum/chemical_reaction/clf3/on_reaction(var/datum/reagents/holder, var/created_volume)
+ var/turf/simulated/T = get_turf(holder.my_atom)
+ for(var/turf/simulated/turf in range(1,T))
+ new /obj/effect/hotspot(turf)
+ holder.chem_temp = 1000 // hot as shit
+ return
+
+/datum/reagent/clf3/reaction_turf(var/turf/simulated/T, var/volume)
+ if(istype(T, /turf/simulated/floor/plating))
+ var/turf/simulated/floor/plating/F = T
+ if(prob(1))
+ F.ChangeTurf(/turf/space)
+ if(istype(T, /turf/simulated/floor/))
+ var/turf/simulated/floor/F = T
+ if(prob(volume/10))
+ F.make_plating()
+ if(istype(F, /turf/simulated/floor/))
+ new /obj/effect/hotspot(F)
+ if(istype(T, /turf/simulated/wall/))
+ var/turf/simulated/wall/W = T
+ if(prob(volume/10))
+ W.ChangeTurf(/turf/simulated/floor)
+ return
+
+/datum/reagent/clf3/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
+ if(method == TOUCH && ishuman(M))
+ M.adjust_fire_stacks(5)
+ M.IgniteMob()
+ new /obj/effect/hotspot(M.loc)
+ return
+
+/datum/reagent/sorium
+ name = "Sorium"
+ id = "sorium"
+ description = "Sends everything flying from the detonation point."
+ reagent_state = LIQUID
+ color = "#60A584" //rgb: 96, 165, 132
+
+/datum/chemical_reaction/sorium
+ name = "Sorium"
+ id = "sorium"
+ result = "sorium"
+ required_reagents = list("mercury" = 1, "oxygen" = 1, "nitrogen" = 1, "carbon" = 1)
+ result_amount = 4
+ required_temp = 474
+
+/datum/reagent/sorium/reaction_turf(var/turf/simulated/T, var/volume)
+ if(istype(T, /turf/simulated/floor/))
+ goonchem_vortex(T, 1, 5, 3)
+/datum/reagent/sorium/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
+ if(!istype(M, /mob/living))
+ return
+ if(method == TOUCH)
+ var/turf/simulated/T = get_turf(M)
+ goonchem_vortex(T, 1, 5, 3)
+
+
+/datum/chemical_reaction/sorium/on_reaction(var/datum/reagents/holder, var/created_volume)
+ var/turf/simulated/T = get_turf(holder.my_atom)
+ goonchem_vortex(T, 1, 5, 6)
+
+/datum/reagent/liquid_dark_matter
+ name = "Liquid Dark Matter"
+ id = "liquid_dark_matter"
+ description = "Sucks everything into the detonation point."
+ reagent_state = LIQUID
+ color = "#60A584" //rgb: 96, 165, 132
+
+/datum/chemical_reaction/liquid_dark_matter
+ name = "Liquid Dark Matter"
+ id = "liquid_dark_matter"
+ result = "liquid_dark_matter"
+ required_reagents = list("stable_plasma" = 1, "radium" = 1, "carbon" = 1)
+ result_amount = null
+ required_temp = 474
+
+/*/datum/reagent/liquid_dark_matter/reaction_turf(var/turf/simulated/T, var/volume)
+ if(istype(T, /turf/simulated/floor/))
+ goonchem_vortex(T, 0, 5, 3)
+ return
+/datum/reagent/liquid_dark_matter/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
+ if(!istype(M, /mob/living))
+ return
+ if(method == TOUCH)
+ var/turf/simulated/T = get_turf(M)
+ goonchem_vortex(T, 0, 5, 3)
+ return*/ //o god what the fuck goof
+/datum/chemical_reaction/liquid_dark_matter/on_reaction(var/datum/reagents/holder, var/created_volume)
+ var/turf/simulated/T = get_turf(holder.my_atom)
+ goonchem_vortex(T, 0, 5, 6)
+ return
+
+/proc/goonchem_vortex(var/turf/simulated/T, var/setting_type, var/range, var/pull_times)
+ for(var/atom/movable/X in orange(range, T))
+ if(istype(X, /obj/effect))
+ continue //stop pulling smoke and hotspots please
+ if(istype(X, /atom/movable))
+ if((X) && !X.anchored)
+ if(setting_type)
+ for(var/i = 0, i < pull_times, i++)
+ step_away(X,T)
+ else
+ for(var/i = 0, i < pull_times, i++)
+ step_towards(X,T)
+
+/datum/reagent/blackpowder
+ name = "Black Powder"
+ id = "blackpowder"
+ description = "Explodes. Violently."
+ reagent_state = LIQUID
+ color = "#000000" //rgb: 96, 165, 132
+ metabolization_rate = 0.05
+
+/datum/chemical_reaction/blackpowder
+ name = "Black Powder"
+ id = "blackpowder"
+ result = "blackpowder"
+ required_reagents = list("saltpetre" = 1, "charcoal" = 1, "sulfur" = 1)
+ result_amount = 3
+
+/datum/chemical_reaction/blackpowder_explosion
+ name = "Black Powder Kaboom"
+ id = "blackpowder_explosion"
+ result = null
+ required_reagents = list("blackpowder" = 1)
+ result_amount = 1
+ required_temp = 474
+ mix_message = "Sparks start flying around the black powder!"
+
+/datum/chemical_reaction/blackpowder_explosion/on_reaction(var/datum/reagents/holder, var/created_volume)
+ sleep(rand(50,100))
+ var/turf/simulated/T = get_turf(holder.my_atom)
+ var/ex_severe = round(created_volume / 100)
+ var/ex_heavy = round(created_volume / 42)
+ var/ex_light = round(created_volume / 21)
+ var/ex_flash = round(created_volume / 8)
+ explosion(T,ex_severe,ex_heavy,ex_light,ex_flash, 1)
+ return
diff --git a/code/modules/reagents/Chemistry-Goon-Readme.dm b/code/modules/reagents/Chemistry-Goon-Readme.dm
new file mode 100644
index 0000000000000..0731e28ba93fb
--- /dev/null
+++ b/code/modules/reagents/Chemistry-Goon-Readme.dm
@@ -0,0 +1,34 @@
+/*
+ Credit goes to Cogwerks, and all the other goonstation coders
+ for the original idea and implementation of this over at goonstation.
+
+ THE REQUESTED DON'T PORT LIST: IF YOU PORT THESE THE GOONS WILL MURDER US IN OUR SLEEP SO PLEASE DON'T KTHX - Iamgoofball
+ Any of the Secret Chems
+ Goon in-joke chems (Eg. Cat Drugs, Hairgrownium)
+ Liquid Electricity
+ Rajajajah
+
+
+/datum/reagent/blankgoonchembase
+ name = "blank goonchem base"
+ id = "blankgoonchembase"
+ description = "A blank chem"
+ reagent_state = LIQUID
+ color = "#60A584" // rgb: 96, 165, 132
+
+
+/datum/reagent/blankgoonchembase/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ ..()
+ return
+
+/datum/chemical_reaction/blankgoonchembase
+ name = "blank goonchem base"
+ id = "blankgoonchembase"
+ result = "blankgoonchembase"
+ required_reagents = list("diphenhydramine" = 1, "morphine" = 1, "cleaner" = 1)
+ result_amount = 3
+ mix_message = "The mixture dries into a pale blue powder."
+ required_temp = 420
+
+*/
\ No newline at end of file
diff --git a/code/modules/reagents/Chemistry-Goon-Toxins.dm b/code/modules/reagents/Chemistry-Goon-Toxins.dm
new file mode 100644
index 0000000000000..d7066b8abd1c6
--- /dev/null
+++ b/code/modules/reagents/Chemistry-Goon-Toxins.dm
@@ -0,0 +1,207 @@
+#define SOLID 1
+#define LIQUID 2
+#define GAS 3
+
+#define REM REAGENTS_EFFECT_MULTIPLIER
+
+datum/reagent/polonium
+ name = "Polonium"
+ id = "polonium"
+ description = "+8 RAD."
+ reagent_state = LIQUID
+ color = "#CF3600" // rgb: 207, 54, 0
+ metabolization_rate = 0.1
+
+datum/reagent/polonium/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.radiation += 8
+ ..()
+ return
+
+
+datum/reagent/histamine
+ name = "Histamine"
+ id = "histamine"
+ description = "A dose-dependent toxin, ranges from annoying to incredibly lethal."
+ reagent_state = LIQUID
+ color = "#CF3600" // rgb: 207, 54, 0
+ metabolization_rate = 0.2
+ overdose_threshold = 30
+
+datum/reagent/histamine/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ switch(pick(1, 2, 3, 4))
+ if(1)
+ M << "You can barely see!"
+ M.eye_blurry = 3
+ if(2)
+ M.emote("cough")
+ if(3)
+ M.emote("sneeze")
+ if(4)
+ if(prob(75))
+ M << "You scratch at an itch."
+ M.adjustBruteLoss(2*REM)
+ ..()
+ return
+datum/reagent/histamine/overdose_process(var/mob/living/M as mob)
+ M.adjustOxyLoss(pick(1,3)*REM)
+ M.adjustBruteLoss(pick(1,3)*REM)
+ M.adjustToxLoss(pick(1,3)*REM)
+ ..()
+ return
+
+datum/reagent/formaldehyde
+ name = "Formaldehyde"
+ id = "formaldehyde"
+ description = "+1 TOX, 10% chance to decay into 5-15 units of histamine."
+ reagent_state = LIQUID
+ color = "#CF3600" // rgb: 207, 54, 0
+
+datum/reagent/formaldehyde/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.adjustToxLoss(1*REM)
+ if(prob(10))
+ M.reagents.add_reagent("histamine",pick(5,15))
+ M.reagents.remove_reagent("formaldehyde",1)
+ ..()
+ return
+
+/datum/chemical_reaction/formaldehyde
+ name = "formaldehyde"
+ id = "Formaldehyde"
+ result = "formaldehyde"
+ required_reagents = list("ethanol" = 1, "oxygen" = 1, "silver" = 1)
+ result_amount = 3
+ required_temp = 420
+
+datum/reagent/venom
+ name = "Venom"
+ id = "venom"
+ description = "Scaling TOX and BRUTE damage with dose. 25% chance to decay into 5-10 histamine."
+ reagent_state = LIQUID
+ color = "#CF3600" // rgb: 207, 54, 0
+ metabolization_rate = 0.2
+datum/reagent/venom/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.adjustToxLoss((0.1*volume)*REM)
+ M.adjustBruteLoss((0.1*volume)*REM)
+ if(prob(25))
+ M.reagents.add_reagent("histamine",pick(5,10))
+ M.reagents.remove_reagent("venom",1)
+ ..()
+ return
+
+datum/reagent/neurotoxin2
+ name = "Neurotoxin"
+ id = "neurotoxin2"
+ description = "+1 TOX, +1 BRAIN up to 60 before it slows down, confusion, knockout after 17 elapsed cycles."
+ reagent_state = LIQUID
+ color = "#CF3600" // rgb: 207, 54, 0
+ var/cycle_count = 0
+ metabolization_rate = 1
+
+datum/reagent/neurotoxin2/on_mob_life(var/mob/living/M as mob)
+ cycle_count++
+ if(M.brainloss + M.toxloss <= 60)
+ M.adjustBrainLoss(1*REM)
+ M.adjustToxLoss(1*REM)
+ if(cycle_count == 17)
+ M.sleeping += 10 // buffed so it works
+ ..()
+ return
+
+/datum/chemical_reaction/neurotoxin2
+ name = "neurotoxin2"
+ id = "neurotoxin2"
+ result = "neurotoxin2"
+ required_reagents = list("space_drugs" = 1)
+ result_amount = 1
+ required_temp = 370
+
+datum/reagent/cyanide
+ name = "Cyanide"
+ id = "cyanide"
+ description = "+1.5 TOX, 10% chance of +1 LOSEBREATH, 8% chance of stun and extra +2 TOX."
+ reagent_state = LIQUID
+ color = "#CF3600" // rgb: 207, 54, 0
+ metabolization_rate = 0.1
+
+datum/reagent/cyanide/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.adjustToxLoss(1.5*REM)
+ if(prob(10))
+ M.losebreath += 1
+ if(prob(8))
+ M << "You feel horrendously weak!"
+ M.Stun(2)
+ M.adjustToxLoss(2*REM)
+ ..()
+ return
+
+/datum/chemical_reaction/cyanide
+ name = "Cyanide"
+ id = "cyanide"
+ result = "cyanide"
+ required_reagents = list("oil" = 1, "ammonia" = 1, "oxygen" = 1)
+ result_amount = 3
+ required_temp = 380
+
+/datum/reagent/questionmark // food poisoning
+ name = "Bad Food"
+ id = "????"
+ description = "????"
+ reagent_state = LIQUID
+ color = "#CF3600" // rgb: 207, 54, 0
+ metabolization_rate = 0.2
+
+datum/reagent/questionmark/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ M.adjustToxLoss(1*REM)
+ ..()
+ return
+
+datum/reagent/itching_powder
+ name = "Itching Powder"
+ id = "itching_powder"
+ description = "Lots of annoying random effects, chances to do BRUTE damage from scratching. 6% chance to decay into 1-3 units of histamine."
+ reagent_state = LIQUID
+ color = "#CF3600" // rgb: 207, 54, 0
+ metabolization_rate = 0.3
+
+/datum/reagent/itching_powder/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
+ if(method == TOUCH)
+ M.reagents.add_reagent("itching_powder", volume)
+ return
+
+datum/reagent/itching_powder/on_mob_life(var/mob/living/M as mob)
+ if(!M) M = holder.my_atom
+ if(prob(rand(5,50)))
+ M << "You scratch at your head."
+ M.adjustBruteLoss(0.2*REM)
+ if(prob(rand(5,50)))
+ M << "You scratch at your leg."
+ M.adjustBruteLoss(0.2*REM)
+ if(prob(rand(5,50)))
+ M << "You scratch at your arm."
+ M.adjustBruteLoss(0.2*REM)
+ if(prob(6))
+ M.reagents.add_reagent("histamine",rand(1,3))
+ M.reagents.remove_reagent("itching_powder",1)
+ ..()
+ return
+
+/datum/chemical_reaction/itching_powder
+ name = "Itching Powder"
+ id = "itching_powder"
+ result = "itching_powder"
+ required_reagents = list("fuel" = 1, "ammonia" = 1, "charcoal" = 1)
+ result_amount = 3
+
+/datum/chemical_reaction/facid
+ name = "Fluorosulfuric acid"
+ id = "facid"
+ result = "facid"
+ required_reagents = list("sacid" = 1, "fluorine" = 1, "hydrogen" = 1, "potassium" = 1)
+ result_amount = 4
+ required_temp = 380
\ No newline at end of file
diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm
index a43266291d2fa..6041066d7377f 100644
--- a/code/modules/reagents/Chemistry-Holder.dm
+++ b/code/modules/reagents/Chemistry-Holder.dm
@@ -17,7 +17,7 @@ datum/reagents
datum/reagents/New(maximum=100)
maximum_volume = maximum
- SSobj.processing |= src
+
//I dislike having these here but map-objects are initialised before world/New() is called. >_>
if(!chemical_reagents_list)
//Chemical Reagents - Initialises all /datum/reagent into a list indexed by reagent id
@@ -51,16 +51,6 @@ datum/reagents/New(maximum=100)
chemical_reactions_list[id] += D
break // Don't bother adding ourselves to other reagent ids, it is redundant.
-datum/reagents/Destroy()
- ..()
- SSobj.processing.Remove(src)
- for(var/datum/reagent/R in reagent_list)
- qdel(R)
- reagent_list.Cut()
- reagent_list = null
- if(my_atom && my_atom.reagents == src)
- my_atom.reagents = null
-
datum/reagents/proc/remove_any(var/amount=1)
var/total_transfered = 0
var/current_list_element = 1
@@ -215,31 +205,26 @@ datum/reagents/proc/metabolize(var/mob/M)
if(M)
chem_temp = M.bodytemperature
handle_reactions()
-
- for(var/A in reagent_list)
- var/datum/reagent/R = A
- if(!R.holder)
- continue
- if(!M)
- M = R.holder.my_atom
- if(M && R)
- if(M.reagent_check(R) != 1)
- if(R.overdose_threshold)
- if(R.volume >= R.overdose_threshold && !R.overdosed)
+ if(last_tick == 3)
+ last_tick = 1
+ for(var/A in reagent_list)
+ var/datum/reagent/R = A
+ if(M && R)
+ if(M.reagent_check(R) != 1)
+ if(R.volume >= R.overdose_threshold && !R.overdosed && R.overdose_threshold > 0)
R.overdosed = 1
+ M << "You feel like you took too much of [R.name]!"
R.overdose_start(M)
- if(R.addiction_threshold)
- if(R.volume >= R.addiction_threshold && !is_type_in_list(R, addiction_list))
+ if(R.volume >= R.addiction_threshold && !is_type_in_list(R, addiction_list) && R.addiction_threshold > 0)
var/datum/reagent/new_reagent = new R.type()
addiction_list.Add(new_reagent)
- if(R.overdosed)
- R.overdose_process(M)
- if(is_type_in_list(R,addiction_list))
- for(var/datum/reagent/addicted_reagent in addiction_list)
- if(istype(R, addicted_reagent))
- addicted_reagent.addiction_stage = -15 // you're satisfied for a good while.
- R.on_mob_life(M)
-
+ if(R.overdosed)
+ R.overdose_process(M)
+ if(is_type_in_list(R,addiction_list))
+ for(var/datum/reagent/addicted_reagent in addiction_list)
+ if(istype(R, addicted_reagent))
+ addicted_reagent.addiction_stage = -15 // you're satisfied for a good while.
+ R.on_mob_life(M)
if(addiction_tick == 6)
addiction_tick = 1
for(var/A in addiction_list)
@@ -263,13 +248,9 @@ datum/reagents/proc/metabolize(var/mob/M)
M << "You feel like you've gotten over your need for [R.name]."
addiction_list.Remove(R)
addiction_tick++
+ last_tick++
update_total()
-datum/reagents/process()
- for(var/datum/reagent/R in reagent_list)
- R.on_tick()
- return
-
datum/reagents/proc/conditional_update_move(var/atom/A, var/Running = 0)
for(var/datum/reagent/R in reagent_list)
R.on_move (A, Running)
@@ -375,18 +356,19 @@ datum/reagents/proc/isolate_reagent(var/reagent)
update_total()
datum/reagents/proc/del_reagent(var/reagent)
- for(var/datum/reagent/R in reagent_list)
+ for(var/A in reagent_list)
+ var/datum/reagent/R = A
if (R.id == reagent)
- if(istype(my_atom, /mob/living))
- var/mob/living/M = my_atom
- R.on_mob_delete(M)
- qdel(R)
- reagent_list -= R
+ reagent_list -= A
+ del(A)
update_total()
my_atom.on_reagent_change()
check_ignoreslow(my_atom)
check_gofast(my_atom)
check_goreallyfast(my_atom)
+ return 0
+
+
return 1
datum/reagents/proc/check_ignoreslow(var/mob/M)
@@ -398,7 +380,7 @@ datum/reagents/proc/check_ignoreslow(var/mob/M)
datum/reagents/proc/check_gofast(var/mob/M)
if(istype(M, /mob))
- if(M.reagents.has_reagent("unholywater")||M.reagents.has_reagent("nuka_cola"))
+ if(M.reagents.has_reagent("unholywater")||M.reagents.has_reagent("nuka_cola")||M.reagents.has_reagent("hotline"))
return 1
else
M.status_flags &= ~GOTTAGOFAST
@@ -550,6 +532,12 @@ datum/reagents/proc/remove_all_type(var/reagent_type, var/amount, var/strict = 0
return has_removed_reagent
+datum/reagents/proc/delete()
+ for(var/datum/reagent/R in reagent_list)
+ R.holder = null
+ if(my_atom)
+ my_atom.reagents = null
+
//two helper functions to preserve data across reactions (needed for xenoarch)
datum/reagents/proc/get_data(var/reagent_id)
for(var/datum/reagent/D in reagent_list)
@@ -590,6 +578,6 @@ datum/reagents/proc/copy_data(var/datum/reagent/current_reagent)
// Max vol is maximum volume of holder
atom/proc/create_reagents(var/max_vol)
if(reagents)
- qdel(reagents)
+ reagents.delete()
reagents = new/datum/reagents(max_vol)
reagents.my_atom = src
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index 0a8f3b2d1c7c5..496b64678871c 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -575,67 +575,6 @@
desc = "Used to create condiments and other cooking supplies."
condi = 1
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-/obj/machinery/chem_master/constructable
- name = "ChemMaster 2999"
- desc = "Used to seperate chemicals and distribute them in a variety of forms."
-
-/obj/machinery/chem_master/constructable/New()
- ..()
- component_parts = list()
- component_parts += new /obj/item/weapon/circuitboard/chem_master(null)
- component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
- component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(null)
- component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(null)
-
-/obj/machinery/chem_master/constructable/attackby(var/obj/item/B as obj, var/mob/user as mob, params)
-
- if(default_deconstruction_screwdriver(user, "mixer0_nopower", "mixer0_", B))
- if(beaker)
- beaker.loc = src.loc
- beaker = null
- reagents.clear_reagents()
- if(loaded_pill_bottle)
- loaded_pill_bottle.loc = src.loc
- loaded_pill_bottle = null
- return
-
- if(exchange_parts(user, B))
- return
-
- if(panel_open)
- if(istype(B, /obj/item/weapon/crowbar))
- default_deconstruction_crowbar(B)
- return 1
- else
- user << "You can't use the [src.name] while it's panel is opened."
- return 1
-
- if(istype(B, /obj/item/weapon/reagent_containers/glass))
- if(src.beaker)
- user << "A beaker is already loaded into the machine."
- return
- src.beaker = B
- user.drop_item()
- B.loc = src
- user << "You add the beaker to the machine!"
- src.updateUsrDialog()
- icon_state = "mixer1"
-
- else if(!condi && istype(B, /obj/item/weapon/storage/pill_bottle))
- if(src.loaded_pill_bottle)
- user << "A pill bottle is already loaded into the machine."
- return
- src.loaded_pill_bottle = B
- user.drop_item()
- B.loc = src
- user << "You add the pill bottle into the dispenser slot!"
- src.updateUsrDialog()
-
- return
-
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
@@ -983,7 +922,6 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime)
/obj/item/weapon/reagent_containers/food/snacks/grown/wheat = list("flour" = -5),
/obj/item/weapon/reagent_containers/food/snacks/grown/oat = list("flour" = -5),
/obj/item/weapon/reagent_containers/food/snacks/grown/cherries = list("cherryjelly" = 0),
- /obj/item/weapon/reagent_containers/food/snacks/grown/bluecherries = list("bluecherryjelly" = 0),
/obj/item/weapon/reagent_containers/food/snacks/egg = list("eggyolk" = -5),
//Grinder stuff, but only if dry
@@ -1014,8 +952,6 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime)
/obj/item/weapon/reagent_containers/food/snacks/grown/watermelon = list("watermelonjuice" = 0),
/obj/item/weapon/reagent_containers/food/snacks/watermelonslice = list("watermelonjuice" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/berries/poison = list("poisonberryjuice" = 0),
- /obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin = list("pumpkinjuice" = 0),
- /obj/item/weapon/reagent_containers/food/snacks/grown/blumpkin = list("blumpkinjuice" = 0),
)
var/list/dried_items = list(
diff --git a/code/modules/reagents/Chemistry-Readme.dm b/code/modules/reagents/Chemistry-Readme.dm
index 74e9fe0b09358..e3eab685c7b5c 100644
--- a/code/modules/reagents/Chemistry-Readme.dm
+++ b/code/modules/reagents/Chemistry-Readme.dm
@@ -11,7 +11,7 @@ Structure: /////////////////// //////////////////////////
| | |
V V V
- reagents (datums) Reagents. I.e. Water , cryoxadone or mercury.
+ reagents (datums) Reagents. I.e. Water , antitoxins or mercury.
Random important notes:
@@ -198,7 +198,7 @@ About Recipes:
of that reagent. The handle_reaction proc can detect mutiples of the same recipes
so for most cases you want to set the required amount to 1.
- required_catalysts
+ required_catalysts (Added May 2011)
This is a list of the ids of the required catalysts.
Functionally similar to required_reagents, it is a list of reagents that are required
for the reaction. However, unlike required_reagents, catalysts are NOT consumed.
@@ -216,9 +216,6 @@ About Recipes:
Basically like a reagent's data variable. You can set extra requirements for a
reaction with this.
- required_temp
- This is the required temperature.
-
About the Tools:
@@ -247,20 +244,4 @@ About the Tools:
transfer code since you will not be able to use the standard
tools to manipulate it.
-*/
-
-
-
-
-/* GOON CHEMS README:
-
- Credit goes to Cogwerks, and all the other goonstation coders
- for the original idea and implementation of this over at goonstation.
-
- THE REQUESTED DON'T PORT LIST: IF YOU PORT THESE THE GOONS WILL MURDER US IN OUR SLEEP SO PLEASE DON'T KTHX - Iamgoofball
- Any of the Secret Chems
- Goon in-joke chems (Eg. Cat Drugs, Hairgrownium)
- Liquid Electricity
- Rajajajah
-
*/
\ No newline at end of file
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
deleted file mode 100644
index 899f13126704e..0000000000000
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ /dev/null
@@ -1,140 +0,0 @@
-#define SOLID 1
-#define LIQUID 2
-#define GAS 3
-
-#define REM REAGENTS_EFFECT_MULTIPLIER
-
-//The reaction procs must ALWAYS set src = null, this detaches the proc from the object (the reagent)
-//so that it can continue working when the reagent is deleted while the proc is still active.
-
-
-//Various reagents
-//Toxin & acid reagents
-//Hydroponics stuff
-
-datum/reagent
- var/name = "Reagent"
- var/id = "reagent"
- var/description = ""
- var/datum/reagents/holder = null
- var/reagent_state = LIQUID
- var/list/data
- var/current_cycle = 0
- var/volume = 0
- var/color = "#000000" // rgb: 0, 0, 0
- var/can_synth = 1
- var/metabolization_rate = REAGENTS_METABOLISM //how fast the reagent is metabolized by the mob
- var/overrides_metab = 0
- var/overdose_threshold = 0
- var/addiction_threshold = 0
- var/addiction_stage = 0
- var/overdosed = 0 // You fucked up and this is now triggering it's overdose effects, purge that shit quick.
-
-datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references
- ..()
- holder = null
-
-datum/reagent/proc/reaction_mob(var/mob/M, var/method=TOUCH, var/volume, var/show_message = 1) //By default we have a chance to transfer some
- if(!istype(M, /mob/living))
- return 0
- var/datum/reagent/self = src
- src = null //of the reagent to the mob on TOUCHING it.
-
- if(!istype(self.holder.my_atom, /obj/effect/effect/chem_smoke))
- // If the chemicals are in a smoke cloud, do not try to let the chemicals "penetrate" into the mob's system (balance station 13) -- Doohl
-
- if(method == TOUCH)
-
- var/chance = 1
- var/block = 0
-
- for(var/obj/item/clothing/C in M.get_equipped_items())
- if(C.permeability_coefficient < chance) chance = C.permeability_coefficient
- if(istype(C, /obj/item/clothing/suit/bio_suit))
- // bio suits are just about completely fool-proof - Doohl
- // kind of a hacky way of making bio suits more resistant to chemicals but w/e
- if(prob(75))
- block = 1
-
- if(istype(C, /obj/item/clothing/head/bio_hood))
- if(prob(75))
- block = 1
-
- chance = chance * 100
-
- if(prob(chance) && !block)
- if(M.reagents)
- M.reagents.add_reagent(self.id,self.volume/2)
- return 1
-
-datum/reagent/proc/reaction_obj(var/obj/O, var/volume) //By default we transfer a small part of the reagent to the object
- src = null //if it can hold reagents. nope!
- //if(O.reagents)
- // O.reagents.add_reagent(id,volume/3)
- return
-
-datum/reagent/proc/reaction_turf(var/turf/T, var/volume)
- src = null
- return
-
-datum/reagent/proc/on_mob_life(var/mob/living/M as mob)
- current_cycle++
- if(!istype(M, /mob/living))
- return //Noticed runtime errors from facid trying to damage ghosts, this should fix. --NEO
- holder.remove_reagent(src.id, metabolization_rate * M.metabolism_efficiency) //By default it slowly disappears.
- return
-
-// Called when this reagent is removed while inside a mob
-datum/reagent/proc/on_mob_delete(mob/M)
- return
-
-datum/reagent/proc/on_move(var/mob/M)
- return
-
-// Called after add_reagents creates a new reagent.
-datum/reagent/proc/on_new(var/data)
- return
-
-// Called when two reagents of the same are mixing.
-datum/reagent/proc/on_merge(var/data)
- return
-
-datum/reagent/proc/on_update(var/atom/A)
- return
-
-// Called every time reagent containers process.
-datum/reagent/proc/on_tick(var/data)
- return
-
-// Called when the reagent container is hit by an explosion
-datum/reagent/proc/on_ex_act(var/severity)
- return
-
-// Called if the reagent has passed the overdose threshold and is set to be triggering overdose effects
-datum/reagent/proc/overdose_process(var/mob/living/M as mob)
- return
-
-datum/reagent/proc/overdose_start(var/mob/living/M as mob)
- M << "You feel like you took too much of [name]!"
- return
-
-datum/reagent/proc/addiction_act_stage1(var/mob/living/M as mob)
- if(prob(30))
- M << "You feel like some [name] right about now."
- return
-
-datum/reagent/proc/addiction_act_stage2(var/mob/living/M as mob)
- if(prob(30))
- M << "You feel like you need [name]. You just can't get enough."
- return
-
-datum/reagent/proc/addiction_act_stage3(var/mob/living/M as mob)
- if(prob(30))
- M << "You have an intense craving for [name]."
- return
-
-datum/reagent/proc/addiction_act_stage4(var/mob/living/M as mob)
- if(prob(30))
- M << "You're not feeling good at all! You really need some [name]."
- return
-
diff --git a/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm
index 02c41c45711db..0ddd41ef0926a 100644
--- a/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm
@@ -81,7 +81,7 @@ datum/reagent/blob/acid
datum/reagent/blob/acid/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1)
if(method == TOUCH)
- if(prob(50))
+ if(prob(50))
M.acid_act(5,1,5)
if(show_message)
M << "The blob's tendrils melt through your equipment!"
@@ -97,7 +97,7 @@ datum/reagent/blob/radioactive_liquid/reaction_mob(var/mob/living/M as mob, var/
if(method == TOUCH)
if(istype(M, /mob/living/carbon/human))
M.apply_damage(10, BRUTE)
- M.irradiate(40)
+ M.apply_effect(40,IRRADIATE,0) // irradiate the shit out of these fuckers
if(prob(33))
randmuti(M)
if(prob(98))
@@ -147,44 +147,6 @@ datum/reagent/blob/explosive/reaction_mob(var/mob/living/M as mob, var/method=TO
M << "The blob strikes you, and its tendrils explode!"
explosion(M.loc, 0, 0, 1, 0, 0)
-datum/reagent/blob/omnizine
- name = "Omnizine"
- id = "b_omnizine"
- description = ""
- color = "#C8A5DC"
-
-datum/reagent/blob/omnizine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1)
- if(method == TOUCH)
- if(show_message)
- M << "The blob squirts something at you, and you feel great!"
- M.reagents.add_reagent("omnizine", 11)
-
-datum/reagent/blob/morphine
- name = "Morphine"
- id = "b_morphine"
- description = ""
- color = "#335555"
-
-datum/reagent/blob/morphine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1)
- if(method == TOUCH)
- if(show_message)
- M << "The blob squirts something at you, and you feel numb!"
- M.reagents.add_reagent("morphine", 16)
-
-datum/reagent/blob/spacedrugs
- name = "Space drugs"
- id = "b_space_drugs"
- description = ""
- color = "#60A584"
-
-datum/reagent/blob/spacedrugs/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1)
- if(method == TOUCH)
- if(show_message)
- M << "The blob squirts something at you, and you feel funny!"
- M.reagents.add_reagent("space_drugs", 15)
- M.apply_damage(10, TOX)
-
-
/proc/reagent_vortex(var/mob/living/M as mob, var/setting_type)
var/turf/pull = get_turf(M)
for(var/atom/movable/X in orange(4,pull))
@@ -197,7 +159,3 @@ datum/reagent/blob/spacedrugs/reaction_mob(var/mob/living/M as mob, var/method=T
step_away(X,pull)
else
X.throw_at(pull)
-
-
-
-
diff --git a/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm
similarity index 77%
rename from code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm
rename to code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm
index 43650c7206718..79a43aa5d0529 100644
--- a/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm
@@ -1,3 +1,124 @@
+#define SOLID 1
+#define LIQUID 2
+#define GAS 3
+
+#define REM REAGENTS_EFFECT_MULTIPLIER
+
+//The reaction procs must ALWAYS set src = null, this detaches the proc from the object (the reagent)
+//so that it can continue working when the reagent is deleted while the proc is still active.
+
+
+//Various reagents
+//Toxin & acid reagents
+//Hydroponics stuff
+
+datum/reagent
+ var/name = "Reagent"
+ var/id = "reagent"
+ var/description = ""
+ var/datum/reagents/holder = null
+ var/reagent_state = LIQUID
+ var/list/data
+ var/volume = 0
+ //var/list/viruses = list()
+ var/color = "#000000" // rgb: 0, 0, 0 (does not support alpha channels - yet!)
+ var/can_synth = 1
+ var/metabolization_rate = REAGENTS_METABOLISM
+ var/overrides_metab = 0
+ var/overdose_threshold = 0
+ var/addiction_threshold = 0
+ var/addiction_stage = 0
+ var/overdosed = 0 // You fucked up and this is now triggering it's overdose effects, purge that shit quick.
+
+datum/reagent/proc/reaction_mob(var/mob/M, var/method=TOUCH, var/volume, var/show_message = 1) //By default we have a chance to transfer some
+ if(!istype(M, /mob/living))
+ return 0
+ var/datum/reagent/self = src
+ src = null //of the reagent to the mob on TOUCHING it.
+
+ if(!istype(self.holder.my_atom, /obj/effect/effect/chem_smoke))
+ // If the chemicals are in a smoke cloud, do not try to let the chemicals "penetrate" into the mob's system (balance station 13) -- Doohl
+
+ if(method == TOUCH)
+
+ var/chance = 1
+ var/block = 0
+
+ for(var/obj/item/clothing/C in M.get_equipped_items())
+ if(C.permeability_coefficient < chance) chance = C.permeability_coefficient
+ if(istype(C, /obj/item/clothing/suit/bio_suit))
+ // bio suits are just about completely fool-proof - Doohl
+ // kind of a hacky way of making bio suits more resistant to chemicals but w/e
+ if(prob(75))
+ block = 1
+
+ if(istype(C, /obj/item/clothing/head/bio_hood))
+ if(prob(75))
+ block = 1
+
+ chance = chance * 100
+
+ if(prob(chance) && !block)
+ if(M.reagents)
+ M.reagents.add_reagent(self.id,self.volume/2)
+ return 1
+
+datum/reagent/proc/reaction_obj(var/obj/O, var/volume) //By default we transfer a small part of the reagent to the object
+ src = null //if it can hold reagents. nope!
+ //if(O.reagents)
+ // O.reagents.add_reagent(id,volume/3)
+ return
+
+datum/reagent/proc/reaction_turf(var/turf/T, var/volume)
+ src = null
+ return
+
+datum/reagent/proc/on_mob_life(var/mob/living/M as mob)
+ if(!istype(M, /mob/living))
+ return //Noticed runtime errors from facid trying to damage ghosts, this should fix. --NEO
+ holder.remove_reagent(src.id, metabolization_rate * M.metabolism_efficiency) //By default it slowly disappears.
+ return
+
+datum/reagent/proc/on_move(var/mob/M)
+ return
+
+// Called after add_reagents creates a new reagent.
+datum/reagent/proc/on_new(var/data)
+ return
+
+// Called when two reagents of the same are mixing.
+datum/reagent/proc/on_merge(var/data)
+ return
+
+datum/reagent/proc/on_update(var/atom/A)
+ return
+
+// Called if the reagent has passed the overdose threshold and is set to be triggering overdose effects
+datum/reagent/proc/overdose_process(var/mob/living/M as mob)
+ return
+
+datum/reagent/proc/overdose_start(var/mob/living/M as mob)
+ return
+
+datum/reagent/proc/addiction_act_stage1(var/mob/living/M as mob)
+ if(prob(30))
+ M << "You feel like some [name] right about now."
+ return
+
+datum/reagent/proc/addiction_act_stage2(var/mob/living/M as mob)
+ if(prob(30))
+ M << "You feel like you need [name]. You just can't get enough."
+ return
+
+datum/reagent/proc/addiction_act_stage3(var/mob/living/M as mob)
+ if(prob(30))
+ M << "You have an intense craving for [name]."
+ return
+
+datum/reagent/proc/addiction_act_stage4(var/mob/living/M as mob)
+ if(prob(30))
+ M << "You're not feeling good at all! You really need some [name]."
+ return
datum/reagent/blood
data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
@@ -87,6 +208,14 @@ datum/reagent/blood/reaction_turf(var/turf/simulated/T, var/volume)//splash the
newVirus.holder = blood_prop
return
+/* Must check the transfering of reagents and their data first. They all can point to one disease datum.
+
+ Del()
+ if(src.data["virus"])
+ var/datum/disease/D = src.data["virus"]
+ D.cure(0)
+ ..()
+*/
datum/reagent/vaccine
//data must contain virus type
name = "Vaccine"
@@ -115,10 +244,6 @@ datum/reagent/water
color = "#AAAAAA77" // rgb: 170, 170, 170, 77 (alpha)
var/cooling_temperature = 2
-/*
- * Water reaction to turf
- */
-
datum/reagent/water/reaction_turf(var/turf/simulated/T, var/volume)
if (!istype(T)) return
var/CT = cooling_temperature
@@ -126,7 +251,7 @@ datum/reagent/water/reaction_turf(var/turf/simulated/T, var/volume)
if(volume >= 10)
T.MakeSlippery()
- for(var/mob/living/simple_animal/slime/M in T)
+ for(var/mob/living/carbon/slime/M in T)
M.apply_water()
var/hotspot = (locate(/obj/effect/hotspot) in T)
@@ -136,34 +261,22 @@ datum/reagent/water/reaction_turf(var/turf/simulated/T, var/volume)
G.temperature = max(min(G.temperature-(CT*1000),G.temperature/CT),0)
G.react()
qdel(hotspot)
+ T.color = initial(T.color)
return
-/*
- * Water reaction to an object
- */
-
datum/reagent/water/reaction_obj(var/obj/O, var/volume)
src = null
- // Monkey cube
+ O.color = initial(O.color)
if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/monkeycube))
var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O
if(!cube.wrapped)
cube.Expand()
-
- // Dehydrated carp
- if(istype(O,/obj/item/toy/carpplushie/dehy_carp))
- var/obj/item/toy/carpplushie/dehy_carp/dehy = O
- dehy.Swell() // Makes a carp
-
return
-/*
- * Water reaction to a mob
- */
-
datum/reagent/water/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)//Splashing people with water can help put them out!
if(!istype(M, /mob/living))
return
+ M.color = initial(M.color)
if(method == TOUCH)
M.adjust_fire_stacks(-(volume / 10))
if(M.fire_stacks <= 0)
@@ -257,34 +370,6 @@ datum/reagent/slimetoxin
description = "A corruptive toxin produced by slimes."
color = "#13BC5E" // rgb: 19, 188, 94
-datum/reagent/unstableslimetoxin
- name = "Unstable Mutation Toxin"
- id = "unstablemutationtoxin"
- description = "An unstable and unpredictable corruptive toxin produced by slimes."
- color = "#5EFF3B" //RGB: 94, 255, 59
- metabolization_rate = INFINITY //So it instantly removes all of itself
-
-datum/reagent/unstableslimetoxin/on_mob_life(var/mob/living/carbon/human/H as mob)
- ..()
- H << "You crumple in agony as your flesh wildly morphs into new forms!"
- H.visible_message("[H] falls to the ground and screams as their skin bubbles and froths!") //'froths' sounds painful when used with SKIN.
- H.Weaken(3)
- sleep(30)
- var/list/blacklisted_species = list(/datum/species/zombie, /datum/species/skeleton, /datum/species/human, /datum/species/golem, /datum/species/golem/adamantine, /datum/species/shadow)
- var/list/possible_morphs = typesof(/datum/species/) - blacklisted_species
- var/datum/species/mutation = pick(possible_morphs)
- if(prob(90) && mutation && H.dna.species != /datum/species/golem && H.dna.species != /datum/species/golem/adamantine)
- H << "The pain subsides. You feel... different."
- H.dna.species = new mutation()
- H.regenerate_icons()
- if(mutation == /datum/species/slime)
- H.faction |= "slime"
- else
- H.faction -= "slime"
- else
- H << "The pain vanishes suddenly. You feel no different."
- return 1
-
datum/reagent/aslimetoxin
name = "Advanced Mutation Toxin"
id = "amutationtoxin"
@@ -295,6 +380,22 @@ datum/reagent/aslimetoxin/reaction_mob(var/mob/M, var/volume)
src = null
M.ForceContractDisease(new /datum/disease/transformation/slime(0))
+datum/reagent/space_drugs
+ name = "Space drugs"
+ id = "space_drugs"
+ description = "An illegal chemical compound used as drug."
+ color = "#60A584" // rgb: 96, 165, 132
+ metabolization_rate = 0.5 * REAGENTS_METABOLISM
+
+datum/reagent/space_drugs/on_mob_life(var/mob/living/M as mob)
+ M.druggy = max(M.druggy, 15)
+ if(isturf(M.loc) && !istype(M.loc, /turf/space))
+ if(M.canmove)
+ if(prob(10)) step(M, pick(cardinal))
+ if(prob(7)) M.emote(pick("twitch","drool","moan","giggle"))
+ ..()
+ return
+
datum/reagent/serotrotium
name = "Serotrotium"
id = "serotrotium"
@@ -436,6 +537,12 @@ datum/reagent/glycerol
description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity."
color = "#808080" // rgb: 128, 128, 128
+datum/reagent/nitroglycerin
+ name = "Nitroglycerin"
+ id = "nitroglycerin"
+ description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol."
+ color = "#808080" // rgb: 128, 128, 128
+
datum/reagent/radium
name = "Radium"
id = "radium"
@@ -452,8 +559,32 @@ datum/reagent/radium/reaction_turf(var/turf/T, var/volume)
src = null
if(volume >= 3)
if(!istype(T, /turf/space))
- var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/greenglow(T)
- reagentdecal.reagents.add_reagent("uranium", volume)
+ new /obj/effect/decal/cleanable/greenglow(T)
+ return
+
+datum/reagent/thermite
+ name = "Thermite"
+ id = "thermite"
+ description = "Thermite produces an aluminothermic reaction known as a thermite reaction. Can be used to melt walls."
+ reagent_state = SOLID
+ color = "#673910" // rgb: 103, 57, 16
+
+datum/reagent/thermite/reaction_turf(var/turf/T, var/volume)
+ src = null
+ if(volume >= 1 && istype(T, /turf/simulated/wall))
+ var/turf/simulated/wall/Wall = T
+ if(istype(Wall, /turf/simulated/wall/r_wall))
+ Wall.thermite = Wall.thermite+(volume*2.5)
+ else
+ Wall.thermite = Wall.thermite+(volume*10)
+ Wall.overlays = list()
+ Wall.overlays += image('icons/effects/effects.dmi',"thermite")
+ return
+
+datum/reagent/thermite/on_mob_life(var/mob/living/M as mob)
+ M.adjustFireLoss(1)
+ ..()
+ return
datum/reagent/sterilizine
name = "Sterilizine"
@@ -499,8 +630,7 @@ datum/reagent/uranium/reaction_turf(var/turf/T, var/volume)
src = null
if(volume >= 3)
if(!istype(T, /turf/space))
- var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/greenglow(T)
- reagentdecal.reagents.add_reagent("uranium", volume)
+ new /obj/effect/decal/cleanable/greenglow(T)
datum/reagent/aluminium
name = "Aluminium"
@@ -546,14 +676,16 @@ datum/reagent/space_cleaner/reaction_obj(var/obj/O, var/volume)
else
if(O)
O.clean_blood()
+ O.color = initial(O.color)
datum/reagent/space_cleaner/reaction_turf(var/turf/T, var/volume)
if(volume >= 1)
T.clean_blood()
+ T.color = initial(T.color)
for(var/obj/effect/decal/cleanable/C in T)
qdel(C)
- for(var/mob/living/simple_animal/slime/M in T)
+ for(var/mob/living/carbon/slime/M in T)
M.adjustToxLoss(rand(5,10))
if(istype(T, /turf/simulated/floor))
var/turf/simulated/floor/F = T
@@ -563,11 +695,7 @@ datum/reagent/space_cleaner/reaction_turf(var/turf/T, var/volume)
datum/reagent/space_cleaner/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
if(iscarbon(M))
var/mob/living/carbon/C = M
- if(istype(M,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = M
- if(H.lip_style)
- H.lip_style = null
- H.update_body()
+ C.color = initial(C.color)
if(C.r_hand)
C.r_hand.clean_blood()
if(C.l_hand)
@@ -768,170 +896,5 @@ datum/reagent/plantnutriment/robustharvestnutriment
-
-
-
-
-// GOON OTHERS
-
-
-
-datum/reagent/oil
- name = "Oil"
- id = "oil"
- description = "Burns in a small smoky fire, mostly used to get Ash."
- reagent_state = LIQUID
- color = "#C8A5DC"
-
-datum/reagent/stable_plasma
- name = "Stable Plasma"
- id = "stable_plasma"
- description = "Non-flammable plasma locked into a liquid form that cannot ignite or become gaseous/solid."
- reagent_state = LIQUID
- color = "#C8A5DC"
-
-datum/reagent/iodine
- name = "Iodine"
- id = "iodine"
- description = "A slippery solution."
- reagent_state = LIQUID
- color = "#C8A5DC"
-
-datum/reagent/fluorine
- name = "Fluorine"
- id = "fluorine"
- description = "A slippery solution."
- reagent_state = LIQUID
- color = "#C8A5DC"
-
-datum/reagent/carpet
- name = "Carpet"
- id = "carpet"
- description = "A slippery solution."
- reagent_state = LIQUID
- color = "#C8A5DC"
-
-/datum/reagent/carpet/reaction_turf(var/turf/simulated/T, var/volume)
- if(istype(T, /turf/simulated/floor/plating) || istype(T, /turf/simulated/floor/plasteel))
- var/turf/simulated/floor/F = T
- F.ChangeTurf(/turf/simulated/floor/fancy/carpet)
- ..()
- return
-
-datum/reagent/bromine
- name = "Bromine"
- id = "bromine"
- description = "A slippery solution."
- reagent_state = LIQUID
- color = "#C8A5DC"
-
-datum/reagent/phenol
- name = "Phenol"
- id = "phenol"
- description = "Used for certain medical recipes."
- reagent_state = LIQUID
- color = "#C8A5DC"
-
-datum/reagent/ash
- name = "Ash"
- id = "ash"
- description = "Basic ingredient in a couple of recipes."
- reagent_state = LIQUID
- color = "#C8A5DC"
-
-datum/reagent/acetone
- name = "Acetone"
- id = "acetone"
- description = "Common ingredient in other recipes."
- reagent_state = LIQUID
- color = "#C8A5DC"
-
-datum/reagent/colorful_reagent
- name = "Colorful Reagent"
- id = "colorful_reagent"
- description = "A solution."
- reagent_state = LIQUID
- color = "#C8A5DC"
- var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d11141","#00b159","#00aedb","#f37735","#ffc425","#008744","#0057e7","#d62d20","#ffa700")
-
-
-datum/reagent/colorful_reagent/on_mob_life(var/mob/living/M as mob)
- if(M && isliving(M))
- M.color = pick(random_color_list)
- ..()
- return
-
-datum/reagent/colorful_reagent/reaction_mob(var/mob/living/M, var/volume)
- if(M && isliving(M))
- M.color = pick(random_color_list)
- ..()
- return
-datum/reagent/colorful_reagent/reaction_obj(var/obj/O, var/volume)
- if(O)
- O.color = pick(random_color_list)
- ..()
- return
-datum/reagent/colorful_reagent/reaction_turf(var/turf/T, var/volume)
- if(T)
- T.color = pick(random_color_list)
- ..()
- return
-
-datum/reagent/hair_dye
- name = "Quantum Hair Dye"
- id = "hair_dye"
- description = "A solution."
- reagent_state = LIQUID
- color = "#C8A5DC"
- var/list/potential_colors = list("0ad","a0f","f73","d14","d14","0b5","0ad","f73","fc2","084","05e","d22","fa0") // fucking hair code
-
-datum/reagent/hair_dye/reaction_mob(var/mob/living/M, var/volume)
- if(M && ishuman(M))
- var/mob/living/carbon/human/H = M
- H.hair_color = pick(potential_colors)
- H.facial_hair_color = pick(potential_colors)
- H.update_hair()
- ..()
- return
-
-datum/reagent/barbers_aid
- name = "Barber's Aid"
- id = "barbers_aid"
- description = "A solution to hair loss across the world."
- reagent_state = LIQUID
- color = "#C8A5DC"
-
-datum/reagent/barbers_aid/reaction_mob(var/mob/living/M, var/volume)
- if(M && ishuman(M))
- var/mob/living/carbon/human/H = M
- var/datum/sprite_accessory/hair/picked_hair = pick(hair_styles_list)
- var/datum/sprite_accessory/facial_hair/picked_beard = pick(facial_hair_styles_list)
- H.hair_style = picked_hair
- H.facial_hair_style = picked_beard
- H.update_hair()
- ..()
- return
-
-datum/reagent/concentrated_barbers_aid
- name = "Concentrated Barber's Aid"
- id = "concentrated_barbers_aid"
- description = "A concentrated solution to hair loss across the world."
- reagent_state = LIQUID
- color = "#C8A5DC"
-
-datum/reagent/concentrated_barbers_aid/reaction_mob(var/mob/living/M, var/volume)
- if(M && ishuman(M))
- var/mob/living/carbon/human/H = M
- H.hair_style = "Very Long Hair"
- H.facial_hair_style = "Very Long Beard"
- H.update_hair()
- ..()
- return
-
-/datum/reagent/saltpetre
- name = "Saltpetre"
- id = "saltpetre"
- description = "Volatile."
- reagent_state = LIQUID
- color = "#60A584" // rgb: 96, 165, 132
-
+// Undefine the alias for REAGENTS_EFFECT_MULTIPLER
+#undef REM
diff --git a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Alcohols.dm b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Alcohols.dm
index d375a9dcd656d..600de7a525c71 100644
--- a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Alcohols.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Alcohols.dm
@@ -22,15 +22,18 @@ datum/reagent/consumable/ethanol
var/boozepwr = 10 //lower numbers mean the booze will have an effect faster.
datum/reagent/consumable/ethanol/on_mob_life(var/mob/living/M as mob)
+ if(!data)
+ data = 1
+ data++
M.jitteriness = max(M.jitteriness-5,0)
- if(current_cycle >= boozepwr)
+ if(data >= boozepwr)
if (!M.slurring) M.slurring = 1
M.slurring += 4
M.Dizzy(5)
- if(current_cycle >= boozepwr*2.5 && prob(33))
+ if(data >= boozepwr*2.5 && prob(33))
if (!M.confused) M.confused = 1
M.confused += 3
- if(current_cycle >= boozepwr*10 && prob(33))
+ if(data >= boozepwr*10 && prob(33))
M.adjustToxLoss(2)
..()
return
@@ -616,10 +619,3 @@ datum/reagent/consumable/ethanol/silencer/on_mob_life(var/mob/living/M as mob)
M.heal_organ_damage(1,1)
..()
return
-
-datum/reagent/consumable/ethanol/drunkenblumpkin
- name = "Drunken Blumpkin"
- id = "drunkenblumpkin"
- description = "A weird mix of whiskey and blumpkin juice."
- color = "#1EA0FF" // rgb: 102, 67, 0
- boozepwr = 35
\ No newline at end of file
diff --git a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Drinks.dm
index 2ba1088cda7bf..3e5ddf8d0dcd9 100644
--- a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Drinks.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Drinks.dm
@@ -1,4 +1,8 @@
+#define REM REAGENTS_EFFECT_MULTIPLIER
+
+
+
/////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////// DRINKS BELOW, Beer is up there though, along with cola. Cap'n Pete's Cuban Spiced Rum////////////////////////////////
@@ -49,12 +53,15 @@ datum/reagent/consumable/carrotjuice
datum/reagent/consumable/carrotjuice/on_mob_life(var/mob/living/M as mob)
M.eye_blurry = max(M.eye_blurry-1 , 0)
M.eye_blind = max(M.eye_blind-1 , 0)
- switch(current_cycle)
+ if(!data)
+ data = 1
+ switch(data)
if(1 to 20)
//nothing
if(21 to INFINITY)
- if (prob(current_cycle-10))
+ if (prob(data-10))
M.disabilities &= ~NEARSIGHT
+ data++
..()
return
@@ -395,66 +402,6 @@ datum/reagent/consumable/doctor_delight
description = "A gulp a day keeps the MediBot away. That's probably for the best."
color = "#FF8CFF" // rgb: 255, 140, 255
-datum/reagent/consumable/chocolatepudding
- name = "Chocolate Pudding"
- id = "chocolatepudding"
- description = "A great dessert for chocolate lovers."
- color = "#800000"
- nutriment_factor = 4 * REAGENTS_METABOLISM
-
-datum/reagent/consumable/vanillapudding
- name = "Vanilla Pudding"
- id = "vanillapudding"
- description = "A great dessert for vanilla lovers."
- color = "#FAFAD2"
- nutriment_factor = 4 * REAGENTS_METABOLISM
-
-datum/reagent/consumable/cherryshake
- name = "Cherry Shake"
- id = "cherryshake"
- description = "A cherry flavored milkshake."
- color = "#FFB6C1"
- nutriment_factor = 4 * REAGENTS_METABOLISM
-
-datum/reagent/consumable/bluecherryshake
- name = "Blue Cherry Shake"
- id = "bluecherryshake"
- description = "An exotic milkshake."
- color = "#00F1FF"
- nutriment_factor = 4 * REAGENTS_METABOLISM
-
-datum/reagent/consumable/pumpkin_latte
- name = "Pumpkin Latte"
- id = "pumpkin_latte"
- description = "A mix of pumpkin juice and coffee."
- color = "#F4A460"
- nutriment_factor = 3 * REAGENTS_METABOLISM
-
-datum/reagent/consumable/gibbfloats
- name = "Gibb Floats"
- id = "gibbfloats"
- description = "Icecream on top of a Dr. Gibb glass."
- color = "#B22222"
- nutriment_factor = 3 * REAGENTS_METABOLISM
-
-datum/reagent/consumable/pumpkinjuice
- name = "Pumpkin Juice"
- id = "pumpkinjuice"
- description = "Juiced from real pumpkin."
- color = "#FFA500"
-
-datum/reagent/consumable/blumpkinjuice
- name = "Blumpkin Juice"
- id = "blumpkinjuice"
- description = "Juiced from real blumpkin."
- color = "#00BFFF"
-
-datum/reagent/consumable/triple_citrus
- name = "Triple Citrus"
- id = "triple_citrus"
- description = "A solution."
- color = "#C8A5DC"
-
//////////////////////////////////////////////The ten friggen million reagents that get you drunk//////////////////////////////////////////////
@@ -471,7 +418,10 @@ datum/reagent/consumable/atomicbomb/on_mob_life(var/mob/living/M as mob)
if (!M.slurring)
M.slurring = 1
M.slurring += 3
- switch(current_cycle)
+ if(!data)
+ data = 1
+ data++
+ switch(data)
if(51 to 200)
M.sleeping += 1
if(201 to INFINITY)
@@ -487,19 +437,20 @@ datum/reagent/consumable/gargle_blaster
color = "#664300" // rgb: 102, 67, 0
datum/reagent/consumable/gargle_blaster/on_mob_life(var/mob/living/M as mob)
+ if(!data)
+ data = 1
+ data++
M.dizziness +=6
- switch(current_cycle)
- if(15 to 45)
- if(!M.slurring)
- M.slurring = 1
- M.slurring += 3
- if(45 to 55)
- if(prob(50))
- M.confused = max(M.confused+3,0)
- if(55 to 200)
- M.druggy = max(M.druggy, 55)
- if(200 to INFINITY)
- M.adjustToxLoss(2)
+ if(data >= 15 && data <45)
+ if (!M.slurring)
+ M.slurring = 1
+ M.slurring += 3
+ else if(data >= 45 && prob(50) && data <55)
+ M.confused = max(M.confused+3,0)
+ else if(data >=55)
+ M.druggy = max(M.druggy, 55)
+ else if(data >=200)
+ M.adjustToxLoss(2)
..()
return
@@ -511,19 +462,20 @@ datum/reagent/consumable/neurotoxin
datum/reagent/consumable/neurotoxin/on_mob_life(var/mob/living/carbon/M as mob)
M.weakened = max(M.weakened, 3)
+ if(!data)
+ data = 1
+ data++
M.dizziness +=6
- switch(current_cycle)
- if(15 to 45)
- if(!M.slurring)
- M.slurring = 1
- M.slurring += 3
- if(45 to 55)
- if(prob(50))
- M.confused = max(M.confused+3,0)
- if(55 to 200)
- M.druggy = max(M.druggy, 55)
- if(200 to INFINITY)
- M.adjustToxLoss(2)
+ if(data >= 15 && data <45)
+ if (!M.slurring)
+ M.slurring = 1
+ M.slurring += 3
+ else if(data >= 45 && prob(50) && data <55)
+ M.confused = max(M.confused+3,0)
+ else if(data >=55)
+ M.druggy = max(M.druggy, 55)
+ else if(data >=200)
+ M.adjustToxLoss(2)
..()
return
@@ -537,7 +489,10 @@ datum/reagent/consumable/hippies_delight
datum/reagent/consumable/hippies_delight/on_mob_life(var/mob/living/M as mob)
M.druggy = max(M.druggy, 50)
- switch(current_cycle)
+ if(!data)
+ data = 1
+ data++
+ switch(data)
if(1 to 5)
if (!M.slurring) M.slurring = 1
M.Dizzy(10)
@@ -563,3 +518,7 @@ datum/reagent/consumable/hippies_delight/on_mob_life(var/mob/living/M as mob)
if(prob(30)) M.adjustToxLoss(2)
..()
return
+
+
+// Undefine the alias for REAGENTS_EFFECT_MULTIPLER
+#undef REM
\ No newline at end of file
diff --git a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm
index e10d2af11ece4..03da7a121b377 100644
--- a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm
@@ -13,7 +13,6 @@ datum/reagent/consumable
var/nutriment_factor = 1 * REAGENTS_METABOLISM
datum/reagent/consumable/on_mob_life(var/mob/living/M as mob)
- current_cycle++
M.nutrition += nutriment_factor
holder.remove_reagent(src.id, metabolization_rate)
@@ -59,6 +58,7 @@ datum/reagent/consumable/sugar
datum/reagent/consumable/sugar/overdose_start(var/mob/living/M as mob)
M << "You go into hyperglycaemic shock! Lay off the twinkies!"
M.sleeping += 30
+ ..()
return
datum/reagent/consumable/sugar/overdose_process(var/mob/living/M as mob)
@@ -95,58 +95,27 @@ datum/reagent/consumable/capsaicin
color = "#B31008" // rgb: 179, 16, 8
datum/reagent/consumable/capsaicin/on_mob_life(var/mob/living/M as mob)
- switch(current_cycle)
+ if(!data)
+ data = 1
+ switch(data)
if(1 to 15)
M.bodytemperature += 5 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(holder.has_reagent("cryostylane"))
- holder.remove_reagent("cryostylane", 5)
- if(isslime(M))
+ if(holder.has_reagent("frostoil"))
+ holder.remove_reagent("frostoil", 5)
+ if(istype(M, /mob/living/carbon/slime))
M.bodytemperature += rand(5,20)
if(15 to 25)
M.bodytemperature += 10 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(isslime(M))
+ if(istype(M, /mob/living/carbon/slime))
M.bodytemperature += rand(10,20)
if(25 to INFINITY)
M.bodytemperature += 15 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(isslime(M))
+ if(istype(M, /mob/living/carbon/slime))
M.bodytemperature += rand(15,20)
+ data++
..()
return
-datum/reagent/consumable/frostoil
- name = "Frost Oil"
- id = "frostoil"
- description = "A special oil that noticably chills the body. Extraced from Icepeppers."
- color = "#B31008" // rgb: 139, 166, 233
-
-datum/reagent/consumable/frostoil/on_mob_life(var/mob/living/M as mob)
- switch(current_cycle)
- if(1 to 15)
- M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(holder.has_reagent("capsaicin"))
- holder.remove_reagent("capsaicin", 5)
- if(isslime(M))
- M.bodytemperature -= rand(5,20)
- if(15 to 25)
- M.bodytemperature -= 15 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(isslime(M))
- M.bodytemperature -= rand(10,20)
- if(25 to INFINITY)
- M.bodytemperature -= 20 * TEMPERATURE_DAMAGE_COEFFICIENT
- if(prob(1))
- M.emote("shiver")
- if(isslime(M))
- M.bodytemperature -= rand(15,20)
- ..()
- return
-
-datum/reagent/consumable/frostoil/reaction_turf(var/turf/simulated/T, var/volume)
- if(volume >= 5)
- for(var/mob/living/simple_animal/slime/M in T)
- M.adjustToxLoss(rand(15,30))
- //if(istype(T))
- // T.atmos_spawn_air(SPAWN_COLD)
-
datum/reagent/consumable/condensedcapsaicin
name = "Condensed Capsaicin"
id = "condensedcapsaicin"
@@ -221,6 +190,42 @@ datum/reagent/consumable/condensedcapsaicin/on_mob_life(var/mob/living/M as mob)
..()
return
+datum/reagent/consumable/frostoil
+ name = "Frost Oil"
+ id = "frostoil"
+ description = "A special oil that noticably chills the body. Extraced from Icepeppers."
+ color = "#B31008" // rgb: 139, 166, 233
+
+datum/reagent/consumable/frostoil/on_mob_life(var/mob/living/M as mob)
+ if(!data) data = 1
+ switch(data)
+ if(1 to 15)
+ M.bodytemperature -= 10 * TEMPERATURE_DAMAGE_COEFFICIENT
+ if(holder.has_reagent("capsaicin"))
+ holder.remove_reagent("capsaicin", 5)
+ if(istype(M, /mob/living/carbon/slime))
+ M.bodytemperature -= rand(5,20)
+ if(15 to 25)
+ M.bodytemperature -= 15 * TEMPERATURE_DAMAGE_COEFFICIENT
+ if(istype(M, /mob/living/carbon/slime))
+ M.bodytemperature -= rand(10,20)
+ if(25 to INFINITY)
+ M.bodytemperature -= 20 * TEMPERATURE_DAMAGE_COEFFICIENT
+ if(prob(1))
+ M.emote("shiver")
+ if(istype(M, /mob/living/carbon/slime))
+ M.bodytemperature -= rand(15,20)
+ data++
+ ..()
+ return
+
+datum/reagent/consumable/frostoil/reaction_turf(var/turf/simulated/T, var/volume)
+ if(volume >= 5)
+ for(var/mob/living/carbon/slime/M in T)
+ M.adjustToxLoss(rand(15,30))
+ //if(istype(T))
+ // T.atmos_spawn_air(SPAWN_COLD)
+
datum/reagent/consumable/sodiumchloride
name = "Table Salt"
id = "sodiumchloride"
@@ -265,7 +270,9 @@ datum/reagent/mushroomhallucinogen
datum/reagent/mushroomhallucinogen/on_mob_life(var/mob/living/M as mob)
M.druggy = max(M.druggy, 30)
- switch(current_cycle)
+ if(!data)
+ data = 1
+ switch(data)
if(1 to 5)
if (!M.slurring)
M.slurring = 1
@@ -288,6 +295,7 @@ datum/reagent/mushroomhallucinogen/on_mob_life(var/mob/living/M as mob)
M.druggy = max(M.druggy, 40)
if(prob(30))
M.emote(pick("twitch","giggle"))
+ data++
..()
return
@@ -373,8 +381,7 @@ datum/reagent/consumable/flour
datum/reagent/consumable/flour/reaction_turf(var/turf/T, var/volume)
src = null
if(!istype(T, /turf/space))
- var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/flour(T)
- reagentdecal.reagents.add_reagent("flour", volume)
+ new /obj/effect/decal/cleanable/flour(T)
datum/reagent/consumable/cherryjelly
name = "Cherry Jelly"
@@ -382,12 +389,6 @@ datum/reagent/consumable/cherryjelly
description = "Totally the best. Only to be spread on foods with excellent lateral symmetry."
color = "#801E28" // rgb: 128, 30, 40
-datum/reagent/consumable/bluecherryjelly
- name = "Blue Cherry Jelly"
- id = "bluecherryjelly"
- description = "Blue and tastier kind of cherry jelly."
- color = "#00F0FF"
-
datum/reagent/consumable/rice
name = "Rice"
id = "rice"
@@ -408,21 +409,4 @@ datum/reagent/consumable/eggyolk
name = "Egg Yolk"
id = "eggyolk"
description = "It's full of protein."
- color = "#FFB500"
-
-datum/reagent/consumable/corn_starch
- name = "Corn Starch"
- id = "corn_starch"
- description = "A slippery solution."
- color = "#C8A5DC"
-
-datum/reagent/consumable/corn_syrup
- name = "Corn Syrup"
- id = "corn_syrup"
- description = "Decays into sugar."
- color = "#C8A5DC"
-
-datum/reagent/consumable/corn_syrup/on_mob_life(var/mob/living/M as mob)
- M.reagents.add_reagent("sugar", 3)
- M.reagents.remove_reagent("corn_syrup", 1)
- ..()
+ color = "#FFB500"
\ No newline at end of file
diff --git a/code/modules/reagents/Chemistry-Reagents/Drug-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Drug-Reagents.dm
deleted file mode 100644
index 7feef1e8996cf..0000000000000
--- a/code/modules/reagents/Chemistry-Reagents/Drug-Reagents.dm
+++ /dev/null
@@ -1,338 +0,0 @@
-
-
-datum/reagent/drug
- name = "Drug"
- id = "drug"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
-
-datum/reagent/drug/space_drugs
- name = "Space drugs"
- id = "space_drugs"
- description = "An illegal chemical compound used as drug."
- color = "#60A584" // rgb: 96, 165, 132
- overdose_threshold = 25
-
-datum/reagent/drug/space_drugs/on_mob_life(var/mob/living/M as mob)
- M.druggy = max(M.druggy, 15)
- if(isturf(M.loc) && !istype(M.loc, /turf/space))
- if(M.canmove)
- if(prob(10)) step(M, pick(cardinal))
- if(prob(7))
- M.emote(pick("twitch","drool","moan","giggle"))
- ..()
- return
-
-datum/reagent/drug/space_drugs/overdose_process(var/mob/living/M as mob)
- if(prob(20))
- M.hallucination = max(M.hallucination, 5)
- M.adjustBrainLoss(0.25*REM)
- M.adjustToxLoss(0.25*REM)
- ..()
- return
-
-datum/reagent/drug/nicotine
- name = "Nicotine"
- id = "nicotine"
- description = "Slightly reduces stun times. If overdosed it will deal toxin and oxygen damage."
- reagent_state = LIQUID
- color = "#60A584" // rgb: 96, 165, 132
- overdose_threshold = 35
- addiction_threshold = 30
-
-datum/reagent/drug/nicotine/on_mob_life(var/mob/living/M as mob)
- var/smoke_message = pick("You can just feel your lungs dying!", "You feel relaxed.", "You feel calmed.", "You feel the lung cancer forming.", "You feel the money you wasted.", "You feel like a space cowboy.", "You feel rugged.")
- if(prob(5))
- M << "[smoke_message]"
- M.AdjustStunned(-1)
- M.adjustStaminaLoss(-0.5*REM)
- ..()
- return
-
-datum/reagent/drug/nicotine/overdose_process(var/mob/living/M as mob)
- if(prob(20))
- M << "You feel like you smoked too much."
- M.adjustToxLoss(0.5*REM)
- M.adjustOxyLoss(0.5*REM)
- ..()
- return
-
-datum/reagent/drug/crank
- name = "Crank"
- id = "crank"
- description = "Reduces stun times by about 200%. If overdosed or addicted it will deal significant Toxin, Brute and Brain damage."
- reagent_state = LIQUID
- color = "#60A584" // rgb: 96, 165, 132
- overdose_threshold = 20
- addiction_threshold = 10
-
-datum/reagent/drug/crank/on_mob_life(var/mob/living/M as mob)
- var/high_message = pick("You feel jittery.", "You feel like you gotta go fast.", "You feel like you need to step it up.")
- if(prob(5))
- M << "[high_message]"
- M.AdjustParalysis(-1)
- M.AdjustStunned(-1)
- M.AdjustWeakened(-1)
- ..()
- return
-datum/reagent/drug/crank/overdose_process(var/mob/living/M as mob)
- M.adjustBrainLoss(2*REM)
- M.adjustToxLoss(2*REM)
- M.adjustBruteLoss(2*REM)
- ..()
- return
-
-datum/reagent/drug/crank/addiction_act_stage1(var/mob/living/M as mob)
- M.adjustBrainLoss(5*REM)
- ..()
- return
-datum/reagent/drug/crank/addiction_act_stage2(var/mob/living/M as mob)
- M.adjustToxLoss(5*REM)
- ..()
- return
-datum/reagent/drug/crank/addiction_act_stage3(var/mob/living/M as mob)
- M.adjustBruteLoss(5*REM)
- ..()
- return
-datum/reagent/drug/crank/addiction_act_stage4(var/mob/living/M as mob)
- M.adjustBrainLoss(5*REM)
- M.adjustToxLoss(5*REM)
- M.adjustBruteLoss(5*REM)
- ..()
- return
-
-/datum/reagent/drug/krokodil
- name = "Krokodil"
- id = "krokodil"
- description = "Cools and calms you down. If overdosed it will deal significant Brain and Toxin damage. If addicted it will begin to deal fatal amounts of Brute damage as the subject's skin falls off."
- reagent_state = LIQUID
- color = "#60A584" // rgb: 96, 165, 132
- overdose_threshold = 20
- addiction_threshold = 15
-
-
-/datum/reagent/drug/krokodil/on_mob_life(var/mob/living/M as mob)
- var/high_message = pick("You feel calm.", "You feel collected.", "You feel like you need to relax.")
- if(prob(5))
- M << "[high_message]"
- ..()
- return
-
-/datum/reagent/drug/krokodil/overdose_process(var/mob/living/M as mob)
- M.adjustBrainLoss(0.25*REM)
- M.adjustToxLoss(0.25*REM)
- ..()
- return
-
-
-/datum/reagent/drug/krokodil/addiction_act_stage1(var/mob/living/M as mob)
- M.adjustBrainLoss(2*REM)
- M.adjustToxLoss(2*REM)
- ..()
- return
-/datum/reagent/krokodil/addiction_act_stage2(var/mob/living/M as mob)
- if(prob(25))
- M << "Your skin feels loose..."
- ..()
- return
-/datum/reagent/drug/krokodil/addiction_act_stage3(var/mob/living/M as mob)
- if(prob(25))
- M << "Your skin starts to peel away..."
- M.adjustBruteLoss(3*REM)
- ..()
- return
-
-/datum/reagent/drug/krokodil/addiction_act_stage4(var/mob/living/carbon/human/M as mob)
- if(!istype(M.dna.species, /datum/species/cosmetic_zombie))
- M << "Your skin falls off easily!"
- M.adjustBruteLoss(50*REM) // holy shit your skin just FELL THE FUCK OFF
- hardset_dna(M, null, null, null, null, /datum/species/cosmetic_zombie)
- else
- M.adjustBruteLoss(5*REM)
- ..()
- return
-
-/datum/reagent/drug/methamphetamine
- name = "Methamphetamine"
- id = "methamphetamine"
- description = "Reduces stun times by about 300%, speeds the user up, and allows the user to quickly recover stamina while dealing a small amount of Brain damage. If overdosed the subject will move randomly, laugh randomly, drop items and suffer from Toxin and Brain damage. If addicted the subject will constantly jitter and drool, before becoming dizzy and losing motor control and eventually suffer heavy toxin damage."
- reagent_state = LIQUID
- color = "#60A584" // rgb: 96, 165, 132
- overdose_threshold = 20
- addiction_threshold = 10
- metabolization_rate = 0.75 * REAGENTS_METABOLISM
-
-/datum/reagent/drug/methamphetamine/on_mob_life(var/mob/living/M as mob)
- var/high_message = pick("You feel hyper.", "You feel like you need to go faster.", "You feel like you can run the world.")
- if(prob(5))
- M << "[high_message]"
- M.AdjustParalysis(-2)
- M.AdjustStunned(-2)
- M.AdjustWeakened(-2)
- M.adjustStaminaLoss(-2)
- M.status_flags |= GOTTAGOREALLYFAST
- M.Jitter(2)
- M.adjustBrainLoss(0.25)
- if(prob(5))
- M.emote(pick("twitch", "shiver"))
- ..()
- return
-
-/datum/reagent/drug/methamphetamine/overdose_process(var/mob/living/M as mob)
- if(M.canmove && !istype(M.loc, /atom/movable))
- for(var/i = 0, i < 4, i++)
- step(M, pick(cardinal))
- if(prob(20))
- M.emote("laugh")
- if(prob(33))
- M.visible_message("[M]'s hands flip out and flail everywhere!")
- var/obj/item/I = M.get_active_hand()
- if(I)
- M.drop_item()
- ..()
- M.adjustToxLoss(1)
- M.adjustBrainLoss(pick(0.5, 0.6, 0.7, 0.8, 0.9, 1))
- return
-
-/datum/reagent/drug/methamphetamine/addiction_act_stage1(var/mob/living/M as mob)
- M.Jitter(5)
- if(prob(20))
- M.emote(pick("twitch","drool","moan"))
- ..()
- return
-/datum/reagent/drug/methamphetamine/addiction_act_stage2(var/mob/living/M as mob)
- M.Jitter(10)
- M.Dizzy(10)
- if(prob(30))
- M.emote(pick("twitch","drool","moan"))
- ..()
- return
-/datum/reagent/drug/methamphetamine/addiction_act_stage3(var/mob/living/M as mob)
- if(M.canmove && !istype(M.loc, /atom/movable))
- for(var/i = 0, i < 4, i++)
- step(M, pick(cardinal))
- M.Jitter(15)
- M.Dizzy(15)
- if(prob(40))
- M.emote(pick("twitch","drool","moan"))
- ..()
- return
-/datum/reagent/drug/methamphetamine/addiction_act_stage4(var/mob/living/carbon/human/M as mob)
- if(M.canmove && !istype(M.loc, /atom/movable))
- for(var/i = 0, i < 8, i++)
- step(M, pick(cardinal))
- M.Jitter(20)
- M.Dizzy(20)
- M.adjustToxLoss(5)
- if(prob(50))
- M.emote(pick("twitch","drool","moan"))
- ..()
- return
-
-/datum/reagent/drug/bath_salts
- name = "Bath Salts"
- id = "bath_salts"
- description = "Makes you nearly impervious to stuns and grants a stamina regeneration buff, but you will be a nearly uncontrollable tramp-bearded raving lunatic."
- reagent_state = LIQUID
- color = "#60A584" // rgb: 96, 165, 132
- overdose_threshold = 20
- addiction_threshold = 10
-
-
-/datum/reagent/drug/bath_salts/on_mob_life(var/mob/living/M as mob)
- var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.")
- if(prob(5))
- M << "[high_message]"
- M.AdjustParalysis(-3)
- M.AdjustStunned(-3)
- M.AdjustWeakened(-3)
- M.adjustStaminaLoss(-5)
- M.adjustBrainLoss(0.5)
- M.adjustToxLoss(0.1)
- M.hallucination += 10
- if(M.canmove && !istype(M.loc, /atom/movable))
- step(M, pick(cardinal))
- step(M, pick(cardinal))
- ..()
- return
-
-/datum/reagent/drug/bath_salts/overdose_process(var/mob/living/M as mob)
- M.hallucination += 10
- if(M.canmove && !istype(M.loc, /atom/movable))
- for(var/i = 0, i < 8, i++)
- step(M, pick(cardinal))
- if(prob(20))
- M.emote(pick("twitch","drool","moan"))
- if(prob(33))
- var/obj/item/I = M.get_active_hand()
- if(I)
- M.drop_item()
- ..()
- return
-
-/datum/reagent/drug/bath_salts/addiction_act_stage1(var/mob/living/M as mob)
- M.hallucination += 10
- if(M.canmove && !istype(M.loc, /atom/movable))
- for(var/i = 0, i < 8, i++)
- step(M, pick(cardinal))
- M.Jitter(5)
- M.adjustBrainLoss(10)
- if(prob(20))
- M.emote(pick("twitch","drool","moan"))
- ..()
- return
-/datum/reagent/drug/bath_salts/addiction_act_stage2(var/mob/living/M as mob)
- M.hallucination += 20
- if(M.canmove && !istype(M.loc, /atom/movable))
- for(var/i = 0, i < 8, i++)
- step(M, pick(cardinal))
- M.Jitter(10)
- M.Dizzy(10)
- M.adjustBrainLoss(10)
- if(prob(30))
- M.emote(pick("twitch","drool","moan"))
- ..()
- return
-/datum/reagent/drug/bath_salts/addiction_act_stage3(var/mob/living/M as mob)
- M.hallucination += 30
- if(M.canmove && !istype(M.loc, /atom/movable))
- for(var/i = 0, i < 12, i++)
- step(M, pick(cardinal))
- M.Jitter(15)
- M.Dizzy(15)
- M.adjustBrainLoss(10)
- if(prob(40))
- M.emote(pick("twitch","drool","moan"))
- ..()
- return
-/datum/reagent/drug/bath_salts/addiction_act_stage4(var/mob/living/carbon/human/M as mob)
- M.hallucination += 40
- if(M.canmove && !istype(M.loc, /atom/movable))
- for(var/i = 0, i < 16, i++)
- step(M, pick(cardinal))
- M.Jitter(50)
- M.Dizzy(50)
- M.adjustToxLoss(5)
- M.adjustBrainLoss(10)
- if(prob(50))
- M.emote(pick("twitch","drool","moan"))
- ..()
- return
-
-/datum/reagent/drug/aranesp
- name = "Aranesp"
- id = "aranesp"
- description = "Amps you up and gets you going, fixes all stamina damage you might have but can cause toxin and oxygen damage.."
- reagent_state = LIQUID
- color = "#60A584" // rgb: 96, 165, 132
-
-/datum/reagent/drug/aranesp/on_mob_life(var/mob/living/M as mob)
- var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.")
- if(prob(5))
- M << "[high_message]"
- M.adjustStaminaLoss(-18)
- M.adjustToxLoss(0.5)
- if(prob(50))
- M.losebreath++
- M.adjustOxyLoss(1)
- ..()
- return
diff --git a/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm
index 700315b3e36bb..2fc73900f9a39 100644
--- a/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm
@@ -1,4 +1,6 @@
+#define REM REAGENTS_EFFECT_MULTIPLIER
+
//////////////////////////////////////////////////////////////////////////////////////////
// MEDICINE REAGENTS
//////////////////////////////////////////////////////////////////////////////////////
@@ -10,9 +12,22 @@ datum/reagent/medicine
id = "medicine"
datum/reagent/medicine/on_mob_life(var/mob/living/M as mob)
- current_cycle++
holder.remove_reagent(src.id, metabolization_rate / M.metabolism_efficiency) //medicine reagents stay longer if you have a better metabolism
+datum/reagent/medicine/lipozine
+ name = "Lipozine" // The anti-nutriment.
+ id = "lipozine"
+ description = "A chemical compound that causes a powerful fat-burning reaction."
+ color = "#BBEDA4" // rgb: 187, 237, 164
+
+datum/reagent/medicine/lipozine/on_mob_life(var/mob/living/M as mob)
+ M.nutrition -= 10 * REAGENTS_METABOLISM
+ M.overeatduration = 0
+ if(M.nutrition < 0)//Prevent from going into negatives.
+ M.nutrition = 0
+ ..()
+ return
+
datum/reagent/medicine/leporazine
name = "Leporazine"
id = "leporazine"
@@ -33,6 +48,7 @@ datum/reagent/medicine/adminordrazine //An OP chemical for admins
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/medicine/adminordrazine/on_mob_life(var/mob/living/carbon/M as mob)
+ if(!M) M = holder.my_atom ///This can even heal dead people.
M.reagents.remove_all_type(/datum/reagent/toxin, 5*REM, 0, 1)
M.setCloneLoss(0)
M.setOxyLoss(0)
@@ -125,7 +141,10 @@ datum/reagent/medicine/rezadone
color = "#669900" // rgb: 102, 153, 0
datum/reagent/medicine/rezadone/on_mob_life(var/mob/living/M as mob)
- switch(current_cycle)
+ if(!data)
+ data = 1
+ data++
+ switch(data)
if(1 to 15)
M.adjustCloneLoss(-1)
M.heal_organ_damage(1,1)
@@ -149,587 +168,5 @@ datum/reagent/medicine/spaceacillin
metabolization_rate = 0.5 * REAGENTS_METABOLISM
-
-
-//------------------------------------------------------------------------------------------------------
- //GOON MEDICINE
-//------------------------------------------------------------------------------------------------------
-
-
-datum/reagent/medicine/silver_sulfadiazine
- name = "Silver Sulfadiazine"
- id = "silver_sulfadiazine"
- description = "On touch, quickly heals burn damage. Basic anti-burn healing drug. On ingestion, deals minor toxin damage."
- reagent_state = LIQUID
- color = "#C8A5DC"
- metabolization_rate = 5 * REAGENTS_METABOLISM
-
-datum/reagent/medicine/silver_sulfadiazine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1)
- if(iscarbon(M))
- if(method == TOUCH)
- M.adjustFireLoss(-volume)
- if(show_message)
- M << "You feel your burns healing!"
- M.emote("scream")
- if(method == INGEST)
- M.adjustToxLoss(0.5*volume)
- if(show_message)
- M << "You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?"
- ..()
- return
-
-datum/reagent/medicine/silver_sulfadiazine/on_mob_life(var/mob/living/M as mob)
- M.adjustFireLoss(-1*REM)
- ..()
- return
-
-datum/reagent/medicine/styptic_powder
- name = "Styptic Powder"
- id = "styptic_powder"
- description = "On touch, quickly heals brute damage. Basic anti-brute healing drug. On ingestion, deals minor toxin damage."
- reagent_state = LIQUID
- color = "#C8A5DC"
- metabolization_rate = 5 * REAGENTS_METABOLISM
-
-datum/reagent/medicine/styptic_powder/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1)
- if(iscarbon(M))
- if(method == TOUCH)
- M.adjustBruteLoss(-volume)
- if(show_message)
- M << "You feel your wounds knitting back together!"
- M.emote("scream")
- if(method == INGEST)
- M.adjustToxLoss(0.5*volume)
- if(show_message)
- M << "You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?"
- ..()
- return
-
-datum/reagent/medicine/styptic_powder/on_mob_life(var/mob/living/M as mob)
- M.adjustBruteLoss(-2*REM)
- ..()
- return
-
-datum/reagent/medicine/salglu_solution
- name = "Saline-Glucose Solution"
- id = "salglu_solution"
- description = "Has a 33% chance per metabolism cycle to heal brute and burn damage."
- reagent_state = LIQUID
- color = "#C8A5DC"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
-
-datum/reagent/medicine/salglu_solution/on_mob_life(var/mob/living/M as mob)
- if(prob(33))
- M.adjustBruteLoss(-0.5*REM)
- M.adjustFireLoss(-0.5*REM)
- ..()
- return
-
-datum/reagent/medicine/synthflesh
- name = "Synthflesh"
- id = "synthflesh"
- description = "Has a 100% chance of instantly healing brute and burn damage. One unit of the chemical will heal one point of damage. Touch application only."
- reagent_state = LIQUID
- color = "#C8A5DC"
-
-datum/reagent/medicine/synthflesh/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume,var/show_message = 1)
- if(iscarbon(M))
- if(method == TOUCH)
- M.adjustBruteLoss(-1.5*volume)
- M.adjustFireLoss(-1.5*volume)
- if(show_message)
- M << "You feel your burns healing and your flesh knitting together!"
- ..()
- return
-
-datum/reagent/medicine/charcoal
- name = "Charcoal"
- id = "charcoal"
- description = "Heals toxin damage, and will also slowly remove any other chemicals."
- reagent_state = LIQUID
- color = "#C8A5DC"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
-
-datum/reagent/medicine/charcoal/on_mob_life(var/mob/living/M as mob)
- M.adjustToxLoss(-1.5*REM)
- for(var/datum/reagent/R in M.reagents.reagent_list)
- if(R != src)
- M.reagents.remove_reagent(R.id,0.5)
- ..()
- return
-
-datum/reagent/medicine/omnizine
- name = "Omnizine"
- id = "omnizine"
- description = "Heals 1 of each damage type a cycle. If overdosed it will deal significant amounts of each damage type."
- reagent_state = LIQUID
- color = "#C8A5DC"
- metabolization_rate = 0.25 * REAGENTS_METABOLISM
- overdose_threshold = 30
-
-datum/reagent/medicine/omnizine/on_mob_life(var/mob/living/M as mob)
- M.adjustToxLoss(-0.5*REM)
- M.adjustOxyLoss(-0.5*REM)
- M.adjustBruteLoss(-0.5*REM)
- M.adjustFireLoss(-0.5*REM)
- ..()
- return
-
-datum/reagent/medicine/omnizine/overdose_process(var/mob/living/M as mob)
- M.adjustToxLoss(1.5*REM)
- M.adjustOxyLoss(1.5*REM)
- M.adjustBruteLoss(1.5*REM)
- M.adjustFireLoss(1.5*REM)
- ..()
- return
-
-datum/reagent/medicine/calomel
- name = "Calomel"
- id = "calomel"
- description = "Quickly purges the body of all chemicals. If your health is above 20, toxin damage is dealt. When you hit 20 health or lower, the damage will cease."
- reagent_state = LIQUID
- color = "#C8A5DC"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
-
-datum/reagent/medicine/calomel/on_mob_life(var/mob/living/M as mob)
- for(var/datum/reagent/R in M.reagents.reagent_list)
- if(R != src)
- M.reagents.remove_reagent(R.id,2.5)
- if(M.health > 20)
- M.adjustToxLoss(2.5*REM)
- ..()
- return
-
-datum/reagent/medicine/potass_iodide
- name = "Potassium Iodide"
- id = "potass_iodide"
- description = "Reduces low radiation damage very effectively."
- reagent_state = LIQUID
- color = "#C8A5DC"
- metabolization_rate = 2 * REAGENTS_METABOLISM
-
-datum/reagent/medicine/potass_iodide/on_mob_life(var/mob/living/M as mob)
- if(M.radiation > 0)
- M.radiation--
- if(M.radiation < 0)
- M.radiation = 0
- ..()
- return
-
-datum/reagent/medicine/pen_acid
- name = "Pentetic Acid"
- id = "pen_acid"
- description = "Reduces massive amounts of radiation and toxin damage while purging other chemicals from the body. Has a chance of dealing brute damage."
- reagent_state = LIQUID
- color = "#C8A5DC"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
-
-datum/reagent/medicine/pen_acid/on_mob_life(var/mob/living/M as mob)
- if(M.radiation > 0)
- M.radiation -= 4
- M.adjustToxLoss(-2*REM)
- if(prob(33))
- M.adjustBruteLoss(0.5*REM)
- if(M.radiation < 0)
- M.radiation = 0
- for(var/datum/reagent/R in M.reagents.reagent_list)
- if(R != src)
- M.reagents.remove_reagent(R.id,2)
- ..()
- return
-
-datum/reagent/medicine/sal_acid
- name = "Salicyclic Acid"
- id = "sal_acid"
- description = "If you have less than 50 brute damage, it heals 0.25 unit. If overdosed it will deal 0.5 brute damage if the patient has less than 50 brute damage already."
- reagent_state = LIQUID
- color = "#C8A5DC"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
- overdose_threshold = 25
-
-datum/reagent/medicine/sal_acid/on_mob_life(var/mob/living/M as mob)
- if(M.getBruteLoss() < 50)
- M.adjustBruteLoss(-0.25*REM)
- ..()
- return
-
-datum/reagent/medicine/sal_acid/overdose_process(var/mob/living/M as mob)
- if(M.getBruteLoss() < 50)
- M.adjustBruteLoss(0.5*REM)
- ..()
- return
-
-datum/reagent/medicine/salbutamol
- name = "Salbutamol"
- id = "salbutamol"
- description = "Quickly heals oxygen damage while slowing down suffocation. Great for stabilizing critical patients!"
- reagent_state = LIQUID
- color = "#C8A5DC"
- metabolization_rate = 0.25 * REAGENTS_METABOLISM
-
-datum/reagent/medicine/salbutamol/on_mob_life(var/mob/living/M as mob)
- M.adjustOxyLoss(-3*REM)
- if(M.losebreath >= 4)
- M.losebreath -= 2
- ..()
- return
-
-datum/reagent/medicine/perfluorodecalin
- name = "Perfluorodecalin"
- id = "perfluorodecalin"
- description = "Heals suffocation damage so quickly that you could have a spacewalk, but it mutes your voice. Has a 33% chance of healing brute and burn damage per cycle as well."
- reagent_state = LIQUID
- color = "#C8A5DC"
- metabolization_rate = 0.25 * REAGENTS_METABOLISM
-
-datum/reagent/medicine/perfluorodecalin/on_mob_life(var/mob/living/carbon/human/M as mob)
- M.adjustOxyLoss(-12*REM)
- M.silent = max(M.silent, 5)
- if(prob(33))
- M.adjustBruteLoss(-0.5*REM)
- M.adjustFireLoss(-0.5*REM)
- ..()
- return
-
-datum/reagent/medicine/ephedrine
- name = "Ephedrine"
- id = "ephedrine"
- description = "Reduces stun times, increases run speed. If overdosed it will deal toxin and oxyloss damage."
- reagent_state = LIQUID
- color = "#C8A5DC"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
- overdose_threshold = 45
- addiction_threshold = 30
-
-datum/reagent/medicine/ephedrine/on_mob_life(var/mob/living/M as mob)
- M.status_flags |= IGNORESLOWDOWN
- M.AdjustParalysis(-1)
- M.AdjustStunned(-1)
- M.AdjustWeakened(-1)
- M.adjustStaminaLoss(-1*REM)
- ..()
- return
-
-datum/reagent/medicine/ephedrine/overdose_process(var/mob/living/M as mob)
- if(prob(33))
- M.adjustToxLoss(0.5*REM)
- M.losebreath++
- ..()
- return
-
-datum/reagent/medicine/ephedrine/addiction_act_stage1(var/mob/living/M as mob)
- if(prob(33))
- M.adjustToxLoss(2*REM)
- M.losebreath += 2
- ..()
- return
-datum/reagent/medicine/ephedrine/addiction_act_stage2(var/mob/living/M as mob)
- if(prob(33))
- M.adjustToxLoss(3*REM)
- M.losebreath += 3
- ..()
- return
-datum/reagent/medicine/ephedrine/addiction_act_stage3(var/mob/living/M as mob)
- if(prob(33))
- M.adjustToxLoss(4*REM)
- M.losebreath += 4
- ..()
- return
-datum/reagent/medicine/ephedrine/addiction_act_stage4(var/mob/living/M as mob)
- if(prob(33))
- M.adjustToxLoss(5*REM)
- M.losebreath += 5
- ..()
- return
-
-datum/reagent/medicine/diphenhydramine
- name = "Diphenhydramine"
- id = "diphenhydramine"
- description = "Purges body of lethal Histamine and reduces jitteriness while causing minor drowsiness."
- reagent_state = LIQUID
- color = "#C8A5DC"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
-
-datum/reagent/medicine/diphenhydramine/on_mob_life(var/mob/living/M as mob)
- if(prob(50))
- M.drowsyness += 1
- M.jitteriness -= 1
- M.reagents.remove_reagent("histamine",1.5)
- ..()
- return
-
-datum/reagent/medicine/morphine
- name = "Morphine"
- id = "morphine"
- description = "Will allow you to ignore slowdown from equipment and damage. Will eventually knock you out if you take too much. If overdosed it will cause jitteriness, dizziness, force the victim to drop items in their hands and eventually deal toxin damage."
- reagent_state = LIQUID
- color = "#C8A5DC"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
- overdose_threshold = 30
- addiction_threshold = 25
-
-
-datum/reagent/medicine/morphine/on_mob_life(var/mob/living/M as mob)
- M.status_flags |= IGNORESLOWDOWN
- if(current_cycle >= 36)
- M.sleeping += 3
- ..()
- return
-
-datum/reagent/medicine/morphine/overdose_process(var/mob/living/M as mob)
- if(prob(33))
- var/obj/item/I = M.get_active_hand()
- if(I)
- M.drop_item()
- M.Dizzy(2)
- M.Jitter(2)
- ..()
- return
-
-datum/reagent/medicine/morphine/addiction_act_stage1(var/mob/living/M as mob)
- if(prob(33))
- var/obj/item/I = M.get_active_hand()
- if(I)
- M.drop_item()
- M.Dizzy(2)
- M.Jitter(2)
- ..()
- return
-datum/reagent/medicine/morphine/addiction_act_stage2(var/mob/living/M as mob)
- if(prob(33))
- var/obj/item/I = M.get_active_hand()
- if(I)
- M.drop_item()
- M.adjustToxLoss(1*REM)
- M.Dizzy(3)
- M.Jitter(3)
- ..()
- return
-datum/reagent/medicine/morphine/addiction_act_stage3(var/mob/living/M as mob)
- if(prob(33))
- var/obj/item/I = M.get_active_hand()
- if(I)
- M.drop_item()
- M.adjustToxLoss(2*REM)
- M.Dizzy(4)
- M.Jitter(4)
- ..()
- return
-datum/reagent/medicine/morphine/addiction_act_stage4(var/mob/living/M as mob)
- if(prob(33))
- var/obj/item/I = M.get_active_hand()
- if(I)
- M.drop_item()
- M.adjustToxLoss(3*REM)
- M.Dizzy(5)
- M.Jitter(5)
- ..()
- return
-
-datum/reagent/medicine/oculine
- name = "Oculine"
- id = "oculine"
- description = "Cures blindness and heals eye damage over time."
- reagent_state = LIQUID
- color = "#C8A5DC"
- metabolization_rate = 0.25 * REAGENTS_METABOLISM
-
-datum/reagent/medicine/oculine/on_mob_life(var/mob/living/M as mob)
- if(M.eye_blind > 0 && current_cycle > 20)
- if(prob(30))
- M.eye_blind = 0
- else if(prob(80))
- M.eye_blind = 0
- M.eye_blurry = 1
- if(M.eye_blurry > 0)
- if(prob(80))
- M.eye_blurry = 0
- ..()
- return
-
-datum/reagent/medicine/atropine
- name = "Atropine"
- id = "atropine"
- description = "If patients health is below -25 it will heal 1.5 brute and burn damage per cycle, as well as stop any oxyloss. Good for stabilising critical patients."
- reagent_state = LIQUID
- color = "#C8A5DC"
- metabolization_rate = 0.25 * REAGENTS_METABOLISM
- overdose_threshold = 35
-
-datum/reagent/medicine/atropine/on_mob_life(var/mob/living/M as mob)
- if(M.health > -60)
- M.adjustToxLoss(0.5*REM)
- if(M.health < -25)
- M.adjustBruteLoss(-1.5*REM)
- M.adjustFireLoss(-1.5*REM)
- if(M.oxyloss > 65)
- M.setOxyLoss(65)
- if(M.losebreath > 5)
- M.losebreath = 5
- if(prob(20))
- M.Dizzy(5)
- M.Jitter(5)
- ..()
- return
-
-datum/reagent/medicine/atropine/overdose_process(var/mob/living/M as mob)
- M.adjustToxLoss(0.5*REM)
- M.Dizzy(1)
- M.Jitter(1)
- ..()
- return
-
-datum/reagent/medicine/epinephrine
- name = "Epinephrine"
- id = "epinephrine"
- description = "Reduces most of the knockout/stun effects, minor stamina regeneration buff. Attempts to stop you taking too much oxygen damage. If the patient is in low to severe crit, heals toxins, brute, and burn very effectively. Will not heal patients who are almost dead. If overdosed will stun and deal toxin damage"
- reagent_state = LIQUID
- color = "#C8A5DC"
- metabolization_rate = 0.25 * REAGENTS_METABOLISM
- overdose_threshold = 30
-
-datum/reagent/medicine/epinephrine/on_mob_life(var/mob/living/M as mob)
- if(M.health < -10 && M.health > -65)
- M.adjustToxLoss(-0.5*REM)
- M.adjustBruteLoss(-0.5*REM)
- M.adjustFireLoss(-0.5*REM)
- if(M.oxyloss > 35)
- M.setOxyLoss(35)
- if(M.losebreath >= 4)
- M.losebreath -= 2
- if(M.losebreath < 0)
- M.losebreath = 0
- M.adjustStaminaLoss(-0.5*REM)
- if(prob(20))
- M.AdjustParalysis(-1)
- M.AdjustStunned(-1)
- M.AdjustWeakened(-1)
- ..()
- return
-
-datum/reagent/medicine/epinephrine/overdose_process(var/mob/living/M as mob)
- if(prob(33))
- M.adjustStaminaLoss(2.5*REM)
- M.adjustToxLoss(1*REM)
- M.losebreath++
- ..()
- return
-
-datum/reagent/medicine/strange_reagent
- name = "Strange Reagent"
- id = "strange_reagent"
- description = "A miracle drug that can bring a dead body back to life! If the corpse has suffered too much damage, however, no change will occur to the body. If used on a living person it will deal Brute and Burn damage."
- reagent_state = LIQUID
- color = "#C8A5DC"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
-
-datum/reagent/medicine/strange_reagent/reaction_mob(var/mob/living/carbon/human/M as mob, var/method=TOUCH, var/volume)
- if(M.stat == DEAD)
- if(M.getBruteLoss() >= 100 || M.getFireLoss() >= 100)
- M.visible_message("[M]'s body convulses a bit, and then falls still once more.")
- return
- var/mob/dead/observer/ghost = M.get_ghost()
- M.visible_message("[M]'s body convulses a bit.")
- if(!M.suiciding && !(NOCLONE in M.mutations))
- if(ghost)
- ghost << "Someone is trying to revive you. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)"
- ghost << sound('sound/effects/genetics.ogg')
- else
- M.stat = 1
- M.adjustOxyLoss(-20)
- M.adjustToxLoss(-20)
- dead_mob_list -= M
- living_mob_list |= list(M)
- M.emote("gasp")
- add_logs(M, M, "revived", object="strange reagent")
- ..()
- return
-
-datum/reagent/medicine/strange_reagent/on_mob_life(var/mob/living/M as mob)
- M.adjustBruteLoss(0.5*REM)
- M.adjustFireLoss(0.5*REM)
- ..()
- return
-
-/datum/reagent/medicine/mannitol
- name = "Mannitol"
- id = "mannitol"
- description = "Heals brain damage effectively. Use it in cyro tubes alongside Cryoxadone."
- color = "#C8A5DC"
-
-/datum/reagent/medicine/mannitol/on_mob_life(mob/living/M as mob)
- M.adjustBrainLoss(-3*REM)
- ..()
- return
-
-/datum/reagent/medicine/mutadone
- name = "Mutadone"
- id = "mutadone"
- description = "Heals your genetic defects."
- color = "#C8A5DC"
-
-/datum/reagent/medicine/mutadone/on_mob_life(var/mob/living/carbon/human/M as mob)
- M.jitteriness = 0
- if(istype(M) && M.dna)
- M.dna.remove_all_mutations()
- ..()
- return
-
-datum/reagent/medicine/antihol
- name = "Antihol"
- id = "antihol"
- description = "Helps remove Alcohol from someone's body, as well as eliminating its side effects."
- color = "#C8A5DC"
-
-datum/reagent/medicine/antihol/on_mob_life(var/mob/living/M as mob)
- M.dizziness = 0
- M.drowsyness = 0
- M.slurring = 0
- M.confused = 0
- M.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 3*REM, 0, 1)
- M.adjustToxLoss(-0.2*REM)
- ..()
-
-/datum/reagent/medicine/stimulants
- name = "Stimulants"
- id = "stimulants"
- description = "Increases run speed and eliminates stuns, can heal minor damage. If overdosed it will deal toxin damage and stun."
- color = "#C8A5DC"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
- overdose_threshold = 60
-
-datum/reagent/medicine/stimulants/on_mob_life(var/mob/living/M as mob)
- M.status_flags |= IGNORESLOWDOWN
- if(M.health < 50 && M.health > 0)
- M.adjustOxyLoss(-1*REM)
- M.adjustToxLoss(-1*REM)
- M.adjustBruteLoss(-1*REM)
- M.adjustFireLoss(-1*REM)
- M.AdjustParalysis(-1)
- M.AdjustStunned(-1)
- M.AdjustWeakened(-1)
- M.adjustStaminaLoss(-1.5*REM)
- ..()
-
-datum/reagent/medicine/stimulants/overdose_process(var/mob/living/M as mob)
- if(prob(33))
- M.adjustStaminaLoss(2.5*REM)
- M.adjustToxLoss(1*REM)
- M.losebreath++
- ..()
- return
-
-datum/reagent/medicine/insulin
- name = "Insulin"
- id = "insulin"
- description = "Increases sugar depletion rates."
- reagent_state = LIQUID
- color = "#C8A5DC"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
-
-datum/reagent/medicine/insulin/on_mob_life(var/mob/living/M as mob)
- if(M.sleeping)
- M.sleeping--
- M.reagents.remove_reagent("sugar", 3)
- ..()
- return
+// Undefine the alias for REAGENTS_EFFECT_MULTIPLER
+#undef REM
\ No newline at end of file
diff --git a/code/modules/reagents/Chemistry-Reagents/Pyrotechnic-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Pyrotechnic-Reagents.dm
deleted file mode 100644
index a5704d0b950c1..0000000000000
--- a/code/modules/reagents/Chemistry-Reagents/Pyrotechnic-Reagents.dm
+++ /dev/null
@@ -1,197 +0,0 @@
-
-datum/reagent/thermite
- name = "Thermite"
- id = "thermite"
- description = "Thermite produces an aluminothermic reaction known as a thermite reaction. Can be used to melt walls."
- reagent_state = SOLID
- color = "#673910" // rgb: 103, 57, 16
-
-datum/reagent/thermite/reaction_turf(var/turf/T, var/volume)
- src = null
- if(volume >= 1 && istype(T, /turf/simulated/wall))
- var/turf/simulated/wall/Wall = T
- if(istype(Wall, /turf/simulated/wall/r_wall))
- Wall.thermite = Wall.thermite+(volume*2.5)
- else
- Wall.thermite = Wall.thermite+(volume*10)
- Wall.overlays = list()
- Wall.overlays += image('icons/effects/effects.dmi',"thermite")
-
-datum/reagent/thermite/on_mob_life(var/mob/living/M as mob)
- M.adjustFireLoss(1)
- ..()
-
-datum/reagent/nitroglycerin
- name = "Nitroglycerin"
- id = "nitroglycerin"
- description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol."
- color = "#808080" // rgb: 128, 128, 128
-
-/datum/reagent/stabilizing_agent
- name = "Stabilizing Agent"
- id = "stabilizing_agent"
- description = "Keeps unstable chemicals stable. This does not work on everything."
- reagent_state = LIQUID
- color = "#FFFFFF"
-
-/datum/reagent/clf3
- name = "Chlorine Trifluoride"
- id = "clf3"
- description = "Makes a temporary 3x3 fireball when it comes into existence, so be careful when mixing. ClF3 applied to a surface burns things that wouldn't otherwise burn, sometimes through the very floors of the station and exposing it to the vacuum of space."
- reagent_state = LIQUID
- color = "#FF0000"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
-
-/datum/reagent/clf3/on_mob_life(var/mob/living/M as mob)
- M.adjust_fire_stacks(2)
- M.adjustFireLoss(0.3*M.fire_stacks)
- ..()
-
-/datum/reagent/clf3/reaction_turf(var/turf/simulated/T, var/volume)
- if(istype(T, /turf/simulated/floor/plating))
- var/turf/simulated/floor/plating/F = T
- if(prob(1 + F.burnt + 5*F.broken)) //broken or burnt plating is more susceptible to being destroyed
- F.ChangeTurf(/turf/space)
- if(istype(T, /turf/simulated/floor/))
- var/turf/simulated/floor/F = T
- if(prob(volume/10))
- F.make_plating()
- else if(prob(volume))
- F.burn_tile()
- if(istype(F, /turf/simulated/floor/))
- new /obj/effect/hotspot(F)
- if(istype(T, /turf/simulated/wall/))
- var/turf/simulated/wall/W = T
- if(prob(volume/10))
- W.ChangeTurf(/turf/simulated/floor/plating)
-
-/datum/reagent/clf3/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
- if(method == TOUCH && isliving(M))
- M.adjust_fire_stacks(5)
- M.IgniteMob()
- new /obj/effect/hotspot(M.loc)
-
-/datum/reagent/sorium
- name = "Sorium"
- id = "sorium"
- description = "Sends everything flying from the detonation point."
- reagent_state = LIQUID
- color = "#FFA500"
-
-/datum/reagent/liquid_dark_matter
- name = "Liquid Dark Matter"
- id = "liquid_dark_matter"
- description = "Sucks everything into the detonation point."
- reagent_state = LIQUID
- color = "#800080"
-
-/datum/reagent/blackpowder
- name = "Black Powder"
- id = "blackpowder"
- description = "Explodes. Violently."
- reagent_state = LIQUID
- color = "#000000"
- metabolization_rate = 0.05
-
-/datum/reagent/blackpowder/on_ex_act()
- var/location = get_turf(holder.my_atom)
- var/datum/effect/effect/system/reagents_explosion/e = new()
- e.set_up(1 + round(volume/6, 1), location, 0, 0, message = 0)
- e.start()
- holder.clear_reagents()
-
-/datum/reagent/flash_powder
- name = "Flash Powder"
- id = "flash_powder"
- description = "Makes a very bright flash."
- reagent_state = LIQUID
- color = "#FFFF00"
-
-/datum/reagent/smoke_powder
- name = "Smoke Powder"
- id = "smoke_powder"
- description = "Makes a large cloud of smoke that can carry reagents."
- reagent_state = LIQUID
- color = "#808080"
-
-/datum/reagent/sonic_powder
- name = "Sonic Powder"
- id = "sonic_powder"
- description = "Makes a deafening noise."
- reagent_state = LIQUID
- color = "#0000FF"
-
-/datum/reagent/phlogiston
- name = "Phlogiston"
- id = "phlogiston"
- description = "Catches you on fire and makes you ignite."
- reagent_state = LIQUID
- color = "#FF9999"
-
-/datum/reagent/phlogiston/on_mob_life(var/mob/living/M as mob)
- M.adjust_fire_stacks(1)
- M.IgniteMob()
- M.adjustFireLoss(0.2*M.fire_stacks)
- ..()
- return
-
-/datum/reagent/napalm
- name = "Napalm"
- id = "napalm"
- description = "Very flammable."
- reagent_state = LIQUID
- color = "#FF9999"
-
-/datum/reagent/napalm/on_mob_life(var/mob/living/M as mob)
- M.adjust_fire_stacks(1)
- ..()
-
-/datum/reagent/napalm/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
- if(method == TOUCH && isliving(M))
- M.adjust_fire_stacks(7)
-
-datum/reagent/cryostylane
- name = "Cryostylane"
- id = "cryostylane"
- description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Cryostylane slowly cools all other reagents in the mob down to 0K."
- color = "#B2B2FF" // rgb: 139, 166, 233
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
-
-
-datum/reagent/cryostylane/on_mob_life(var/mob/living/M as mob) //TODO: code freezing into an ice cube
- if(M.reagents.has_reagent("oxygen"))
- M.reagents.remove_reagent("oxygen", 0.5)
- M.bodytemperature -= 15
- ..()
-
-datum/reagent/cryostylane/on_tick()
- if(holder.has_reagent("oxygen"))
- holder.remove_reagent("oxygen", 1)
- holder.chem_temp -= 10
- holder.handle_reactions()
- ..()
-
-datum/reagent/cryostylane/reaction_turf(var/turf/simulated/T, var/volume)
- if(volume >= 5)
- for(var/mob/living/simple_animal/slime/M in T)
- M.adjustToxLoss(rand(15,30))
-
-datum/reagent/pyrosium
- name = "Pyrosium"
- id = "pyrosium"
- description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Pyrosium slowly cools all other reagents in the mob down to 0K."
- color = "#B20000" // rgb: 139, 166, 233
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
-
-datum/reagent/pyrosium/on_mob_life(var/mob/living/M as mob)
- if(M.reagents.has_reagent("oxygen"))
- M.reagents.remove_reagent("oxygen", 0.5)
- M.bodytemperature += 15
- ..()
-
-datum/reagent/pyrosium/on_tick()
- if(holder.has_reagent("oxygen"))
- holder.remove_reagent("oxygen", 1)
- holder.chem_temp += 10
- holder.handle_reactions()
- ..()
diff --git a/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm
index d20c1e40d6581..194f7a43ef36b 100644
--- a/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm
@@ -1,4 +1,7 @@
+#define REM REAGENTS_EFFECT_MULTIPLIER
+
+
//////////////////////////Poison stuff (Toxins & Acids)///////////////////////
datum/reagent/toxin
@@ -155,8 +158,10 @@ datum/reagent/toxin/zombiepowder/on_mob_life(var/mob/living/carbon/M as mob)
..()
return
-datum/reagent/toxin/zombiepowder/on_mob_delete(mob/M)
- M.status_flags &= ~FAKEDEATH
+datum/reagent/toxin/zombiepowder/Del()
+ if(holder && ismob(holder.my_atom))
+ var/mob/M = holder.my_atom
+ M.status_flags &= ~FAKEDEATH
..()
datum/reagent/toxin/mindbreaker
@@ -253,7 +258,10 @@ datum/reagent/toxin/chloralhydrate
metabolization_rate = 1.5 * REAGENTS_METABOLISM
datum/reagent/toxin/chloralhydrate/on_mob_life(var/mob/living/M as mob)
- switch(current_cycle)
+ if(!data)
+ data = 1
+ data++
+ switch(data)
if(1 to 10)
M.confused += 2
M.drowsyness += 2
@@ -261,7 +269,7 @@ datum/reagent/toxin/chloralhydrate/on_mob_life(var/mob/living/M as mob)
M.sleeping += 1
if(51 to INFINITY)
M.sleeping += 1
- M.adjustToxLoss((current_cycle - 50)*REM)
+ M.adjustToxLoss((data - 50)*REM)
..()
return
@@ -273,15 +281,53 @@ datum/reagent/toxin/beer2 //disguised as normal beer for use by emagged brobots
metabolization_rate = 1.5 * REAGENTS_METABOLISM
datum/reagent/toxin/beer2/on_mob_life(var/mob/living/M as mob)
- switch(current_cycle)
+ if(!data)
+ data = 1
+ switch(data)
if(1 to 50)
M.sleeping += 1
if(51 to INFINITY)
M.sleeping += 1
- M.adjustToxLoss((current_cycle - 50)*REM)
+ M.adjustToxLoss((data - 50)*REM)
+ data++
..()
return
+
+
+//ACID
+
+
+datum/reagent/toxin/acid
+ name = "Sulphuric acid"
+ id = "sacid"
+ description = "A strong mineral acid with the molecular formula H2SO4."
+ color = "#DB5008" // rgb: 219, 80, 8
+ toxpwr = 1
+ var/acidpwr = 10 //the amount of protection removed from the armour
+
+datum/reagent/toxin/acid/reaction_mob(var/mob/living/carbon/C, var/method=TOUCH, var/volume)
+ if(!istype(C))
+ return
+ if(method != TOUCH)
+ C.take_organ_damage(min(6*toxpwr, volume * toxpwr))
+ return
+
+ C.acid_act(acidpwr, toxpwr, volume)
+
+datum/reagent/toxin/acid/reaction_obj(var/obj/O, var/volume)
+ if(istype(O.loc, /mob)) //handled in human acid_act()
+ return
+ O.acid_act(acidpwr, toxpwr, volume)
+
+datum/reagent/toxin/acid/fluacid
+ name = "Fluorosulfuric acid"
+ id = "facid"
+ description = "Fluorosulfuric acid is a an extremely corrosive chemical substance."
+ color = "#8E18A9" // rgb: 142, 24, 169
+ toxpwr = 2
+ acidpwr = 20
+
datum/reagent/toxin/coffeepowder
name = "Coffee Grounds"
id = "coffeepowder"
@@ -306,7 +352,7 @@ datum/reagent/toxin/mutetoxin //the new zombie powder.
toxpwr = 0
datum/reagent/toxin/mutetoxin/on_mob_life(mob/living/carbon/M)
- M.silent = max(M.silent, 3)
+ M.silent += REM + 1 //If this var is increased by one or less, it will have no effect since silent is decreased right after reagents are handled in Life(). Hence the + 1.
..()
datum/reagent/toxin/staminatoxin
@@ -322,320 +368,6 @@ datum/reagent/toxin/staminatoxin/on_mob_life(mob/living/carbon/M)
data = max(data - 1, 3)
..()
-datum/reagent/toxin/polonium
- name = "Polonium"
- id = "polonium"
- description = "Cause significant Radiation damage over time."
- reagent_state = LIQUID
- color = "#CF3600"
- metabolization_rate = 0.125 * REAGENTS_METABOLISM
- toxpwr = 0
-
-datum/reagent/toxin/polonium/on_mob_life(var/mob/living/M as mob)
- M.radiation += 4
- ..()
-
-datum/reagent/toxin/histamine
- name = "Histamine"
- id = "histamine"
- description = "A dose-dependent toxin, ranges from annoying to incredibly lethal."
- reagent_state = LIQUID
- color = "#CF3600"
- metabolization_rate = 0.25 * REAGENTS_METABOLISM
- overdose_threshold = 30
- toxpwr = 0
-
-datum/reagent/toxin/histamine/on_mob_life(var/mob/living/M as mob)
- if(prob(50))
- switch(pick(1, 2, 3, 4))
- if(1)
- M << "You can barely see!"
- M.eye_blurry = 3
- if(2)
- M.emote("cough")
- if(3)
- M.emote("sneeze")
- if(4)
- if(prob(75))
- M << "You scratch at an itch."
- M.adjustBruteLoss(2*REM)
- ..()
-
-datum/reagent/toxin/histamine/overdose_process(var/mob/living/M as mob)
- M.adjustOxyLoss(1*REM)
- M.adjustBruteLoss(1*REM)
- M.adjustToxLoss(1*REM)
- ..()
-
-datum/reagent/toxin/formaldehyde
- name = "Formaldehyde"
- id = "formaldehyde"
- description = "Deals a moderate amount of Toxin damage over time. 10% chance to decay into 10-15 histamine."
- reagent_state = LIQUID
- color = "#CF3600"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
- toxpwr = 0.5
-
-datum/reagent/toxin/formaldehyde/on_mob_life(var/mob/living/M as mob)
- if(prob(5))
- M.reagents.add_reagent("histamine",pick(5,15))
- M.reagents.remove_reagent("formaldehyde",1)
- ..()
-
-datum/reagent/toxin/venom
- name = "Venom"
- id = "venom"
- description = "Will deal scaling amounts of Toxin and Brute damage over time. 15% chance to decay into 5-10 histamine."
- reagent_state = LIQUID
- color = "#CF3600"
- metabolization_rate = 0.25 * REAGENTS_METABOLISM
- toxpwr = 0
-
-datum/reagent/toxin/venom/on_mob_life(var/mob/living/M as mob)
- toxpwr = 0.05*volume
- M.adjustBruteLoss((0.1*volume)*REM)
- if(prob(15))
- M.reagents.add_reagent("histamine",pick(5,10))
- M.reagents.remove_reagent("venom",1)
- ..()
-
-datum/reagent/toxin/neurotoxin2
- name = "Neurotoxin"
- id = "neurotoxin2"
- description = "Deals toxin and brain damage up to 60 before it slows down, causing confusion and a knockout after 54 elapsed cycles."
- reagent_state = LIQUID
- color = "#CF3600"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
- toxpwr = 0
-
-datum/reagent/toxin/neurotoxin2/on_mob_life(var/mob/living/M as mob)
- if(M.brainloss + M.toxloss <= 60)
- M.adjustBrainLoss(1*REM)
- M.adjustToxLoss(1*REM)
- if(current_cycle >= 54)
- M.sleeping += 5
- ..()
-
-datum/reagent/toxin/cyanide
- name = "Cyanide"
- id = "cyanide"
- description = "Deals toxin damage, alongside some oxygen loss. 8% chance of stun and some extra toxin damage."
- reagent_state = LIQUID
- color = "#CF3600"
- metabolization_rate = 0.125 * REAGENTS_METABOLISM
- toxpwr = 0.75
-
-datum/reagent/toxin/cyanide/on_mob_life(var/mob/living/M as mob)
- if(prob(5))
- M.losebreath += 1
- if(prob(4))
- M << "You feel horrendously weak!"
- M.Stun(2)
- M.adjustToxLoss(2*REM)
- ..()
-
-/datum/reagent/toxin/questionmark // food poisoning
- name = "Bad Food"
- id = "????"
- description = "????"
- reagent_state = LIQUID
- color = "#CF3600"
- metabolization_rate = 0.25 * REAGENTS_METABOLISM
- toxpwr = 0.5
-
-datum/reagent/toxin/itching_powder
- name = "Itching Powder"
- id = "itching_powder"
- description = "Lots of annoying random effects, chances to do some brute damage from scratching. 6% chance to decay into 1-3 units of histamine."
- reagent_state = LIQUID
- color = "#CF3600"
- metabolization_rate = 0.4 * REAGENTS_METABOLISM
- toxpwr = 0
-
-/datum/reagent/toxin/itching_powder/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
- if(method == TOUCH)
- M.reagents.add_reagent("itching_powder", volume)
- return
-
-datum/reagent/toxin/itching_powder/on_mob_life(var/mob/living/M as mob)
- if(prob(15))
- M << "You scratch at your head."
- M.adjustBruteLoss(0.2*REM)
- if(prob(15))
- M << "You scratch at your leg."
- M.adjustBruteLoss(0.2*REM)
- if(prob(15))
- M << "You scratch at your arm."
- M.adjustBruteLoss(0.2*REM)
- if(prob(3))
- M.reagents.add_reagent("histamine",rand(1,3))
- M.reagents.remove_reagent("itching_powder",1)
- ..()
-
-datum/reagent/toxin/initropidril
- name = "Initropidril"
- id = "initropidril"
- description = "Causes some toxin damage, 5% chances to cause stunning, suffocation, or immediate heart failure."
- reagent_state = LIQUID
- color = "#CF3600"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
- toxpwr = 2.5
-
-datum/reagent/toxin/initropidril/on_mob_life(var/mob/living/M as mob)
- if(prob(5))
- var/picked_option = rand(1,3)
- switch(picked_option)
- if(1)
- M.Stun(3)
- M.Weaken(3)
- if(2)
- M.losebreath += 10
- M.adjustOxyLoss(rand(5,25))
- if(3)
- var/mob/living/carbon/human/H = M
- if(!H.heart_attack)
- H.visible_message("[H] clutches at their chest as if their heart stopped!")
- H.heart_attack = 1 // rip in pepperoni
- else
- H.losebreath += 10
- H.adjustOxyLoss(rand(5,25))
- ..()
-
-datum/reagent/toxin/pancuronium
- name = "Pancuronium"
- id = "pancuronium"
- description = "Knocks you out after 30 seconds, 7% chance to cause some oxygen loss."
- reagent_state = LIQUID
- color = "#CF3600"
- metabolization_rate = 0.25 * REAGENTS_METABOLISM
- toxpwr = 0
-
-datum/reagent/toxin/pancuronium/on_mob_life(var/mob/living/M as mob)
- if(current_cycle >= 30)
- M.SetParalysis(3)
- if(prob(7))
- M.losebreath += 4
- ..()
-
-datum/reagent/toxin/sodium_thiopental
- name = "Sodium Thiopental"
- id = "sodium_thiopental"
- description = "Puts you to sleep after 30 seconds, along with some major stamina loss."
- reagent_state = LIQUID
- color = "#CF3600"
- metabolization_rate = 0.75 * REAGENTS_METABOLISM
- toxpwr = 0
-
-datum/reagent/toxin/sodium_thiopental/on_mob_life(var/mob/living/M as mob)
- if(current_cycle >= 30)
- M.sleeping += 1.5
- M.adjustStaminaLoss(5*REM)
- ..()
-
-datum/reagent/toxin/sulfonal
- name = "Sulfonal"
- id = "sulfonal"
- description = "Deals some toxin damage, and puts you to sleep after 66 seconds."
- reagent_state = LIQUID
- color = "#CF3600"
- metabolization_rate = 0.125 * REAGENTS_METABOLISM
- toxpwr = 0.5
-
-datum/reagent/toxin/sulfonal/on_mob_life(var/mob/living/M as mob)
- if(current_cycle >= 66)
- M.sleeping += 1.5
- ..()
-
-datum/reagent/toxin/amanitin
- name = "Amanitin"
- id = "amanitin"
- description = "On the last second that it's in you, it hits you with a stack of toxin damage based on how long it's been in you. The more you use, the longer it takes before anything happens, but the harder it hits when it does."
- reagent_state = LIQUID
- color = "#CF3600"
- toxpwr = 0
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
-
-datum/reagent/toxin/amanitin/on_mob_delete(var/mob/living/M as mob)
- M.adjustToxLoss(current_cycle*3*REM)
- ..()
-
-datum/reagent/toxin/lipolicide
- name = "Lipolicide"
- id = "lipolicide"
- description = "Deals some toxin damage unless they keep eating food. Will reduce nutrition values."
- reagent_state = LIQUID
- color = "#CF3600"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
- toxpwr = 0.5
-
-datum/reagent/toxin/lipolicide/on_mob_life(var/mob/living/M as mob)
- if(!holder.has_reagent("nutriment"))
- M.adjustToxLoss(0.5*REM)
- M.nutrition -= 5 * REAGENTS_METABOLISM
- M.overeatduration = 0
- if(M.nutrition < 0)//Prevent from going into negatives.
- M.nutrition = 0
- ..()
-
-datum/reagent/toxin/coniine
- name = "Coniine"
- id = "coniine"
- description = "Does moderate toxin damage and oxygen loss."
- reagent_state = LIQUID
- color = "#CF3600"
- metabolization_rate = 0.06 * REAGENTS_METABOLISM
- toxpwr = 1
-
-datum/reagent/toxin/coniine/on_mob_life(var/mob/living/M as mob)
- M.losebreath += 3
- ..()
-
-datum/reagent/toxin/curare
- name = "Curare"
- id = "curare"
- description = "Does some oxygen and toxin damage, weakens you after 33 seconds."
- reagent_state = LIQUID
- color = "#CF3600"
- metabolization_rate = 0.125 * REAGENTS_METABOLISM
- toxpwr = 0.5
-
-datum/reagent/toxin/curare/on_mob_life(var/mob/living/M as mob)
- if(current_cycle >= 33)
- M.Weaken(3)
- M.adjustOxyLoss(0.5*REM)
- ..()
-
-
-//ACID
-
-
-datum/reagent/toxin/acid
- name = "Sulphuric acid"
- id = "sacid"
- description = "A strong mineral acid with the molecular formula H2SO4."
- color = "#DB5008" // rgb: 219, 80, 8
- toxpwr = 1
- var/acidpwr = 10 //the amount of protection removed from the armour
-
-datum/reagent/toxin/acid/reaction_mob(var/mob/living/carbon/C, var/method=TOUCH, var/volume)
- if(!istype(C))
- return
- if(method != TOUCH)
- C.take_organ_damage(min(6*toxpwr, volume * toxpwr))
- return
-
- C.acid_act(acidpwr, toxpwr, volume)
-
-datum/reagent/toxin/acid/reaction_obj(var/obj/O, var/volume)
- if(istype(O.loc, /mob)) //handled in human acid_act()
- return
- O.acid_act(acidpwr, toxpwr, volume)
-
-datum/reagent/toxin/acid/fluacid
- name = "Fluorosulfuric acid"
- id = "facid"
- description = "Fluorosulfuric acid is a an extremely corrosive chemical substance."
- color = "#8E18A9" // rgb: 142, 24, 169
- toxpwr = 2
- acidpwr = 20
+// Undefine the alias for REAGENTS_EFFECT_MULTIPLER
+#undef REM
\ No newline at end of file
diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm
index 7cdb73ae78a45..0f5f9ecaf4c32 100644
--- a/code/modules/reagents/Chemistry-Recipes.dm
+++ b/code/modules/reagents/Chemistry-Recipes.dm
@@ -19,74 +19,989 @@
/datum/chemical_reaction/proc/on_reaction(var/datum/reagents/holder, var/created_volume)
return
+
//I recommend you set the result amount to the total volume of all components.
+/datum/chemical_reaction/explosion_potassium
+ name = "Explosion"
+ id = "explosion_potassium"
+ result = null
+ required_reagents = list("water" = 1, "potassium" = 1)
+ result_amount = 2
+/datum/chemical_reaction/explosion_potassium/on_reaction(var/datum/reagents/holder, var/created_volume)
+ var/location = get_turf(holder.my_atom)
+ var/datum/effect/effect/system/reagents_explosion/e = new()
+ e.set_up(round (created_volume/10, 1), location, 0, 0)
+ e.start()
+ holder.clear_reagents()
+ return
+
+/datum/chemical_reaction/emp_pulse
+ name = "EMP Pulse"
+ id = "emp_pulse"
+ result = null
+ required_reagents = list("uranium" = 1, "iron" = 1) // Yes, laugh, it's the best recipe I could think of that makes a little bit of sense
+ result_amount = 2
+
+/datum/chemical_reaction/emp_pulse/on_reaction(var/datum/reagents/holder, var/created_volume)
+ var/location = get_turf(holder.my_atom)
+ // 100 created volume = 4 heavy range & 7 light range. A few tiles smaller than traitor EMP grandes.
+ // 200 created volume = 8 heavy range & 14 light range. 4 tiles larger than traitor EMP grenades.
+ empulse(location, round(created_volume / 24), round(created_volume / 14), 1)
+ holder.clear_reagents()
+ return
+/*
+silicate
+ name = "Silicate"
+ id = "silicate"
+ result = "silicate"
+ required_reagents = list("aluminium" = 1, "silicon" = 1, "oxygen" = 1)
+ result_amount = 3
+*/
+/datum/chemical_reaction/stoxin
+ name = "Sleep Toxin"
+ id = "stoxin"
+ result = "stoxin"
+ required_reagents = list("chloralhydrate" = 1, "sugar" = 4)
+ result_amount = 5
+
+/datum/chemical_reaction/sterilizine
+ name = "Sterilizine"
+ id = "sterilizine"
+ result = "sterilizine"
+ required_reagents = list("ethanol" = 1, "charcoal" = 1, "chlorine" = 1)
+ result_amount = 3
+
+/datum/chemical_reaction/mutagen
+ name = "Unstable mutagen"
+ id = "mutagen"
+ result = "mutagen"
+ required_reagents = list("radium" = 1, "phosphorus" = 1, "chlorine" = 1)
+ result_amount = 3
+
+//cyanide
+// name = "Cyanide"
+// id = "cyanide"
+// result = "cyanide"
+// required_reagents = list("hydrogen" = 1, "carbon" = 1, "nitrogen" = 1)
+// result_amount = 1
+
+/datum/chemical_reaction/thermite
+ name = "Thermite"
+ id = "thermite"
+ result = "thermite"
+ required_reagents = list("aluminium" = 1, "iron" = 1, "oxygen" = 1)
+ result_amount = 3
+
+/datum/chemical_reaction/lexorin
+ name = "Lexorin"
+ id = "lexorin"
+ result = "lexorin"
+ required_reagents = list("plasma" = 1, "hydrogen" = 1, "nitrogen" = 1)
+ result_amount = 3
+
+/datum/chemical_reaction/space_drugs
+ name = "Space Drugs"
+ id = "space_drugs"
+ result = "space_drugs"
+ required_reagents = list("mercury" = 1, "sugar" = 1, "lithium" = 1)
+ result_amount = 3
+
+/datum/chemical_reaction/lube
+ name = "Space Lube"
+ id = "lube"
+ result = "lube"
+ required_reagents = list("water" = 1, "silicon" = 1, "oxygen" = 1)
+ result_amount = 4
+
+/datum/chemical_reaction/synaptizine
+ name = "Synaptizine"
+ id = "synaptizine"
+ result = "synaptizine"
+ required_reagents = list("sugar" = 1, "lithium" = 1, "water" = 1)
+ result_amount = 3
+
+/datum/chemical_reaction/impedrezene
+ name = "Impedrezene"
+ id = "impedrezene"
+ result = "impedrezene"
+ required_reagents = list("mercury" = 1, "oxygen" = 1, "sugar" = 1)
+ result_amount = 2
+
+/datum/chemical_reaction/leporazine
+ name = "Leporazine"
+ id = "leporazine"
+ result = "leporazine"
+ required_reagents = list("silicon" = 1, "copper" = 1)
+ required_catalysts = list("plasma" = 5)
+ result_amount = 2
+
+/datum/chemical_reaction/cryptobiolin
+ name = "Cryptobiolin"
+ id = "cryptobiolin"
+ result = "cryptobiolin"
+ required_reagents = list("potassium" = 1, "oxygen" = 1, "sugar" = 1)
+ result_amount = 3
+
+/datum/chemical_reaction/spaceacillin
+ name = "Spaceacillin"
+ id = "spaceacillin"
+ result = "spaceacillin"
+ required_reagents = list("cryptobiolin" = 1, "epinephrine" = 1)
+ result_amount = 2
+
+/datum/chemical_reaction/inacusiate
+ name = "inacusiate"
+ id = "inacusiate"
+ result = "inacusiate"
+ required_reagents = list("water" = 1, "carbon" = 1, "charcoal" = 1)
+ result_amount = 2
+
+/datum/chemical_reaction/glycerol
+ name = "Glycerol"
+ id = "glycerol"
+ result = "glycerol"
+ required_reagents = list("cornoil" = 3, "sacid" = 1)
+ result_amount = 1
+
+/datum/chemical_reaction/nitroglycerin
+ name = "Nitroglycerin"
+ id = "nitroglycerin"
+ result = "nitroglycerin"
+ required_reagents = list("glycerol" = 1, "facid" = 1, "sacid" = 1)
+ result_amount = 2
+/datum/chemical_reaction/nitroglycerin/on_reaction(var/datum/reagents/holder, var/created_volume)
+ var/location = get_turf(holder.my_atom)
+ var/datum/effect/effect/system/reagents_explosion/e = new()
+ e.set_up(round (created_volume/2, 1), location, 0, 0)
+ e.start()
+
+ holder.clear_reagents()
+ return
+
+/datum/chemical_reaction/sodiumchloride
+ name = "Sodium Chloride"
+ id = "sodiumchloride"
+ result = "sodiumchloride"
+ required_reagents = list("water" = 1, "sodium" = 1, "chlorine" = 1)
+ result_amount = 3
+
+/datum/chemical_reaction/flash_powder
+ name = "Flash powder"
+ id = "flash_powder"
+ result = null
+ required_reagents = list("aluminium" = 1, "potassium" = 1, "sulfur" = 1 )
+ result_amount = null
+/datum/chemical_reaction/flash_powder/on_reaction(var/datum/reagents/holder, var/created_volume)
+ var/location = get_turf(holder.my_atom)
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(2, 1, location)
+ s.start()
+ for(var/mob/living/carbon/C in get_hearers_in_view(5, location))
+ if(C.check_eye_prot())
+ continue
+ flick("e_flash", C.flash)
+ if(get_dist(C, location) < 4)
+ C.Weaken(5)
+ continue
+ C.Stun(5)
+
+/datum/chemical_reaction/napalm
+ name = "Napalm"
+ id = "napalm"
+ result = null
+ required_reagents = list("aluminium" = 1, "plasma" = 1, "sacid" = 1 )
+ result_amount = 1
+/datum/chemical_reaction/napalm/on_reaction(var/datum/reagents/holder, var/created_volume)
+ var/turf/simulated/T = get_turf(holder.my_atom)
+ if(istype(T))
+ T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, created_volume)
+ holder.del_reagent(id)
+ return
+
+/*
+/datum/chemical_reaction/smoke
+ name = "Smoke"
+ id = "smoke"
+ result = null
+ required_reagents = list("potassium" = 1, "sugar" = 1, "phosphorus" = 1 )
+ result_amount = null
+ secondary = 1
+ on_reaction(var/datum/reagents/holder, var/created_volume)
+ var/location = get_turf(holder.my_atom)
+ var/datum/effect/system/bad_smoke_spread/S = new /datum/effect/system/bad_smoke_spread
+ S.attach(location)
+ S.set_up(10, 0, location)
+ playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3)
+ spawn(0)
+ S.start()
+ sleep(10)
+ S.start()
+ sleep(10)
+ S.start()
+ sleep(10)
+ S.start()
+ sleep(10)
+ S.start()
+ holder.clear_reagents()
+ return */
+
+/datum/chemical_reaction/chemsmoke
+ name = "Chemsmoke"
+ id = "chemsmoke"
+ result = null
+ required_reagents = list("potassium" = 1, "sugar" = 1, "phosphorus" = 1)
+ result_amount = null
+ secondary = 1
+ mob_react = 1
+
+/datum/chemical_reaction/chemsmoke/on_reaction(var/datum/reagents/holder, var/created_volume)
+ var/location = get_turf(holder.my_atom)
+ var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread
+ S.attach(location)
+ playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3)
+ spawn(0)
+ if(S)
+ S.set_up(holder, 10, 0, location)
+ S.start()
+ sleep(10)
+ S.start()
+ if(holder && holder.my_atom)
+ holder.clear_reagents()
+ return
+
+/datum/chemical_reaction/chloralhydrate
+ name = "Chloral Hydrate"
+ id = "chloralhydrate"
+ result = "chloralhydrate"
+ required_reagents = list("ethanol" = 1, "chlorine" = 3, "water" = 1)
+ result_amount = 1
+
+/datum/chemical_reaction/mutetoxin //i'll just fit this in here snugly between other unfun chemicals :v
+ name = "Mute toxin"
+ id = "mutetoxin"
+ result = "mutetoxin"
+ required_reagents = list("uranium" = 2, "water" = 1, "carbon" = 1)
+ result_amount = 2
+
+/datum/chemical_reaction/zombiepowder
+ name = "Zombie Powder"
+ id = "zombiepowder"
+ result = "zombiepowder"
+ required_reagents = list("carpotoxin" = 5, "morphine" = 5, "copper" = 5)
+ result_amount = 2
+
+/datum/chemical_reaction/rezadone
+ name = "Rezadone"
+ id = "rezadone"
+ result = "rezadone"
+ required_reagents = list("carpotoxin" = 1, "cryptobiolin" = 1, "copper" = 1)
+ result_amount = 3
+
+/datum/chemical_reaction/mindbreaker
+ name = "Mindbreaker Toxin"
+ id = "mindbreaker"
+ result = "mindbreaker"
+ required_reagents = list("silicon" = 1, "hydrogen" = 1, "charcoal" = 1)
+ result_amount = 5
+
+/datum/chemical_reaction/lipozine
+ name = "Lipozine"
+ id = "Lipozine"
+ result = "lipozine"
+ required_reagents = list("sodiumchloride" = 1, "ethanol" = 1, "radium" = 1)
+ result_amount = 3
+
+/datum/chemical_reaction/plasmasolidification
+ name = "Solid Plasma"
+ id = "solidplasma"
+ result = null
+ required_reagents = list("iron" = 5, "frostoil" = 5, "plasma" = 20)
+ result_amount = 1
+ mob_react = 1
+
+/datum/chemical_reaction/plasmasolidification/on_reaction(var/datum/reagents/holder, var/created_volume)
+ var/location = get_turf(holder.my_atom)
+ new /obj/item/stack/sheet/mineral/plasma(location)
+ return
+
+/datum/chemical_reaction/capsaicincondensation
+ name = "Capsaicincondensation"
+ id = "capsaicincondensation"
+ result = "condensedcapsaicin"
+ required_reagents = list("capsaicin" = 1, "ethanol" = 5)
+ result_amount = 5
+
+/datum/chemical_reaction/virus_food
+ name = "Virus Food"
+ id = "virusfood"
+ result = "virusfood"
+ required_reagents = list("water" = 5, "milk" = 5)
+ result_amount = 15
+
+/datum/chemical_reaction/mix_virus
+ name = "Mix Virus"
+ id = "mixvirus"
+ result = "blood"
+ required_reagents = list("virusfood" = 1)
+ required_catalysts = list("blood" = 1)
+ var/level_min = 0
+ var/level_max = 2
+
+/datum/chemical_reaction/mix_virus/on_reaction(var/datum/reagents/holder, var/created_volume)
+
+ var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list
+ if(B && B.data)
+ var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"]
+ if(D)
+ D.Evolve(level_min, level_max)
+
+
+/datum/chemical_reaction/mix_virus/mix_virus_2
+
+ name = "Mix Virus 2"
+ id = "mixvirus2"
+ required_reagents = list("mutagen" = 1)
+ level_min = 2
+ level_max = 4
+
+/datum/chemical_reaction/mix_virus/mix_virus_3
+
+ name = "Mix Virus 3"
+ id = "mixvirus3"
+ required_reagents = list("plasma" = 1)
+ level_min = 4
+ level_max = 6
+
+/datum/chemical_reaction/mix_virus/rem_virus
+
+ name = "Devolve Virus"
+ id = "remvirus"
+ required_reagents = list("synaptizine" = 1)
+ required_catalysts = list("blood" = 1)
+
+/datum/chemical_reaction/mix_virus/rem_virus/on_reaction(var/datum/reagents/holder, var/created_volume)
+
+ var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list
+ if(B && B.data)
+ var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"]
+ if(D)
+ D.Devolve()
+
+
+
+///////////////////////////////////////////////////////////////////////////////////
+
+// foam and foam precursor
+
+/datum/chemical_reaction/surfactant
+ name = "Foam surfactant"
+ id = "foam surfactant"
+ result = "fluorosurfactant"
+ required_reagents = list("fluorine" = 2, "carbon" = 2, "sacid" = 1)
+ result_amount = 5
+
+
+/datum/chemical_reaction/foam
+ name = "Foam"
+ id = "foam"
+ result = null
+ required_reagents = list("fluorosurfactant" = 1, "water" = 1)
+ result_amount = 2
+ mob_react = 1
+
+/datum/chemical_reaction/foam/on_reaction(var/datum/reagents/holder, var/created_volume)
+ var/location = get_turf(holder.my_atom)
+
+ for(var/mob/M in viewers(5, location))
+ M << "The solution spews out foam!"
+
+ var/datum/effect/effect/system/foam_spread/s = new()
+ s.set_up(created_volume, location, holder)
+ s.start()
+ holder.clear_reagents()
+ return
+
+
+/datum/chemical_reaction/metalfoam
+ name = "Metal Foam"
+ id = "metalfoam"
+ result = null
+ required_reagents = list("aluminium" = 3, "foaming_agent" = 1, "facid" = 1)
+ result_amount = 5
+ mob_react = 1
+
+/datum/chemical_reaction/metalfoam/on_reaction(var/datum/reagents/holder, var/created_volume)
+ var/location = get_turf(holder.my_atom)
+
+ for(var/mob/M in viewers(5, location))
+ M << "The solution spews out a metallic foam!"
+
+ var/datum/effect/effect/system/foam_spread/metal/s = new()
+ s.set_up(created_volume, location, holder, 1)
+ s.start()
+ holder.clear_reagents()
+ return
-/datum/chemical_reaction/proc/chemical_mob_spawn(var/datum/reagents/holder, var/amount_to_spawn, var/reaction_name, var/mob_faction = "chemicalsummon")
- if(holder && holder.my_atom)
- var/blocked = list(/mob/living/simple_animal/hostile,
- /mob/living/simple_animal/hostile/pirate,
- /mob/living/simple_animal/hostile/pirate/ranged,
- /mob/living/simple_animal/hostile/russian,
- /mob/living/simple_animal/hostile/russian/ranged,
- /mob/living/simple_animal/hostile/syndicate,
- /mob/living/simple_animal/hostile/syndicate/melee,
- /mob/living/simple_animal/hostile/syndicate/melee/space,
- /mob/living/simple_animal/hostile/syndicate/ranged,
- /mob/living/simple_animal/hostile/syndicate/ranged/space,
- /mob/living/simple_animal/hostile/alien/queen/large,
- /mob/living/simple_animal/hostile/retaliate,
- /mob/living/simple_animal/hostile/retaliate/clown,
- /mob/living/simple_animal/hostile/mushroom,
- /mob/living/simple_animal/hostile/asteroid,
- /mob/living/simple_animal/hostile/asteroid/basilisk,
- /mob/living/simple_animal/hostile/asteroid/goldgrub,
- /mob/living/simple_animal/hostile/asteroid/goliath,
- /mob/living/simple_animal/hostile/asteroid/hivelord,
- /mob/living/simple_animal/hostile/asteroid/hivelordbrood,
- /mob/living/simple_animal/hostile/carp/holocarp,
- /mob/living/simple_animal/hostile/mining_drone,
- /mob/living/simple_animal/hostile/poison,
- /mob/living/simple_animal/hostile/blob,
- /mob/living/simple_animal/ascendant_shadowling
- )//exclusion list for things you don't want the reaction to create.
- var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs
- var/atom/A = holder.my_atom
- var/turf/T = get_turf(A)
- var/area/my_area = get_area(T)
- var/message = "A [reaction_name] reaction has occured in [my_area.name]. (JMP)"
- message += " (VV)"
-
- var/mob/M = get(A, /mob)
- if(M)
- message += " - Carried By: [M.real_name] ([M.key]) (PP) (?)"
- else
- message += " - Last Fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]"
-
- message_admins(message, 0, 1)
-
- playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
-
- for(var/mob/living/carbon/human/H in viewers(get_turf(holder.my_atom), null))
- H.flash_eyes()
- for(var/i = 1, i <= amount_to_spawn, i++)
- var/chosen = pick(critters)
- var/mob/living/simple_animal/hostile/C = new chosen
- C.faction |= mob_faction
- C.loc = get_turf(holder.my_atom)
+
+/datum/chemical_reaction/ironfoam
+ name = "Iron Foam"
+ id = "ironlfoam"
+ result = null
+ required_reagents = list("iron" = 3, "foaming_agent" = 1, "facid" = 1)
+ result_amount = 5
+ mob_react = 1
+
+/datum/chemical_reaction/ironfoam/on_reaction(var/datum/reagents/holder, var/created_volume)
+ var/location = get_turf(holder.my_atom)
+
+ for(var/mob/M in viewers(5, location))
+ M << "The solution spews out a metallic foam!"
+
+ var/datum/effect/effect/system/foam_spread/metal/s = new()
+ s.set_up(created_volume, location, holder, 2)
+ s.start()
+ holder.clear_reagents()
+ return
+
+
+/datum/chemical_reaction/foaming_agent
+ name = "Foaming Agent"
+ id = "foaming_agent"
+ result = "foaming_agent"
+ required_reagents = list("lithium" = 1, "hydrogen" = 1)
+ result_amount = 1
+
+// Synthesizing these three chemicals is pretty complex in real life, but fuck it, it's just a game!
+/datum/chemical_reaction/ammonia
+ name = "Ammonia"
+ id = "ammonia"
+ result = "ammonia"
+ required_reagents = list("hydrogen" = 3, "nitrogen" = 1)
+ result_amount = 3
+
+/datum/chemical_reaction/diethylamine
+ name = "Diethylamine"
+ id = "diethylamine"
+ result = "diethylamine"
+ required_reagents = list ("ammonia" = 1, "ethanol" = 1)
+ result_amount = 2
+
+/datum/chemical_reaction/space_cleaner
+ name = "Space cleaner"
+ id = "cleaner"
+ result = "cleaner"
+ required_reagents = list("ammonia" = 1, "water" = 1)
+ result_amount = 2
+
+/datum/chemical_reaction/plantbgone
+ name = "Plant-B-Gone"
+ id = "plantbgone"
+ result = "plantbgone"
+ required_reagents = list("toxin" = 1, "water" = 4)
+ result_amount = 5
+
+datum/chemical_reaction/weedkiller
+ name = "Weed Killer"
+ id = "weedkiller"
+ result = "weedkiller"
+ required_reagents = list("toxin" = 1, "ammonia" = 4)
+ result_amount = 5
+
+datum/chemical_reaction/pestkiller
+ name = "Pest Killer"
+ id = "pestkiller"
+ result = "pestkiller"
+ required_reagents = list("toxin" = 1, "ethanol" = 4)
+ result_amount = 5
+
+/////////////////////////////////////////////NEW SLIME CORE REACTIONS/////////////////////////////////////////////
+
+//Grey
+/datum/chemical_reaction/slimespawn
+ name = "Slime Spawn"
+ id = "m_spawn"
+ result = null
+ required_reagents = list("plasma" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/grey
+ required_other = 1
+/datum/chemical_reaction/slimespawn/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ for(var/mob/O in viewers(get_turf(holder.my_atom), null))
+ O.show_message(text("Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!"), 1)
+ var/mob/living/carbon/slime/S = new /mob/living/carbon/slime
+ S.loc = get_turf(holder.my_atom)
+
+/datum/chemical_reaction/slimeinaprov
+ name = "Slime epinephrine"
+ id = "m_inaprov"
+ result = "epinephrine"
+ required_reagents = list("water" = 5)
+ result_amount = 3
+ required_other = 1
+ required_container = /obj/item/slime_extract/grey
+/datum/chemical_reaction/slimeinaprov/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+
+/datum/chemical_reaction/slimemonkey
+ name = "Slime Monkey"
+ id = "m_monkey"
+ result = null
+ required_reagents = list("blood" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/grey
+ required_other = 1
+/datum/chemical_reaction/slimemonkey/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ for(var/i = 1, i <= 3, i++)
+ var /obj/item/weapon/reagent_containers/food/snacks/monkeycube/M = new /obj/item/weapon/reagent_containers/food/snacks/monkeycube
+ M.loc = get_turf(holder.my_atom)
+
+//Green
+/datum/chemical_reaction/slimemutate
+ name = "Mutation Toxin"
+ id = "mutationtoxin"
+ result = "mutationtoxin"
+ required_reagents = list("plasma" = 1)
+ result_amount = 1
+ required_other = 1
+ required_container = /obj/item/slime_extract/green
+/datum/chemical_reaction/slimemutate/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+
+//Metal
+/datum/chemical_reaction/slimemetal
+ name = "Slime Metal"
+ id = "m_metal"
+ result = null
+ required_reagents = list("plasma" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/metal
+ required_other = 1
+/datum/chemical_reaction/slimemetal/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal
+ M.amount = 15
+ M.loc = get_turf(holder.my_atom)
+ var/obj/item/stack/sheet/plasteel/P = new /obj/item/stack/sheet/plasteel
+ P.amount = 5
+ P.loc = get_turf(holder.my_atom)
+
+//Gold
+/datum/chemical_reaction/slimecrit
+ name = "Slime Crit"
+ id = "m_tele"
+ result = null
+ required_reagents = list("plasma" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/gold
+ required_other = 1
+/datum/chemical_reaction/slimecrit/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ for(var/mob/O in viewers(get_turf(holder.my_atom), null))
+ O.show_message(text("The slime extract begins to vibrate violently !"), 1)
+ spawn(50)
+
+ chemical_mob_spawn(holder, 5, "Gold Slime")
+
+/datum/chemical_reaction/slimecritlesser
+ name = "Slime Crit Lesser"
+ id = "m_tele3"
+ result = null
+ required_reagents = list("blood" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/gold
+ required_other = 1
+/datum/chemical_reaction/slimecritlesser/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ for(var/mob/O in viewers(get_turf(holder.my_atom), null))
+ O.show_message(text("The slime extract begins to vibrate violently !"), 1)
+ spawn(50)
+
+ chemical_mob_spawn(holder, 1, "Lesser Gold Slime", "neutral")
+
+//Silver
+/datum/chemical_reaction/slimebork
+ name = "Slime Bork"
+ id = "m_tele2"
+ result = null
+ required_reagents = list("plasma" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/silver
+ required_other = 1
+/datum/chemical_reaction/slimebork/on_reaction(var/datum/reagents/holder)
+
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+
+ var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/snacks) - /obj/item/weapon/reagent_containers/food/snacks
+ // BORK BORK BORK
+
+ playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
+
+ for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null))
+ M.flash_eyes()
+
+ for(var/i = 1, i <= 4 + rand(1,2), i++)
+ var/chosen = pick(borks)
+ var/obj/B = new chosen
+ if(B)
+ B.loc = get_turf(holder.my_atom)
+ if(prob(50))
+ for(var/j = 1, j <= rand(1, 3), j++)
+ step(B, pick(NORTH,SOUTH,EAST,WEST))
+
+
+/datum/chemical_reaction/slimebork2
+ name = "Slime Bork 2"
+ id = "m_tele4"
+ result = null
+ required_reagents = list("water" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/silver
+ required_other = 1
+/datum/chemical_reaction/slimebork2/on_reaction(var/datum/reagents/holder)
+
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+
+ var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/drinks) - /obj/item/weapon/reagent_containers/food/drinks
+ // BORK BORK BORK
+
+ playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
+
+ for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null))
+ M.flash_eyes()
+
+ for(var/i = 1, i <= 4 + rand(1,2), i++)
+ var/chosen = pick(borks)
+ var/obj/B = new chosen
+ if(B)
+ B.loc = get_turf(holder.my_atom)
if(prob(50))
for(var/j = 1, j <= rand(1, 3), j++)
- step(C, pick(NORTH,SOUTH,EAST,WEST))
-
-/datum/chemical_reaction/proc/goonchem_vortex(var/turf/simulated/T, var/setting_type, var/range, var/pull_times)
- for(var/atom/movable/X in orange(range, T))
- if(istype(X, /obj/effect))
- continue //stop pulling smoke and hotspots please
- if(istype(X, /atom/movable))
- if((X) && !X.anchored)
- if(setting_type)
- for(var/i = 0, i < pull_times, i++)
- step_away(X,T)
- else
- for(var/i = 0, i < pull_times, i++)
- step_towards(X,T)
\ No newline at end of file
+ step(B, pick(NORTH,SOUTH,EAST,WEST))
+
+
+//Blue
+/datum/chemical_reaction/slimefrost
+ name = "Slime Frost Oil"
+ id = "m_frostoil"
+ result = "frostoil"
+ required_reagents = list("plasma" = 1)
+ result_amount = 10
+ required_container = /obj/item/slime_extract/blue
+ required_other = 1
+/datum/chemical_reaction/slimefrost/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+
+//Dark Blue
+/datum/chemical_reaction/slimefreeze
+ name = "Slime Freeze"
+ id = "m_freeze"
+ result = null
+ required_reagents = list("plasma" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/darkblue
+ required_other = 1
+/datum/chemical_reaction/slimefreeze/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ for(var/mob/O in viewers(get_turf(holder.my_atom), null))
+ O.show_message(text("The slime extract begins to vibrate violently !"), 1)
+ spawn(50)
+ if(holder && holder.my_atom)
+ playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
+ for(var/mob/living/M in range (get_turf(holder.my_atom), 7))
+ M.bodytemperature -= 240
+ M << "You feel a chill!"
+
+//Orange
+/datum/chemical_reaction/slimecasp
+ name = "Slime Capsaicin Oil"
+ id = "m_capsaicinoil"
+ result = "capsaicin"
+ required_reagents = list("blood" = 1)
+ result_amount = 10
+ required_container = /obj/item/slime_extract/orange
+ required_other = 1
+/datum/chemical_reaction/slimecasp/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+
+/datum/chemical_reaction/slimefire
+ name = "Slime fire"
+ id = "m_fire"
+ result = null
+ required_reagents = list("plasma" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/orange
+ required_other = 1
+/datum/chemical_reaction/slimefire/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ for(var/mob/O in viewers(get_turf(holder.my_atom), null))
+ O.show_message(text("The slime extract begins to vibrate violently !"), 1)
+ spawn(50)
+ if(holder && holder.my_atom)
+ var/turf/simulated/T = get_turf(holder.my_atom)
+ if(istype(T))
+ T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 50)
+
+//Yellow
+
+/datum/chemical_reaction/slimeoverload
+ name = "Slime EMP"
+ id = "m_emp"
+ result = null
+ required_reagents = list("blood" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/yellow
+ required_other = 1
+/datum/chemical_reaction/slimeoverload/on_reaction(var/datum/reagents/holder, var/created_volume)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ empulse(get_turf(holder.my_atom), 3, 7)
+
+
+/datum/chemical_reaction/slimecell
+ name = "Slime Powercell"
+ id = "m_cell"
+ result = null
+ required_reagents = list("plasma" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/yellow
+ required_other = 1
+/datum/chemical_reaction/slimecell/on_reaction(var/datum/reagents/holder, var/created_volume)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ var/obj/item/weapon/stock_parts/cell/high/slime/P = new /obj/item/weapon/stock_parts/cell/high/slime
+ P.loc = get_turf(holder.my_atom)
+
+/datum/chemical_reaction/slimeglow
+ name = "Slime Glow"
+ id = "m_glow"
+ result = null
+ required_reagents = list("water" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/yellow
+ required_other = 1
+/datum/chemical_reaction/slimeglow/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ for(var/mob/O in viewers(get_turf(holder.my_atom), null))
+ O.show_message(text("The slime begins to emit a soft light. Squeezing it will cause it to grow brightly."), 1)
+ var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime
+ F.loc = get_turf(holder.my_atom)
+
+//Purple
+
+/datum/chemical_reaction/slimepsteroid
+ name = "Slime Steroid"
+ id = "m_steroid"
+ result = null
+ required_reagents = list("plasma" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/purple
+ required_other = 1
+/datum/chemical_reaction/slimepsteroid/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ var/obj/item/weapon/slimesteroid/P = new /obj/item/weapon/slimesteroid
+ P.loc = get_turf(holder.my_atom)
+
+/datum/chemical_reaction/slimejam
+ name = "Slime Jam"
+ id = "m_jam"
+ result = "slimejelly"
+ required_reagents = list("sugar" = 1)
+ result_amount = 10
+ required_container = /obj/item/slime_extract/purple
+ required_other = 1
+/datum/chemical_reaction/slimejam/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+
+
+//Dark Purple
+/datum/chemical_reaction/slimeplasma
+ name = "Slime Plasma"
+ id = "m_plasma"
+ result = null
+ required_reagents = list("plasma" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/darkpurple
+ required_other = 1
+/datum/chemical_reaction/slimeplasma/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ var/obj/item/stack/sheet/mineral/plasma/P = new /obj/item/stack/sheet/mineral/plasma
+ P.amount = 10
+ P.loc = get_turf(holder.my_atom)
+
+//Red
+/datum/chemical_reaction/slimeglycerol
+ name = "Slime Glycerol"
+ id = "m_glycerol"
+ result = "glycerol"
+ required_reagents = list("plasma" = 1)
+ result_amount = 8
+ required_container = /obj/item/slime_extract/red
+ required_other = 1
+/datum/chemical_reaction/slimeglycerol/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+
+
+/datum/chemical_reaction/slimebloodlust
+ name = "Bloodlust"
+ id = "m_bloodlust"
+ result = null
+ required_reagents = list("blood" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/red
+ required_other = 1
+/datum/chemical_reaction/slimebloodlust/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ for(var/mob/living/carbon/slime/slime in viewers(get_turf(holder.my_atom), null))
+ slime.rabid = 1
+ for(var/mob/O in viewers(get_turf(holder.my_atom), null))
+ O.show_message(text("The [slime] is driven into a frenzy!"), 1)
+
+//Pink
+/datum/chemical_reaction/slimeppotion
+ name = "Slime Potion"
+ id = "m_potion"
+ result = null
+ required_reagents = list("plasma" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/pink
+ required_other = 1
+/datum/chemical_reaction/slimeppotion/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ var/obj/item/slimepotion/P = new /obj/item/slimepotion
+ P.loc = get_turf(holder.my_atom)
+
+
+//Black
+/datum/chemical_reaction/slimemutate2
+ name = "Advanced Mutation Toxin"
+ id = "mutationtoxin2"
+ result = "amutationtoxin"
+ required_reagents = list("plasma" = 1)
+ result_amount = 1
+ required_other = 1
+ required_container = /obj/item/slime_extract/black
+/datum/chemical_reaction/slimemutate2/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+
+//Oil
+/datum/chemical_reaction/slimeexplosion
+ name = "Slime Explosion"
+ id = "m_explosion"
+ result = null
+ required_reagents = list("plasma" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/oil
+ required_other = 1
+/datum/chemical_reaction/slimeexplosion/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ for(var/mob/O in viewers(get_turf(holder.my_atom), null))
+ O.show_message(text("The slime extract begins to vibrate violently !"), 1)
+ spawn(50)
+ if(holder && holder.my_atom)
+ explosion(get_turf(holder.my_atom), 1 ,3, 6)
+//Light Pink
+/datum/chemical_reaction/slimepotion2
+ name = "Slime Potion 2"
+ id = "m_potion2"
+ result = null
+ result_amount = 1
+ required_container = /obj/item/slime_extract/lightpink
+ required_reagents = list("plasma" = 1)
+ required_other = 1
+/datum/chemical_reaction/slimepotion2/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ var/obj/item/slimepotion2/P = new /obj/item/slimepotion2
+ P.loc = get_turf(holder.my_atom)
+//Adamantine
+/datum/chemical_reaction/slimegolem
+ name = "Slime Golem"
+ id = "m_golem"
+ result = null
+ required_reagents = list("plasma" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/adamantine
+ required_other = 1
+/datum/chemical_reaction/slimegolem/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ var/obj/effect/golemrune/Z = new /obj/effect/golemrune
+ Z.loc = get_turf(holder.my_atom)
+ notify_ghosts("Golem rune created in [get_area(Z)].", 'sound/effects/ghost2.ogg')
+
+//Bluespace
+
+/datum/chemical_reaction/slimecrystal
+ name = "Slime Crystal"
+ id = "m_crystal"
+ result = null
+ required_reagents = list("blood" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/bluespace
+ required_other = 1
+/datum/chemical_reaction/slimecrystal/on_reaction(var/datum/reagents/holder, var/created_volume)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ if(holder.my_atom)
+ var/obj/item/bluespace_crystal/BC = new(get_turf(holder.my_atom))
+ BC.visible_message("The [BC.name] appears out of thin air!")
+
+//Cerulean
+
+/datum/chemical_reaction/slimepsteroid2
+ name = "Slime Steroid 2"
+ id = "m_steroid2"
+ result = null
+ required_reagents = list("plasma" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/cerulean
+ required_other = 1
+/datum/chemical_reaction/slimepsteroid2/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ var/obj/item/weapon/slimesteroid2/P = new /obj/item/weapon/slimesteroid2
+ P.loc = get_turf(holder.my_atom)
+
+//Sepia
+/datum/chemical_reaction/slimecamera
+ name = "Slime Camera"
+ id = "m_camera"
+ result = null
+ required_reagents = list("plasma" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/sepia
+ required_other = 1
+/datum/chemical_reaction/slimecamera/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ var/obj/item/device/camera/P = new /obj/item/device/camera
+ P.loc = get_turf(holder.my_atom)
+
+/datum/chemical_reaction/slimefilm
+ name = "Slime Film"
+ id = "m_film"
+ result = null
+ required_reagents = list("blood" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/sepia
+ required_other = 1
+/datum/chemical_reaction/slimefilm/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ var/obj/item/device/camera_film/P = new /obj/item/device/camera_film
+ P.loc = get_turf(holder.my_atom)
+
+
+//Pyrite
+
+/datum/chemical_reaction/slimepaint
+ name = "Slime Paint"
+ id = "s_paint"
+ result = null
+ required_reagents = list("plasma" = 1)
+ result_amount = 1
+ required_container = /obj/item/slime_extract/pyrite
+ required_other = 1
+/datum/chemical_reaction/slimepaint/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ var/list/paints = typesof(/obj/item/weapon/paint) - /obj/item/weapon/paint
+ var/chosen = pick(paints)
+ var/obj/P = new chosen
+ if(P)
+ P.loc = get_turf(holder.my_atom)
+
diff --git a/code/modules/reagents/Chemistry-Recipes/Drugs.dm b/code/modules/reagents/Chemistry-Recipes/Drugs.dm
deleted file mode 100644
index 6916187a7eb1f..0000000000000
--- a/code/modules/reagents/Chemistry-Recipes/Drugs.dm
+++ /dev/null
@@ -1,48 +0,0 @@
-/datum/chemical_reaction/space_drugs
- name = "Space Drugs"
- id = "space_drugs"
- result = "space_drugs"
- required_reagents = list("mercury" = 1, "sugar" = 1, "lithium" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/crank
- name = "Crank"
- id = "crank"
- result = "crank"
- required_reagents = list("diphenhydramine" = 1, "ammonia" = 1, "lithium" = 1, "sacid" = 1, "fuel" = 1)
- result_amount = 5
- mix_message = "The mixture violently reacts, leaving behind a few crystalline shards."
- required_temp = 390
-
-
-/datum/chemical_reaction/krokodil
- name = "Krokodil"
- id = "krokodil"
- result = "krokodil"
- required_reagents = list("diphenhydramine" = 1, "morphine" = 1, "cleaner" = 1, "potassium" = 1, "phosphorus" = 1, "fuel" = 1)
- result_amount = 6
- mix_message = "The mixture dries into a pale blue powder."
- required_temp = 380
-
-/datum/chemical_reaction/methamphetamine
- name = "methamphetamine"
- id = "methamphetamine"
- result = "methamphetamine"
- required_reagents = list("ephedrine" = 1, "iodine" = 1, "phosphorus" = 1, "hydrogen" = 1)
- result_amount = 4
- required_temp = 374
-
-/datum/chemical_reaction/bath_salts
- name = "bath_salts"
- id = "bath_salts"
- result = "bath_salts"
- required_reagents = list("????" = 1, "saltpetre" = 1, "nutriment" = 1, "cleaner" = 1, "enzyme" = 1, "tea" = 1, "mercury" = 1)
- result_amount = 7
- required_temp = 374
-
-/datum/chemical_reaction/aranesp
- name = "aranesp"
- id = "aranesp"
- result = "aranesp"
- required_reagents = list("epinephrine" = 1, "atropine" = 1, "morphine" = 1)
- result_amount = 3
diff --git a/code/modules/reagents/Chemistry-Recipes/Medicine.dm b/code/modules/reagents/Chemistry-Recipes/Medicine.dm
deleted file mode 100644
index a73477d86299b..0000000000000
--- a/code/modules/reagents/Chemistry-Recipes/Medicine.dm
+++ /dev/null
@@ -1,197 +0,0 @@
-
-/datum/chemical_reaction/leporazine
- name = "Leporazine"
- id = "leporazine"
- result = "leporazine"
- required_reagents = list("silicon" = 1, "copper" = 1)
- required_catalysts = list("plasma" = 5)
- result_amount = 2
-
-/datum/chemical_reaction/rezadone
- name = "Rezadone"
- id = "rezadone"
- result = "rezadone"
- required_reagents = list("carpotoxin" = 1, "cryptobiolin" = 1, "copper" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/spaceacillin
- name = "Spaceacillin"
- id = "spaceacillin"
- result = "spaceacillin"
- required_reagents = list("cryptobiolin" = 1, "epinephrine" = 1)
- result_amount = 2
-
-/datum/chemical_reaction/inacusiate
- name = "inacusiate"
- id = "inacusiate"
- result = "inacusiate"
- required_reagents = list("water" = 1, "carbon" = 1, "charcoal" = 1)
- result_amount = 2
-
-/datum/chemical_reaction/synaptizine
- name = "Synaptizine"
- id = "synaptizine"
- result = "synaptizine"
- required_reagents = list("sugar" = 1, "lithium" = 1, "water" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/charcoal
- name = "Charcoal"
- id = "charcoal"
- result = "charcoal"
- required_reagents = list("ash" = 1, "sodiumchloride" = 1)
- result_amount = 2
- mix_message = "The mixture yields a fine black powder."
- required_temp = 380
-
-/datum/chemical_reaction/silver_sulfadiazine
- name = "Silver Sulfadiazine"
- id = "silver_sulfadiazine"
- result = "silver_sulfadiazine"
- required_reagents = list("ammonia" = 1, "silver" = 1, "sulfur" = 1, "oxygen" = 1, "chlorine" = 1)
- result_amount = 5
-
-/datum/chemical_reaction/salglu_solution
- name = "Saline-Glucose Solution"
- id = "salglu_solution"
- result = "salglu_solution"
- required_reagents = list("sodiumchloride" = 1, "water" = 1, "sugar" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/synthflesh
- name = "Synthflesh"
- id = "synthflesh"
- result = "synthflesh"
- required_reagents = list("blood" = 1, "carbon" = 1, "styptic_powder" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/styptic_powder
- name = "Styptic Powder"
- id = "styptic_powder"
- result = "styptic_powder"
- required_reagents = list("aluminium" = 1, "hydrogen" = 1, "oxygen" = 1, "sacid" = 1)
- result_amount = 4
- mix_message = "The solution yields an astringent powder."
-
-/datum/chemical_reaction/calomel
- name = "Calomel"
- id = "calomel"
- result = "calomel"
- required_reagents = list("mercury" = 1, "chlorine" = 1)
- result_amount = 2
- required_temp = 374
-
-/datum/chemical_reaction/potass_iodide
- name = "Potassium Iodide"
- id = "potass_iodide"
- result = "potass_iodide"
- required_reagents = list("potassium" = 1, "iodine" = 1)
- result_amount = 2
-
-/datum/chemical_reaction/pen_acid
- name = "Pentetic Acid"
- id = "pen_acid"
- result = "pen_acid"
- required_reagents = list("fuel" = 1, "chlorine" = 1, "ammonia" = 1, "formaldehyde" = 1, "sodium" = 1, "cyanide" = 1)
- result_amount = 6
-
-/datum/chemical_reaction/sal_acid
- name = "Salicyclic Acid"
- id = "sal_acid"
- result = "sal_acid"
- required_reagents = list("sodium" = 1, "phenol" = 1, "carbon" = 1, "oxygen" = 1, "sacid" = 1)
- result_amount = 5
-
-
-/datum/chemical_reaction/salbutamol
- name = "Salbutamol"
- id = "salbutamol"
- result = "salbutamol"
- required_reagents = list("sal_acid" = 1, "lithium" = 1, "aluminium" = 1, "bromine" = 1, "ammonia" = 1)
- result_amount = 5
-
-/datum/chemical_reaction/perfluorodecalin
- name = "Perfluorodecalin"
- id = "perfluorodecalin"
- result = "perfluorodecalin"
- required_reagents = list("hydrogen" = 1, "fluorine" = 1, "oil" = 1)
- result_amount = 3
- required_temp = 370
- mix_message = "The mixture rapidly turns into a dense pink liquid."
-
-/datum/chemical_reaction/ephedrine
- name = "Ephedrine"
- id = "ephedrine"
- result = "ephedrine"
- required_reagents = list("sugar" = 1, "oil" = 1, "hydrogen" = 1, "diethylamine" = 1)
- result_amount = 4
- mix_message = "The solution fizzes and gives off toxic fumes."
-
-/datum/chemical_reaction/diphenhydramine
- name = "Diphenhydramine"
- id = "diphenhydramine"
- result = "diphenhydramine"
- required_reagents = list("oil" = 1, "carbon" = 1, "bromine" = 1, "diethylamine" = 1, "ethanol" = 1)
- result_amount = 4
- mix_message = "The mixture dries into a pale blue powder."
-
-/datum/chemical_reaction/oculine
- name = "Oculine"
- id = "oculine"
- result = "oculine"
- required_reagents = list("charcoal" = 1, "carbon" = 1, "hydrogen" = 1)
- result_amount = 3
- mix_message = "The mixture sputters loudly and becomes a pale pink color."
-
-/datum/chemical_reaction/atropine
- name = "Atropine"
- id = "atropine"
- result = "atropine"
- required_reagents = list("ethanol" = 1, "acetone" = 1, "diethylamine" = 1, "phenol" = 1, "sacid" = 1)
- result_amount = 5
-
-/datum/chemical_reaction/epinephrine
- name = "Epinephrine"
- id = "epinephrine"
- result = "epinephrine"
- required_reagents = list("phenol" = 1, "acetone" = 1, "diethylamine" = 1, "oxygen" = 1, "chlorine" = 1, "hydrogen" = 1)
- result_amount = 6
-
-/datum/chemical_reaction/strange_reagent
- name = "Strange Reagent"
- id = "strange_reagent"
- result = "strange_reagent"
- required_reagents = list("omnizine" = 1, "holywater" = 1, "mutagen" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/mannitol
- name = "Mannitol"
- id = "mannitol"
- result = "mannitol"
- required_reagents = list("sugar" = 1, "hydrogen" = 1, "water" = 1)
- result_amount = 3
- mix_message = "The solution slightly bubbles, becoming thicker."
-
-/datum/chemical_reaction/mutadone
- name = "Mutadone"
- id = "mutadone"
- result = "mutadone"
- required_reagents = list("mutagen" = 1, "acetone" = 1, "bromine" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/antihol
- name = "antihol"
- id = "antihol"
- result = "antihol"
- required_reagents = list("ethanol" = 1, "charcoal" = 1, "copper" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/cryoxadone
- name = "Cryoxadone"
- id = "cryoxadone"
- result = "cryoxadone"
- required_reagents = list("stable_plasma" = 1, "acetone" = 1, "mutagen" = 1)
- result_amount = 3
-
-
-
diff --git a/code/modules/reagents/Chemistry-Recipes/Others.dm b/code/modules/reagents/Chemistry-Recipes/Others.dm
deleted file mode 100644
index 8a44606fcbc2d..0000000000000
--- a/code/modules/reagents/Chemistry-Recipes/Others.dm
+++ /dev/null
@@ -1,342 +0,0 @@
-
-/datum/chemical_reaction/sterilizine
- name = "Sterilizine"
- id = "sterilizine"
- result = "sterilizine"
- required_reagents = list("ethanol" = 1, "charcoal" = 1, "chlorine" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/lube
- name = "Space Lube"
- id = "lube"
- result = "lube"
- required_reagents = list("water" = 1, "silicon" = 1, "oxygen" = 1)
- result_amount = 4
-
-/datum/chemical_reaction/impedrezene
- name = "Impedrezene"
- id = "impedrezene"
- result = "impedrezene"
- required_reagents = list("mercury" = 1, "oxygen" = 1, "sugar" = 1)
- result_amount = 2
-
-/datum/chemical_reaction/cryptobiolin
- name = "Cryptobiolin"
- id = "cryptobiolin"
- result = "cryptobiolin"
- required_reagents = list("potassium" = 1, "oxygen" = 1, "sugar" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/glycerol
- name = "Glycerol"
- id = "glycerol"
- result = "glycerol"
- required_reagents = list("cornoil" = 3, "sacid" = 1)
- result_amount = 1
-
-/datum/chemical_reaction/sodiumchloride
- name = "Sodium Chloride"
- id = "sodiumchloride"
- result = "sodiumchloride"
- required_reagents = list("water" = 1, "sodium" = 1, "chlorine" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/plasmasolidification
- name = "Solid Plasma"
- id = "solidplasma"
- result = null
- required_reagents = list("iron" = 5, "frostoil" = 5, "plasma" = 20)
- result_amount = 1
- mob_react = 1
-
-/datum/chemical_reaction/plasmasolidification/on_reaction(var/datum/reagents/holder, var/created_volume)
- var/location = get_turf(holder.my_atom)
- new /obj/item/stack/sheet/mineral/plasma(location)
- return
-
-/datum/chemical_reaction/capsaicincondensation
- name = "Capsaicincondensation"
- id = "capsaicincondensation"
- result = "condensedcapsaicin"
- required_reagents = list("capsaicin" = 1, "ethanol" = 5)
- result_amount = 5
-
-
-////////////////////////////////// VIROLOGY //////////////////////////////////////////
-
-/datum/chemical_reaction/virus_food
- name = "Virus Food"
- id = "virusfood"
- result = "virusfood"
- required_reagents = list("water" = 5, "milk" = 5)
- result_amount = 15
-
-/datum/chemical_reaction/mix_virus
- name = "Mix Virus"
- id = "mixvirus"
- result = "blood"
- required_reagents = list("virusfood" = 1)
- required_catalysts = list("blood" = 1)
- var/level_min = 0
- var/level_max = 2
-
-/datum/chemical_reaction/mix_virus/on_reaction(var/datum/reagents/holder, var/created_volume)
-
- var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list
- if(B && B.data)
- var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"]
- if(D)
- D.Evolve(level_min, level_max)
-
-
-/datum/chemical_reaction/mix_virus/mix_virus_2
-
- name = "Mix Virus 2"
- id = "mixvirus2"
- required_reagents = list("mutagen" = 1)
- level_min = 2
- level_max = 4
-
-/datum/chemical_reaction/mix_virus/mix_virus_3
-
- name = "Mix Virus 3"
- id = "mixvirus3"
- required_reagents = list("plasma" = 1)
- level_min = 4
- level_max = 6
-
-/datum/chemical_reaction/mix_virus/rem_virus
-
- name = "Devolve Virus"
- id = "remvirus"
- required_reagents = list("synaptizine" = 1)
- required_catalysts = list("blood" = 1)
-
-/datum/chemical_reaction/mix_virus/rem_virus/on_reaction(var/datum/reagents/holder, var/created_volume)
-
- var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list
- if(B && B.data)
- var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"]
- if(D)
- D.Devolve()
-
-
-
-////////////////////////////////// foam and foam precursor ///////////////////////////////////////////////////
-
-
-/datum/chemical_reaction/surfactant
- name = "Foam surfactant"
- id = "foam surfactant"
- result = "fluorosurfactant"
- required_reagents = list("fluorine" = 2, "carbon" = 2, "sacid" = 1)
- result_amount = 5
-
-
-/datum/chemical_reaction/foam
- name = "Foam"
- id = "foam"
- result = null
- required_reagents = list("fluorosurfactant" = 1, "water" = 1)
- result_amount = 2
- mob_react = 1
-
-/datum/chemical_reaction/foam/on_reaction(var/datum/reagents/holder, var/created_volume)
- var/location = get_turf(holder.my_atom)
-
- for(var/mob/M in viewers(5, location))
- M << "The solution spews out foam!"
-
- var/datum/effect/effect/system/foam_spread/s = new()
- s.set_up(created_volume, location, holder)
- s.start()
- holder.clear_reagents()
- return
-
-
-/datum/chemical_reaction/metalfoam
- name = "Metal Foam"
- id = "metalfoam"
- result = null
- required_reagents = list("aluminium" = 3, "foaming_agent" = 1, "facid" = 1)
- result_amount = 5
- mob_react = 1
-
-/datum/chemical_reaction/metalfoam/on_reaction(var/datum/reagents/holder, var/created_volume)
- var/location = get_turf(holder.my_atom)
-
- for(var/mob/M in viewers(5, location))
- M << "The solution spews out a metallic foam!"
-
- var/datum/effect/effect/system/foam_spread/metal/s = new()
- s.set_up(created_volume, location, holder, 1)
- s.start()
- holder.clear_reagents()
-
-/datum/chemical_reaction/ironfoam
- name = "Iron Foam"
- id = "ironlfoam"
- result = null
- required_reagents = list("iron" = 3, "foaming_agent" = 1, "facid" = 1)
- result_amount = 5
- mob_react = 1
-
-/datum/chemical_reaction/ironfoam/on_reaction(var/datum/reagents/holder, var/created_volume)
- var/location = get_turf(holder.my_atom)
- for(var/mob/M in viewers(5, location))
- M << "The solution spews out a metallic foam!"
- var/datum/effect/effect/system/foam_spread/metal/s = new()
- s.set_up(created_volume, location, holder, 2)
- s.start()
- holder.clear_reagents()
-
-/datum/chemical_reaction/foaming_agent
- name = "Foaming Agent"
- id = "foaming_agent"
- result = "foaming_agent"
- required_reagents = list("lithium" = 1, "hydrogen" = 1)
- result_amount = 1
-
-
-/////////////////////////////// Cleaning and hydroponics /////////////////////////////////////////////////
-
-/datum/chemical_reaction/ammonia
- name = "Ammonia"
- id = "ammonia"
- result = "ammonia"
- required_reagents = list("hydrogen" = 3, "nitrogen" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/diethylamine
- name = "Diethylamine"
- id = "diethylamine"
- result = "diethylamine"
- required_reagents = list ("ammonia" = 1, "ethanol" = 1)
- result_amount = 2
-
-/datum/chemical_reaction/space_cleaner
- name = "Space cleaner"
- id = "cleaner"
- result = "cleaner"
- required_reagents = list("ammonia" = 1, "water" = 1)
- result_amount = 2
-
-/datum/chemical_reaction/plantbgone
- name = "Plant-B-Gone"
- id = "plantbgone"
- result = "plantbgone"
- required_reagents = list("toxin" = 1, "water" = 4)
- result_amount = 5
-
-datum/chemical_reaction/weedkiller
- name = "Weed Killer"
- id = "weedkiller"
- result = "weedkiller"
- required_reagents = list("toxin" = 1, "ammonia" = 4)
- result_amount = 5
-
-datum/chemical_reaction/pestkiller
- name = "Pest Killer"
- id = "pestkiller"
- result = "pestkiller"
- required_reagents = list("toxin" = 1, "ethanol" = 4)
- result_amount = 5
-
-
-//////////////////////////////////// Other goon stuff ///////////////////////////////////////////
-
-/datum/chemical_reaction/acetone
- name = "acetone"
- id = "acetone"
- result = "acetone"
- required_reagents = list("oil" = 1, "fuel" = 1, "oxygen" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/carpet
- name = "carpet"
- id = "carpet"
- result = "carpet"
- required_reagents = list("space_drugs" = 1, "blood" = 1)
- result_amount = 2
-
-
-/datum/chemical_reaction/oil
- name = "Oil"
- id = "oil"
- result = "oil"
- required_reagents = list("fuel" = 1, "carbon" = 1, "hydrogen" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/phenol
- name = "phenol"
- id = "phenol"
- result = "phenol"
- required_reagents = list("water" = 1, "chlorine" = 1, "oil" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/ash
- name = "Ash"
- id = "ash"
- result = "ash"
- required_reagents = list("oil" = 1)
- result_amount = 1
- required_temp = 480
-
-/datum/chemical_reaction/colorful_reagent
- name = "colorful_reagent"
- id = "colorful_reagent"
- result = "colorful_reagent"
- required_reagents = list("stable_plasma" = 1, "radium" = 1, "space_drugs" = 1, "cryoxadone" = 1, "triple_citrus" = 1)
- result_amount = 5
-
-/datum/chemical_reaction/life
- name = "Life"
- id = "life"
- result = null
- required_reagents = list("strange_reagent" = 1, "synthflesh" = 1, "blood" = 1)
- result_amount = 1
- required_temp = 374
-
-/datum/chemical_reaction/life/on_reaction(var/datum/reagents/holder, var/created_volume)
- chemical_mob_spawn(holder, 1, "Life")
-
-/datum/chemical_reaction/corgium
- name = "corgium"
- id = "corgium"
- result = null
- required_reagents = list("nutriment" = 1, "colorful_reagent" = 1, "strange_reagent" = 1, "blood" = 1)
- result_amount = 1
- required_temp = 374
-
-/datum/chemical_reaction/corgium/on_reaction(var/datum/reagents/holder, var/created_volume)
- var/location = get_turf(holder.my_atom)
- new /mob/living/simple_animal/pet/corgi(location)
- ..()
-
-/datum/chemical_reaction/hair_dye
- name = "hair_dye"
- id = "hair_dye"
- result = "hair_dye"
- required_reagents = list("colorful_reagent" = 1, "radium" = 1, "space_drugs" = 1)
- result_amount = 5
-
-/datum/chemical_reaction/barbers_aid
- name = "barbers_aid"
- id = "barbers_aid"
- result = "barbers_aid"
- required_reagents = list("carpet" = 1, "radium" = 1, "space_drugs" = 1)
- result_amount = 5
-
-/datum/chemical_reaction/concentrated_barbers_aid
- name = "concentrated_barbers_aid"
- id = "concentrated_barbers_aid"
- result = "concentrated_barbers_aid"
- required_reagents = list("barbers_aid" = 1, "mutagen" = 1)
- result_amount = 2
-
-/datum/chemical_reaction/saltpetre
- name = "saltpetre"
- id = "saltpetre"
- result = "saltpetre"
- required_reagents = list("potassium" = 1, "nitrogen" = 1, "oxygen" = 3)
- result_amount = 3
\ No newline at end of file
diff --git a/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm b/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm
deleted file mode 100644
index d53162d2a9619..0000000000000
--- a/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm
+++ /dev/null
@@ -1,350 +0,0 @@
-
-/datum/chemical_reaction/nitroglycerin
- name = "Nitroglycerin"
- id = "nitroglycerin"
- result = "nitroglycerin"
- required_reagents = list("glycerol" = 1, "facid" = 1, "sacid" = 1)
- result_amount = 2
-
-/datum/chemical_reaction/nitroglycerin/on_reaction(var/datum/reagents/holder, var/created_volume)
- if(holder.has_reagent("stabilizing_agent"))
- return
- holder.remove_reagent("nitroglycerin", created_volume)
- var/location = get_turf(holder.my_atom)
- var/datum/effect/effect/system/reagents_explosion/e = new()
- e.set_up(round (created_volume/2, 1), location, 0, 0)
- e.start()
- holder.clear_reagents()
-
-/datum/chemical_reaction/nitroglycerin_explosion
- name = "Nitroglycerin explosion"
- id = "nitroglycerin_explosion"
- result = null
- required_reagents = list("nitroglycerin" = 1)
- result_amount = 1
- required_temp = 474
-
-/datum/chemical_reaction/nitroglycerin_explosion/on_reaction(var/datum/reagents/holder, var/created_volume)
- var/location = get_turf(holder.my_atom)
- var/datum/effect/effect/system/reagents_explosion/e = new()
- e.set_up(round(created_volume/2, 1), location, 0, 0)
- e.start()
- holder.clear_reagents()
-
-/datum/chemical_reaction/potassium_explosion
- name = "Explosion"
- id = "potassium_explosion"
- result = null
- required_reagents = list("water" = 1, "potassium" = 1)
- result_amount = 2
-
-/datum/chemical_reaction/potassium_explosion/on_reaction(var/datum/reagents/holder, var/created_volume)
- var/location = get_turf(holder.my_atom)
- var/datum/effect/effect/system/reagents_explosion/e = new()
- e.set_up(round (created_volume/10, 1), location, 0, 0)
- e.start()
- holder.clear_reagents()
-
-/datum/chemical_reaction/blackpowder
- name = "Black Powder"
- id = "blackpowder"
- result = "blackpowder"
- required_reagents = list("saltpetre" = 1, "charcoal" = 1, "sulfur" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/blackpowder_explosion
- name = "Black Powder Kaboom"
- id = "blackpowder_explosion"
- result = null
- required_reagents = list("blackpowder" = 1)
- result_amount = 1
- required_temp = 474
- mix_message = "Sparks start flying around the black powder!"
-
-/datum/chemical_reaction/blackpowder_explosion/on_reaction(var/datum/reagents/holder, var/created_volume)
- sleep(rand(50,100))
- var/location = get_turf(holder.my_atom)
- var/datum/effect/effect/system/reagents_explosion/e = new()
- e.set_up(1 + round(created_volume/6, 1), location, 0, 0)
- e.start()
- holder.clear_reagents()
-
-/datum/chemical_reaction/thermite
- name = "Thermite"
- id = "thermite"
- result = "thermite"
- required_reagents = list("aluminium" = 1, "iron" = 1, "oxygen" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/emp_pulse
- name = "EMP Pulse"
- id = "emp_pulse"
- result = null
- required_reagents = list("uranium" = 1, "iron" = 1) // Yes, laugh, it's the best recipe I could think of that makes a little bit of sense
- result_amount = 2
-
-/datum/chemical_reaction/emp_pulse/on_reaction(var/datum/reagents/holder, var/created_volume)
- var/location = get_turf(holder.my_atom)
- // 100 created volume = 4 heavy range & 7 light range. A few tiles smaller than traitor EMP grandes.
- // 200 created volume = 8 heavy range & 14 light range. 4 tiles larger than traitor EMP grenades.
- empulse(location, round(created_volume / 24), round(created_volume / 14), 1)
- holder.clear_reagents()
-
-/datum/chemical_reaction/stabilizing_agent
- name = "stabilizing_agent"
- id = "stabilizing_agent"
- result = "stabilizing_agent"
- required_reagents = list("iron" = 1, "oxygen" = 1, "hydrogen" = 1)
- result_amount = 3
-
-
-/datum/chemical_reaction/clf3
- name = "Chlorine Trifluoride"
- id = "clf3"
- result = "clf3"
- required_reagents = list("chlorine" = 1, "fluorine" = 3)
- result_amount = 4
- required_temp = 424
-
-/datum/chemical_reaction/clf3/on_reaction(var/datum/reagents/holder, var/created_volume)
- var/turf/T = get_turf(holder.my_atom)
- for(var/turf/turf in range(1,T))
- new /obj/effect/hotspot(turf)
- holder.chem_temp = 1000 // hot as shit
-
-/datum/chemical_reaction/sorium
- name = "Sorium"
- id = "sorium"
- result = "sorium"
- required_reagents = list("mercury" = 1, "oxygen" = 1, "nitrogen" = 1, "carbon" = 1)
- result_amount = 4
-
-/datum/chemical_reaction/sorium/on_reaction(var/datum/reagents/holder, var/created_volume)
- if(holder.has_reagent("stabilizing_agent"))
- return
- holder.remove_reagent("sorium", created_volume)
- var/turf/simulated/T = get_turf(holder.my_atom)
- goonchem_vortex(T, 1, 5, 6)
-
-/datum/chemical_reaction/sorium_vortex
- name = "sorium_vortex"
- id = "sorium_vortex"
- result = null
- required_reagents = list("sorium" = 1)
- required_temp = 474
-
-/datum/chemical_reaction/sorium_vortex/on_reaction(var/datum/reagents/holder, var/created_volume)
- var/turf/simulated/T = get_turf(holder.my_atom)
- goonchem_vortex(T, 1, 5, 6)
-
-
-/datum/chemical_reaction/liquid_dark_matter
- name = "Liquid Dark Matter"
- id = "liquid_dark_matter"
- result = "liquid_dark_matter"
- required_reagents = list("stable_plasma" = 1, "radium" = 1, "carbon" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/liquid_dark_matter/on_reaction(var/datum/reagents/holder, var/created_volume)
- if(holder.has_reagent("stabilizing_agent"))
- return
- holder.remove_reagent("liquid_dark_matter", created_volume)
- var/turf/simulated/T = get_turf(holder.my_atom)
- goonchem_vortex(T, 0, 5, 6)
-
-/datum/chemical_reaction/ldm_vortex
- name = "LDM Vortex"
- id = "ldm_vortex"
- result = null
- required_reagents = list("liquid_dark_matter" = 1)
- required_temp = 474
-
-/datum/chemical_reaction/ldm_vortex/on_reaction(var/datum/reagents/holder, var/created_volume)
- var/turf/simulated/T = get_turf(holder.my_atom)
- goonchem_vortex(T, 0, 5, 6)
-
-/datum/chemical_reaction/flash_powder
- name = "Flash powder"
- id = "flash_powder"
- result = "flash_powder"
- required_reagents = list("aluminium" = 1, "potassium" = 1, "sulfur" = 1 )
- result_amount = 3
-
-/datum/chemical_reaction/flash_powder/on_reaction(var/datum/reagents/holder, var/created_volume)
- if(holder.has_reagent("stabilizing_agent"))
- return
- var/location = get_turf(holder.my_atom)
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(2, 1, location)
- s.start()
- for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location))
- if(C.flash_eyes())
- if(get_dist(C, location) < 4)
- C.Weaken(5)
- else
- C.Stun(5)
- holder.remove_reagent("flash_powder", created_volume)
-
-/datum/chemical_reaction/flash_powder_flash
- name = "Flash powder activation"
- id = "flash_powder_flash"
- result = null
- required_reagents = list("flash_powder" = 1)
- required_temp = 374
-
-/datum/chemical_reaction/flash_powder_flash/on_reaction(var/datum/reagents/holder, var/created_volume)
- var/location = get_turf(holder.my_atom)
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(2, 1, location)
- s.start()
- for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location))
- if(C.flash_eyes())
- if(get_dist(C, location) < 4)
- C.Weaken(5)
- else
- C.Stun(5)
-
-/datum/chemical_reaction/smoke_powder
- name = "smoke_powder"
- id = "smoke_powder"
- result = "smoke_powder"
- required_reagents = list("potassium" = 1, "sugar" = 1, "phosphorus" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/smoke_powder/on_reaction(var/datum/reagents/holder, var/created_volume)
- if(holder.has_reagent("stabilizing_agent"))
- return
- holder.remove_reagent("smoke_powder", created_volume)
- var/location = get_turf(holder.my_atom)
- var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread
- S.attach(location)
- playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3)
- spawn(0)
- if(S)
- S.set_up(holder, 10, 0, location)
- S.start()
- sleep(10)
- S.start()
- if(holder && holder.my_atom)
- holder.clear_reagents()
- return
-
-/datum/chemical_reaction/smoke_powder_smoke
- name = "smoke_powder_smoke"
- id = "smoke_powder_smoke"
- result = null
- required_reagents = list("smoke_powder" = 1)
- required_temp = 374
- secondary = 1
- mob_react = 1
-
-/datum/chemical_reaction/smoke_powder_smoke/on_reaction(var/datum/reagents/holder, var/created_volume)
- var/location = get_turf(holder.my_atom)
- var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread
- S.attach(location)
- playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3)
- spawn(0)
- if(S)
- S.set_up(holder, 10, 0, location)
- S.start()
- sleep(10)
- S.start()
- if(holder && holder.my_atom)
- holder.clear_reagents()
- return
-
-
-/datum/chemical_reaction/sonic_powder
- name = "sonic_powder"
- id = "sonic_powder"
- result = "sonic_powder"
- required_reagents = list("oxygen" = 1, "cola" = 1, "phosphorus" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/sonic_powder/on_reaction(var/datum/reagents/holder, var/created_volume)
- if(holder.has_reagent("stabilizing_agent"))
- return
- holder.remove_reagent("sonic_powder", created_volume)
- var/location = get_turf(holder.my_atom)
- playsound(location, 'sound/effects/bang.ogg', 25, 1)
- for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location))
- if(C.check_ear_prot())
- continue
- C.show_message("BANG", 2)
- C.Stun(5)
- C.Weaken(5)
- C.setEarDamage(C.ear_damage + rand(0, 5), max(C.ear_deaf,15))
- if(C.ear_damage >= 15)
- C << "Your ears start to ring badly!"
- else if(C.ear_damage >= 5)
- C << "Your ears start to ring!"
-
-/datum/chemical_reaction/sonic_powder_deafen
- name = "sonic_powder_deafen"
- id = "sonic_powder_deafen"
- result = null
- required_reagents = list("sonic_powder" = 1)
- required_temp = 374
-
-/datum/chemical_reaction/sonic_powder_deafen/on_reaction(var/datum/reagents/holder, var/created_volume)
- var/location = get_turf(holder.my_atom)
- playsound(location, 'sound/effects/bang.ogg', 25, 1)
- for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location))
- if(C.check_ear_prot())
- continue
- C.show_message("BANG", 2)
- C.Stun(5)
- C.Weaken(5)
- C.setEarDamage(C.ear_damage + rand(0, 5), max(C.ear_deaf,15))
- if(C.ear_damage >= 15)
- C << "Your ears start to ring badly!"
- else if(C.ear_damage >= 5)
- C << "Your ears start to ring!"
-
-
-/datum/chemical_reaction/phlogiston
- name = "phlogiston"
- id = "phlogiston"
- result = "phlogiston"
- required_reagents = list("phosphorus" = 1, "sacid" = 1, "stable_plasma" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/phlogiston/on_reaction(var/datum/reagents/holder, var/created_volume)
- if(holder.has_reagent("stabilizing_agent"))
- return
- var/turf/simulated/T = get_turf(holder.my_atom)
- if(istype(T))
- T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, created_volume)
- return
-
-
-/datum/chemical_reaction/napalm
- name = "Napalm"
- id = "napalm"
- result = "napalm"
- required_reagents = list("sugar" = 1, "fuel" = 1, "ethanol" = 1 )
- result_amount = 3
-
-
-/datum/chemical_reaction/cryostylane
- name = "cryostylane"
- id = "cryostylane"
- result = "cryostylane"
- required_reagents = list("water" = 1, "stable_plasma" = 1, "nitrogen" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/cryostylane/on_reaction(var/datum/reagents/holder, var/created_volume)
- holder.chem_temp = 20 // cools the fuck down
- return
-
-
-/datum/chemical_reaction/pyrosium
- name = "pyrosium"
- id = "pyrosium"
- result = "pyrosium"
- required_reagents = list("stable_plasma" = 1, "radium" = 1, "phosphorus" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/pyrosium/on_reaction(var/datum/reagents/holder, var/created_volume)
- holder.chem_temp = 20 // also cools the fuck down
- return
\ No newline at end of file
diff --git a/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm b/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm
deleted file mode 100644
index 732d6c39b488c..0000000000000
--- a/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm
+++ /dev/null
@@ -1,548 +0,0 @@
-
-//Grey
-/datum/chemical_reaction/slimespawn
- name = "Slime Spawn"
- id = "m_spawn"
- result = null
- required_reagents = list("plasma" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/grey
- required_other = 1
-
-/datum/chemical_reaction/slimespawn/on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- for(var/mob/O in viewers(get_turf(holder.my_atom), null))
- O.show_message(text("Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!"), 1)
- var/mob/living/simple_animal/slime/S = new /mob/living/simple_animal/slime
- S.loc = get_turf(holder.my_atom)
-
-/datum/chemical_reaction/slimeinaprov
- name = "Slime epinephrine"
- id = "m_inaprov"
- result = "epinephrine"
- required_reagents = list("water" = 5)
- result_amount = 3
- required_other = 1
- required_container = /obj/item/slime_extract/grey
-
-/datum/chemical_reaction/slimeinaprov/on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
-
-/datum/chemical_reaction/slimemonkey
- name = "Slime Monkey"
- id = "m_monkey"
- result = null
- required_reagents = list("blood" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/grey
- required_other = 1
-
-/datum/chemical_reaction/slimemonkey/on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- for(var/i = 1, i <= 3, i++)
- var /obj/item/weapon/reagent_containers/food/snacks/monkeycube/M = new /obj/item/weapon/reagent_containers/food/snacks/monkeycube
- M.loc = get_turf(holder.my_atom)
-
-//Green
-/datum/chemical_reaction/slimemutate
- name = "Mutation Toxin"
- id = "mutationtoxin"
- result = "mutationtoxin"
- required_reagents = list("plasma" = 1)
- result_amount = 1
- required_other = 1
- required_container = /obj/item/slime_extract/green
-
-/datum/chemical_reaction/slimemutate/on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
-
-//Mutated Green
-/datum/chemical_reaction/slimemutate_unstable
- name = "Unstable Mutation Toxin"
- id = "unstablemutationtoxin"
- result = "unstablemutationtoxin"
- required_reagents = list("radium" = 1)
- result_amount = 1
- required_other = 1
- required_container = /obj/item/slime_extract/green
- mix_message = "The mixture rapidly expands and contracts, its appearance shifting into a sickening green."
-
-/datum/chemical_reaction/slimemutate_unstable/on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
-
-//Metal
-/datum/chemical_reaction/slimemetal
- name = "Slime Metal"
- id = "m_metal"
- result = null
- required_reagents = list("plasma" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/metal
- required_other = 1
-
-/datum/chemical_reaction/slimemetal/on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal
- M.amount = 15
- M.loc = get_turf(holder.my_atom)
- var/obj/item/stack/sheet/plasteel/P = new /obj/item/stack/sheet/plasteel
- P.amount = 5
- P.loc = get_turf(holder.my_atom)
-
-//Gold
-/datum/chemical_reaction/slimecrit
- name = "Slime Crit"
- id = "m_tele"
- result = null
- required_reagents = list("plasma" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/gold
- required_other = 1
-
-/datum/chemical_reaction/slimecrit/on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- for(var/mob/O in viewers(get_turf(holder.my_atom), null))
- O.show_message(text("The slime extract begins to vibrate violently !"), 1)
- spawn(50)
-
- chemical_mob_spawn(holder, 5, "Gold Slime")
-
-/datum/chemical_reaction/slimecritlesser
- name = "Slime Crit Lesser"
- id = "m_tele3"
- result = null
- required_reagents = list("blood" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/gold
- required_other = 1
-
-/datum/chemical_reaction/slimecritlesser/on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- for(var/mob/O in viewers(get_turf(holder.my_atom), null))
- O.show_message(text("The slime extract begins to vibrate violently !"), 1)
- spawn(50)
-
- chemical_mob_spawn(holder, 1, "Lesser Gold Slime", "neutral")
-
-//Silver
-/datum/chemical_reaction/slimebork
- name = "Slime Bork"
- id = "m_tele2"
- result = null
- required_reagents = list("plasma" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/silver
- required_other = 1
-
-/datum/chemical_reaction/slimebork/on_reaction(var/datum/reagents/holder)
-
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- var/list/blocked = list(/obj/item/weapon/reagent_containers/food/snacks,
- /obj/item/weapon/reagent_containers/food/snacks/store/bread,
- /obj/item/weapon/reagent_containers/food/snacks/breadslice,
- /obj/item/weapon/reagent_containers/food/snacks/store/cake,
- /obj/item/weapon/reagent_containers/food/snacks/cakeslice,
- /obj/item/weapon/reagent_containers/food/snacks/store,
- /obj/item/weapon/reagent_containers/food/snacks/pie,
- /obj/item/weapon/reagent_containers/food/snacks/kebab,
- /obj/item/weapon/reagent_containers/food/snacks/pizza,
- /obj/item/weapon/reagent_containers/food/snacks/pizzaslice,
- /obj/item/weapon/reagent_containers/food/snacks/salad,
- /obj/item/weapon/reagent_containers/food/snacks/meat,
- /obj/item/weapon/reagent_containers/food/snacks/soup,
- /obj/item/weapon/reagent_containers/food/snacks/grown,
- /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom
- )
- blocked |= typesof(/obj/item/weapon/reagent_containers/food/snacks/customizable)
-
- var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/snacks) - blocked
- // BORK BORK BORK
-
- playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
-
- for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null))
- M.flash_eyes()
-
- for(var/i = 1, i <= 4 + rand(1,2), i++)
- var/chosen = pick(borks)
- var/obj/B = new chosen
- if(B)
- B.loc = get_turf(holder.my_atom)
- if(prob(50))
- for(var/j = 1, j <= rand(1, 3), j++)
- step(B, pick(NORTH,SOUTH,EAST,WEST))
-
-
-/datum/chemical_reaction/slimebork2
- name = "Slime Bork 2"
- id = "m_tele4"
- result = null
- required_reagents = list("water" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/silver
- required_other = 1
-
-/datum/chemical_reaction/slimebork2/on_reaction(var/datum/reagents/holder)
-
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
-
- var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/drinks) - /obj/item/weapon/reagent_containers/food/drinks
- // BORK BORK BORK
-
- playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
-
- for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null))
- M.flash_eyes()
-
- for(var/i = 1, i <= 4 + rand(1,2), i++)
- var/chosen = pick(borks)
- var/obj/B = new chosen
- if(B)
- B.loc = get_turf(holder.my_atom)
- if(prob(50))
- for(var/j = 1, j <= rand(1, 3), j++)
- step(B, pick(NORTH,SOUTH,EAST,WEST))
-
-
-//Blue
-/datum/chemical_reaction/slimefrost
- name = "Slime Frost Oil"
- id = "m_frostoil"
- result = "frostoil"
- required_reagents = list("plasma" = 1)
- result_amount = 10
- required_container = /obj/item/slime_extract/blue
- required_other = 1
-
-/datum/chemical_reaction/slimefrost/on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
-
-//Dark Blue
-/datum/chemical_reaction/slimefreeze
- name = "Slime Freeze"
- id = "m_freeze"
- result = null
- required_reagents = list("plasma" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/darkblue
- required_other = 1
-
-/datum/chemical_reaction/slimefreeze/on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- for(var/mob/O in viewers(get_turf(holder.my_atom), null))
- O.show_message(text("The slime extract begins to vibrate violently !"), 1)
- spawn(50)
- if(holder && holder.my_atom)
- playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
- for(var/mob/living/M in range (get_turf(holder.my_atom), 7))
- M.bodytemperature -= 240
- M << "You feel a chill!"
-
-//Orange
-/datum/chemical_reaction/slimecasp
- name = "Slime Capsaicin Oil"
- id = "m_capsaicinoil"
- result = "capsaicin"
- required_reagents = list("blood" = 1)
- result_amount = 10
- required_container = /obj/item/slime_extract/orange
- required_other = 1
-
-/datum/chemical_reaction/slimecasp/on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
-
-/datum/chemical_reaction/slimefire
- name = "Slime fire"
- id = "m_fire"
- result = null
- required_reagents = list("plasma" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/orange
- required_other = 1
-
-/datum/chemical_reaction/slimefire/on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- for(var/mob/O in viewers(get_turf(holder.my_atom), null))
- O.show_message(text("The slime extract begins to vibrate violently !"), 1)
- spawn(50)
- if(holder && holder.my_atom)
- var/turf/simulated/T = get_turf(holder.my_atom)
- if(istype(T))
- T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 50)
-
-//Yellow
-
-/datum/chemical_reaction/slimeoverload
- name = "Slime EMP"
- id = "m_emp"
- result = null
- required_reagents = list("blood" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/yellow
- required_other = 1
-
-/datum/chemical_reaction/slimeoverload/on_reaction(var/datum/reagents/holder, var/created_volume)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- empulse(get_turf(holder.my_atom), 3, 7)
-
-
-/datum/chemical_reaction/slimecell
- name = "Slime Powercell"
- id = "m_cell"
- result = null
- required_reagents = list("plasma" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/yellow
- required_other = 1
-
-/datum/chemical_reaction/slimecell/on_reaction(var/datum/reagents/holder, var/created_volume)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- var/obj/item/weapon/stock_parts/cell/high/slime/P = new /obj/item/weapon/stock_parts/cell/high/slime
- P.loc = get_turf(holder.my_atom)
-
-/datum/chemical_reaction/slimeglow
- name = "Slime Glow"
- id = "m_glow"
- result = null
- required_reagents = list("water" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/yellow
- required_other = 1
-
-/datum/chemical_reaction/slimeglow/on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- for(var/mob/O in viewers(get_turf(holder.my_atom), null))
- O.show_message(text("The slime begins to emit a soft light. Squeezing it will cause it to grow brightly."), 1)
- var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime
- F.loc = get_turf(holder.my_atom)
-
-//Purple
-
-/datum/chemical_reaction/slimepsteroid
- name = "Slime Steroid"
- id = "m_steroid"
- result = null
- required_reagents = list("plasma" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/purple
- required_other = 1
-
-/datum/chemical_reaction/slimepsteroid/on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- var/obj/item/weapon/slimesteroid/P = new /obj/item/weapon/slimesteroid
- P.loc = get_turf(holder.my_atom)
-
-/datum/chemical_reaction/slimejam
- name = "Slime Jam"
- id = "m_jam"
- result = "slimejelly"
- required_reagents = list("sugar" = 1)
- result_amount = 10
- required_container = /obj/item/slime_extract/purple
- required_other = 1
-
-/datum/chemical_reaction/slimejam/on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
-
-
-//Dark Purple
-/datum/chemical_reaction/slimeplasma
- name = "Slime Plasma"
- id = "m_plasma"
- result = null
- required_reagents = list("plasma" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/darkpurple
- required_other = 1
-
-/datum/chemical_reaction/slimeplasma/on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- var/obj/item/stack/sheet/mineral/plasma/P = new /obj/item/stack/sheet/mineral/plasma
- P.amount = 10
- P.loc = get_turf(holder.my_atom)
-
-//Red
-/datum/chemical_reaction/slimeglycerol
- name = "Slime Glycerol"
- id = "m_glycerol"
- result = "glycerol"
- required_reagents = list("plasma" = 1)
- result_amount = 8
- required_container = /obj/item/slime_extract/red
- required_other = 1
-
-/datum/chemical_reaction/slimeglycerol/on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
-
-
-/datum/chemical_reaction/slimebloodlust
- name = "Bloodlust"
- id = "m_bloodlust"
- result = null
- required_reagents = list("blood" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/red
- required_other = 1
-
-/datum/chemical_reaction/slimebloodlust/on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(holder.my_atom), null))
- slime.rabid = 1
- for(var/mob/O in viewers(get_turf(holder.my_atom), null))
- O.show_message(text("The [slime] is driven into a frenzy!"), 1)
-
-//Pink
-/datum/chemical_reaction/slimeppotion
- name = "Slime Potion"
- id = "m_potion"
- result = null
- required_reagents = list("plasma" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/pink
- required_other = 1
-
-/datum/chemical_reaction/slimeppotion/on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- var/obj/item/slimepotion/P = new /obj/item/slimepotion
- P.loc = get_turf(holder.my_atom)
-
-
-//Black
-/datum/chemical_reaction/slimemutate2
- name = "Advanced Mutation Toxin"
- id = "mutationtoxin2"
- result = "amutationtoxin"
- required_reagents = list("plasma" = 1)
- result_amount = 1
- required_other = 1
- required_container = /obj/item/slime_extract/black
-
-/datum/chemical_reaction/slimemutate2/on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
-
-//Oil
-/datum/chemical_reaction/slimeexplosion
- name = "Slime Explosion"
- id = "m_explosion"
- result = null
- required_reagents = list("plasma" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/oil
- required_other = 1
-
-/datum/chemical_reaction/slimeexplosion/on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- for(var/mob/O in viewers(get_turf(holder.my_atom), null))
- O.show_message(text("The slime extract begins to vibrate violently !"), 1)
- spawn(50)
- if(holder && holder.my_atom)
- explosion(get_turf(holder.my_atom), 1 ,3, 6)
-
-//Light Pink
-/datum/chemical_reaction/slimepotion2
- name = "Slime Potion 2"
- id = "m_potion2"
- result = null
- result_amount = 1
- required_container = /obj/item/slime_extract/lightpink
- required_reagents = list("plasma" = 1)
- required_other = 1
-
-/datum/chemical_reaction/slimepotion2/on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- var/obj/item/slimepotion2/P = new /obj/item/slimepotion2
- P.loc = get_turf(holder.my_atom)
-
-//Adamantine
-/datum/chemical_reaction/slimegolem
- name = "Slime Golem"
- id = "m_golem"
- result = null
- required_reagents = list("plasma" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/adamantine
- required_other = 1
-
-/datum/chemical_reaction/slimegolem/on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- var/obj/effect/golemrune/Z = new /obj/effect/golemrune
- Z.loc = get_turf(holder.my_atom)
- notify_ghosts("Golem rune created in [get_area(Z)].", 'sound/effects/ghost2.ogg')
-
-//Bluespace
-/datum/chemical_reaction/slimecrystal
- name = "Slime Crystal"
- id = "m_crystal"
- result = null
- required_reagents = list("blood" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/bluespace
- required_other = 1
-
-/datum/chemical_reaction/slimecrystal/on_reaction(var/datum/reagents/holder, var/created_volume)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- if(holder.my_atom)
- var/obj/item/bluespace_crystal/BC = new(get_turf(holder.my_atom))
- BC.visible_message("The [BC.name] appears out of thin air!")
-
-//Cerulean
-/datum/chemical_reaction/slimepsteroid2
- name = "Slime Steroid 2"
- id = "m_steroid2"
- result = null
- required_reagents = list("plasma" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/cerulean
- required_other = 1
-
-/datum/chemical_reaction/slimepsteroid2/on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- var/obj/item/weapon/slimesteroid2/P = new /obj/item/weapon/slimesteroid2
- P.loc = get_turf(holder.my_atom)
-
-//Sepia
-/datum/chemical_reaction/slimecamera
- name = "Slime Camera"
- id = "m_camera"
- result = null
- required_reagents = list("plasma" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/sepia
- required_other = 1
-
-/datum/chemical_reaction/slimecamera/on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- var/obj/item/device/camera/P = new /obj/item/device/camera
- P.loc = get_turf(holder.my_atom)
-
-/datum/chemical_reaction/slimefilm
- name = "Slime Film"
- id = "m_film"
- result = null
- required_reagents = list("blood" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/sepia
- required_other = 1
-
-/datum/chemical_reaction/slimefilm/on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- var/obj/item/device/camera_film/P = new /obj/item/device/camera_film
- P.loc = get_turf(holder.my_atom)
-
-//Pyrite
-/datum/chemical_reaction/slimepaint
- name = "Slime Paint"
- id = "s_paint"
- result = null
- required_reagents = list("plasma" = 1)
- result_amount = 1
- required_container = /obj/item/slime_extract/pyrite
- required_other = 1
-
-/datum/chemical_reaction/slimepaint/on_reaction(var/datum/reagents/holder)
- feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- var/list/paints = typesof(/obj/item/weapon/paint) - /obj/item/weapon/paint
- var/chosen = pick(paints)
- var/obj/P = new chosen
- if(P)
- P.loc = get_turf(holder.my_atom)
\ No newline at end of file
diff --git a/code/modules/reagents/Chemistry-Recipes/Toxins.dm b/code/modules/reagents/Chemistry-Recipes/Toxins.dm
deleted file mode 100644
index 95f2a28507ad2..0000000000000
--- a/code/modules/reagents/Chemistry-Recipes/Toxins.dm
+++ /dev/null
@@ -1,95 +0,0 @@
-
-/datum/chemical_reaction/formaldehyde
- name = "formaldehyde"
- id = "Formaldehyde"
- result = "formaldehyde"
- required_reagents = list("ethanol" = 1, "oxygen" = 1, "silver" = 1)
- result_amount = 3
- required_temp = 420
-
-/datum/chemical_reaction/neurotoxin2
- name = "neurotoxin2"
- id = "neurotoxin2"
- result = "neurotoxin2"
- required_reagents = list("space_drugs" = 1)
- result_amount = 1
- required_temp = 674
-
-/datum/chemical_reaction/cyanide
- name = "Cyanide"
- id = "cyanide"
- result = "cyanide"
- required_reagents = list("oil" = 1, "ammonia" = 1, "oxygen" = 1)
- result_amount = 3
- required_temp = 380
-
-/datum/chemical_reaction/itching_powder
- name = "Itching Powder"
- id = "itching_powder"
- result = "itching_powder"
- required_reagents = list("fuel" = 1, "ammonia" = 1, "charcoal" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/facid
- name = "Fluorosulfuric acid"
- id = "facid"
- result = "facid"
- required_reagents = list("sacid" = 1, "fluorine" = 1, "hydrogen" = 1, "potassium" = 1)
- result_amount = 4
- required_temp = 380
-
-/datum/chemical_reaction/sulfonal
- name = "sulfonal"
- id = "sulfonal"
- result = "sulfonal"
- required_reagents = list("acetone" = 1, "diethylamine" = 1, "sulfur" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/lipolicide
- name = "lipolicide"
- id = "lipolicide"
- result = "lipolicide"
- required_reagents = list("mercury" = 1, "diethylamine" = 1, "ephedrine" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/mutagen
- name = "Unstable mutagen"
- id = "mutagen"
- result = "mutagen"
- required_reagents = list("radium" = 1, "phosphorus" = 1, "chlorine" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/lexorin
- name = "Lexorin"
- id = "lexorin"
- result = "lexorin"
- required_reagents = list("plasma" = 1, "hydrogen" = 1, "nitrogen" = 1)
- result_amount = 3
-
-/datum/chemical_reaction/chloralhydrate
- name = "Chloral Hydrate"
- id = "chloralhydrate"
- result = "chloralhydrate"
- required_reagents = list("ethanol" = 1, "chlorine" = 3, "water" = 1)
- result_amount = 1
-
-/datum/chemical_reaction/mutetoxin //i'll just fit this in here snugly between other unfun chemicals :v
- name = "Mute toxin"
- id = "mutetoxin"
- result = "mutetoxin"
- required_reagents = list("uranium" = 2, "water" = 1, "carbon" = 1)
- result_amount = 2
-
-/datum/chemical_reaction/zombiepowder
- name = "Zombie Powder"
- id = "zombiepowder"
- result = "zombiepowder"
- required_reagents = list("carpotoxin" = 5, "morphine" = 5, "copper" = 5)
- result_amount = 2
-
-/datum/chemical_reaction/mindbreaker
- name = "Mindbreaker Toxin"
- id = "mindbreaker"
- result = "mindbreaker"
- required_reagents = list("silicon" = 1, "hydrogen" = 1, "charcoal" = 1)
- result_amount = 5
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/grenade_launcher.dm b/code/modules/reagents/grenade_launcher.dm
similarity index 90%
rename from code/modules/projectiles/guns/grenade_launcher.dm
rename to code/modules/reagents/grenade_launcher.dm
index 7e4071a78a9cd..adb0cba76b0c1 100644
--- a/code/modules/projectiles/guns/grenade_launcher.dm
+++ b/code/modules/reagents/grenade_launcher.dm
@@ -45,8 +45,9 @@
usr << "The grenade launcher is empty."
/obj/item/weapon/gun/grenadelauncher/proc/fire_grenade(atom/target, mob/user)
- user.visible_message("[user] fired a grenade!", \
- "You fire the grenade launcher!")
+ for(var/mob/O in viewers(world.view, user))
+ O.show_message(text("[] fired a grenade!", user), 1)
+ user << "You fire the grenade launcher!"
var/obj/item/weapon/grenade/chem_grenade/F = grenades[1] //Now with less copypasta!
grenades -= F
F.loc = user.loc
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index a938b09206199..4803a311e3338 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -54,27 +54,26 @@
else return "No reagents"
/obj/item/weapon/reagent_containers/proc/canconsume(mob/eater, mob/user)
- if(!iscarbon(eater))
+ if(!eater.SpeciesCanConsume())
return 0
- var/mob/living/carbon/C = eater
- var/covered = ""
- if(C.is_mouth_covered(head_only = 1))
- covered = "headgear"
- else if(C.is_mouth_covered(mask_only = 1))
- covered = "mask"
- if(covered)
- var/who = (isnull(user) || eater == user) ? "your" : "their"
- user << "You have to remove [who] [covered] first!"
- return 0
- return 1
+ //Check for covering mask
+ var/obj/item/clothing/cover = eater.get_item_by_slot(slot_wear_mask)
-/obj/item/weapon/reagent_containers/ex_act()
- if(reagents)
- for(var/datum/reagent/R in reagents.reagent_list)
- R.on_ex_act()
- ..()
+ if(isnull(cover)) // No mask, do we have any helmet?
+ cover = eater.get_item_by_slot(slot_head)
+ else
+ var/obj/item/clothing/mask/covermask = cover
+ if(covermask.alloweat) // Specific cases, clownmask for example.
+ return 1
-/obj/item/weapon/reagent_containers/fire_act()
- reagents.chem_temp += 30
- reagents.handle_reactions()
- ..()
\ No newline at end of file
+ if(!isnull(cover))
+ if((cover.flags & HEADCOVERSMOUTH) || (cover.flags & MASKCOVERSMOUTH))
+ var/who = (isnull(user) || eater == user) ? "your" : "their"
+
+ if(istype(cover, /obj/item/clothing/mask/))
+ user << "You have to remove [who] mask first!"
+ else
+ user << "You have to remove [who] helmet first!"
+
+ return 0
+ return 1
diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm
index 2787742c3fcb5..239782e0faa07 100644
--- a/code/modules/reagents/reagent_containers/bottle.dm
+++ b/code/modules/reagents/reagent_containers/bottle.dm
@@ -141,42 +141,6 @@
icon_state = "bottle16"
list_reagents = list("formaldehyde" = 30)
-/obj/item/weapon/reagent_containers/glass/bottle/initropidril
- name = "initropidril bottle"
- desc = "A small bottle. Contains initropidril."
- icon_state = "bottle16"
- list_reagents = list("initropidril" = 30)
-
-/obj/item/weapon/reagent_containers/glass/bottle/pancuronium
- name = "pancuronium bottle"
- desc = "A small bottle. Contains pancuronium."
- icon_state = "bottle16"
- list_reagents = list("pancuronium" = 30)
-
-/obj/item/weapon/reagent_containers/glass/bottle/sodium_thiopental
- name = "sodium thiopental bottle"
- desc = "A small bottle. Contains sodium thiopental."
- icon_state = "bottle16"
- list_reagents = list("sodium_thiopental" = 30)
-
-/obj/item/weapon/reagent_containers/glass/bottle/coniine
- name = "coniine bottle"
- desc = "A small bottle. Contains coniine."
- icon_state = "bottle16"
- list_reagents = list("coniine" = 30)
-
-/obj/item/weapon/reagent_containers/glass/bottle/curare
- name = "curare bottle"
- desc = "A small bottle. Contains curare."
- icon_state = "bottle16"
- list_reagents = list("curare" = 30)
-
-/obj/item/weapon/reagent_containers/glass/bottle/amanitin
- name = "amanitin bottle"
- desc = "A small bottle. Contains amanitin."
- icon_state = "bottle16"
- list_reagents = list("amanitin" = 30)
-
/obj/item/weapon/reagent_containers/glass/bottle/histamine
name = "histamine bottle"
desc = "A small bottle. Contains Histamine."
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index 366847d9635bc..365ce4e9b7032 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -84,9 +84,6 @@
else if(istype(target, /obj/item/clothing/suit/space/space_ninja))
return
- else if(istype(target, /obj/effect/decal/cleanable)) //stops splashing while scooping up fluids
- return
-
else if(reagents.total_volume)
user << "You splash the solution onto [target]."
reagents.reaction(target, TOUCH)
diff --git a/code/modules/reagents/reagent_containers/patch.dm b/code/modules/reagents/reagent_containers/patch.dm
index f87d3682a7c3b..e524f00a9b304 100644
--- a/code/modules/reagents/reagent_containers/patch.dm
+++ b/code/modules/reagents/reagent_containers/patch.dm
@@ -17,7 +17,7 @@
return // thanks inheritance again
/obj/item/weapon/reagent_containers/pill/patch/canconsume(mob/eater, mob/user)
- if(!iscarbon(eater))
+ if(!eater.SpeciesCanConsume())
return 0
return 1 // Masks were stopping people from "eating" patches. Thanks, inheritance.
diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm
index 4aff93675e58a..e663258acc709 100644
--- a/code/modules/reagents/reagent_containers/pill.dm
+++ b/code/modules/reagents/reagent_containers/pill.dm
@@ -96,7 +96,7 @@
name = "stimulant pill"
desc = "Often taken by overworked employees, athletes, and the inebriated. You'll snap to attention immediately!"
icon_state = "pill19"
- list_reagents = list("ephedrine" = 10, "antihol" = 10, "coffee" = 30)
+ list_reagents = list("ephedrine" = 10, "ethylredoxrazine" = 10, "coffee" = 30)
roundstart = 1
/obj/item/weapon/reagent_containers/pill/salbutamol
name = "salbutamol pill"
@@ -140,4 +140,4 @@
desc = "Handles hyperglycaemic coma."
icon_state = "pill5"
list_reagents = list("insulin" = 50)
- roundstart = 1
+ roundstart = 1
\ No newline at end of file
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index 43484c7cc4baa..f1c55d5a3834a 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -68,8 +68,7 @@
reagents.trans_to(D, amount_per_transfer_from_this, 1/range)
D.color = mix_color_from_reagents(D.reagents.reagent_list)
var/puff_reagent_left = range //how many turf, mob or dense objet we can react with before we consider the chem puff consumed
- var/wait_step = max(round(2+3/range), 2)
-
+ var/wait_step = max(round(9/range),2)
spawn(0)
for(var/i=0, i[src] malfunctions, melting [exp_on] and leaking radiation!.
")
for(var/mob/living/m in oview(1, src))
- m.irradiate(25)
+ m.apply_effect(25,IRRADIATE)
investigate_log("Experimentor has irradiated [m]", "experimentor") //One entry per person so we know what was irradiated.
ejectItem(TRUE)
if(prob(EFFECT_PROB_LOW-badThingCoeff))
@@ -296,8 +296,7 @@
for(var/turf/T in oview(1, src))
if(!T.density)
if(prob(EFFECT_PROB_VERYHIGH))
- var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/greenglow(T)
- reagentdecal.reagents.add_reagent("radium", 7)
+ new /obj/effect/decal/cleanable/greenglow(T)
if(prob(EFFECT_PROB_MEDIUM-badThingCoeff))
var/savedName = "[exp_on]"
ejectItem(TRUE)
@@ -326,7 +325,7 @@
smoke.set_up(R, 1, 0, src, 0, silent = 1)
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
smoke.start()
- qdel(R)
+ R.delete()
ejectItem(TRUE)
if(prob(EFFECT_PROB_VERYLOW-badThingCoeff))
visible_message("[src]'s chemical chamber has sprung a leak!")
@@ -338,7 +337,7 @@
smoke.set_up(R, 1, 0, src, 0, silent = 1)
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
smoke.start()
- qdel(R)
+ R.delete()
ejectItem(TRUE)
warn_admins(usr, "[chosenchem] smoke")
investigate_log("Experimentor has released [chosenchem] smoke!", "experimentor")
@@ -425,7 +424,7 @@
smoke.set_up(R, 1, 0, src, 0, silent = 1)
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
smoke.start()
- qdel(R)
+ R.delete()
ejectItem(TRUE)
if(prob(EFFECT_PROB_LOW-badThingCoeff))
visible_message("[src] malfunctions, shattering [exp_on] and leaking cold air!.")
@@ -511,7 +510,7 @@
trackedIan.loc = src.loc
investigate_log("Experimentor has stolen Ian!", "experimentor") //...if anyone ever fixes it...
else
- new /mob/living/simple_animal/pet/corgi(src.loc)
+ new /mob/living/simple_animal/corgi(src.loc)
investigate_log("Experimentor has spawned a new corgi.", "experimentor")
ejectItem(TRUE)
if(globalMalf > 36 && globalMalf < 50)
@@ -533,7 +532,7 @@
trackedRuntime.loc = src.loc
investigate_log("Experimentor has stolen Runtime!", "experimentor")
else
- new /mob/living/simple_animal/pet/cat(src.loc)
+ new /mob/living/simple_animal/cat(src.loc)
investigate_log("Experimentor failed to steal runtime, and instead spawned a new cat.", "experimentor")
ejectItem(TRUE)
if(globalMalf > 76)
@@ -628,8 +627,6 @@
/obj/item/weapon/relic/proc/reveal()
- if(revealed) //Re-rolling your relics seems a bit overpowered, yes?
- return
revealed = TRUE
name = realName
cooldownMax = rand(60,300)
@@ -657,16 +654,14 @@
/obj/item/weapon/relic/proc/corgicannon(var/mob/user)
playsound(src.loc, "sparks", rand(25,50), 1)
- var/mob/living/simple_animal/pet/corgi/C = new/mob/living/simple_animal/pet/corgi(get_turf(user))
+ var/mob/living/simple_animal/corgi/C = new/mob/living/simple_animal/corgi(get_turf(user))
C.throw_at(pick(oview(10,user)),10,rand(3,8))
throwSmoke(get_turf(C))
- warn_admins(user, "Corgi Cannon", 0)
/obj/item/weapon/relic/proc/clean(var/mob/user)
playsound(src.loc, "sparks", rand(25,50), 1)
var/obj/item/weapon/grenade/chem_grenade/cleaner/CL = new/obj/item/weapon/grenade/chem_grenade/cleaner(get_turf(user))
CL.prime()
- warn_admins(user, "Smoke", 0)
/obj/item/weapon/relic/proc/flash(var/mob/user)
playsound(src.loc, "sparks", rand(25,50), 1)
@@ -675,22 +670,17 @@
warn_admins(user, "Flash")
/obj/item/weapon/relic/proc/petSpray(var/mob/user)
- var/message = "[src] begans to shake, and in the distance the sound of rampaging animals arises!"
- visible_message(message)
- user << message
+ visible_message("[src] begans to shake, and in the distance the sound of rampaging animals arises!")
var/animals = rand(1,25)
var/counter
- var/list/valid_animals = list(/mob/living/simple_animal/parrot,/mob/living/simple_animal/butterfly,/mob/living/simple_animal/pet/cat,/mob/living/simple_animal/pet/corgi,/mob/living/simple_animal/crab,/mob/living/simple_animal/pet/fox,/mob/living/simple_animal/lizard,/mob/living/simple_animal/mouse,/mob/living/simple_animal/pet/pug,/mob/living/simple_animal/hostile/bear,/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/carp)
+ var/list/valid_animals = list(/mob/living/simple_animal/parrot,/mob/living/simple_animal/butterfly,/mob/living/simple_animal/cat,/mob/living/simple_animal/corgi,/mob/living/simple_animal/crab,/mob/living/simple_animal/fox,/mob/living/simple_animal/lizard,/mob/living/simple_animal/mouse,/mob/living/simple_animal/pug,/mob/living/simple_animal/hostile/bear,/mob/living/simple_animal/hostile/poison/bees,/mob/living/simple_animal/hostile/carp)
for(counter = 1; counter < animals; counter++)
var/mobType = pick(valid_animals)
new mobType(get_turf(src))
warn_admins(user, "Mass Mob Spawn")
- if(prob(60))
- user << "[src] falls apart!"
- qdel(src)
/obj/item/weapon/relic/proc/rapidDupe(var/mob/user)
- audible_message("[src] emits a loud pop!")
+ visible_message("[src] emits a loud pop!")
var/list/dupes = list()
var/counter
var/max = rand(5,10)
@@ -708,33 +698,26 @@
for(counter = 1; counter <= dupes.len; counter++)
var/obj/item/weapon/relic/R = dupes[counter]
qdel(R)
- warn_admins(user, "Rapid duplicator", 0)
/obj/item/weapon/relic/proc/explode(var/mob/user)
- user << "[src] begins to heat up!"
+ visible_message("[src] begins to heat up!")
spawn(rand(35,100))
if(src.loc == user)
visible_message("The [src]'s top opens, releasing a powerful blast!")
explosion(user.loc, -1, rand(1,5), rand(1,5), rand(1,5), rand(1,5), flame_range = 2)
warn_admins(user, "Explosion")
- qdel(src) //Comment this line to produce a light grenade (the bomb that keeps on exploding when used)!!
/obj/item/weapon/relic/proc/teleport(var/mob/user)
- user << "The [src] begins to vibrate!"
+ visible_message("The [src] begins to vibrate!")
spawn(rand(10,30))
- var/turf/userturf = get_turf(user)
- if(src.loc == user && userturf.z != ZLEVEL_CENTCOM) //Because Nuke Ops bringing this back on their shuttle, then looting the ERT area is 2fun4you!
+ if(src.loc == user)
visible_message("The [src] twists and bends, relocating itself!")
- throwSmoke(userturf)
- do_teleport(user, userturf, 8, asoundin = 'sound/effects/phasein.ogg')
throwSmoke(get_turf(user))
- warn_admins(user, "Teleport", 0)
+ do_teleport(user, get_turf(user), 8, asoundin = 'sound/effects/phasein.ogg')
+ throwSmoke(get_turf(user))
//Admin Warning proc for relics
-/obj/item/weapon/relic/proc/warn_admins(var/mob/user, var/RelicType, var/priority = 1)
+/obj/item/weapon/relic/proc/warn_admins(var/mob/user, var/RelicType)
var/turf/T = get_turf(src)
- var/log_msg = "[RelicType] relic used by [user.ckey]([user]) in ([T.x],[T.y],[T.z])"
- if(priority) //For truly dangerous relics that may need an admin's attention. BWOINK!
- message_admins("[RelicType] relic activated by [key_name(user, user.client)](?) in ([T.x],[T.y],[T.z] - JMP)",0,1)
- log_game(log_msg)
- investigate_log(log_msg, "experimentor")
+ message_admins("[RelicType] relic activated by [key_name(user, user.client)](?) in ([T.x],[T.y],[T.z] - JMP)",0,1)
+ log_game("[RelicType] relic used by [user.ckey]([user]) in ([T.x],[T.y],[T.z])")
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
index 5228fd29bc06c..ed202ccb9f521 100644
--- a/code/modules/research/protolathe.dm
+++ b/code/modules/research/protolathe.dm
@@ -30,7 +30,7 @@ Note: Must be placed west/left of and R&D console to function.
"Medical Designs",
"Bluespace Designs",
"Stock Parts",
- "Equipment",
+ "Equipement",
"Mining Designs",
"Electronics",
"Weapons",
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
deleted file mode 100644
index 12b76321f2739..0000000000000
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ /dev/null
@@ -1,365 +0,0 @@
-
-/// Slime Extracts ///
-
-/obj/item/slime_extract
- name = "slime extract"
- desc = "Goo extracted from a slime. Legends claim these to have \"magical powers\"."
- icon = 'icons/mob/slimes.dmi'
- icon_state = "grey slime extract"
- force = 1.0
- w_class = 1.0
- throwforce = 0
- throw_speed = 3
- throw_range = 6
- origin_tech = "biotech=4"
- var/Uses = 1 // uses before it goes inert
- var/enhanced = 0 //has it been enhanced before?
-
-/obj/item/slime_extract/attackby(obj/item/O as obj, mob/user as mob)
- if(istype(O, /obj/item/weapon/slimesteroid2))
- if(enhanced == 1)
- user << " This extract has already been enhanced!"
- return ..()
- if(Uses == 0)
- user << " You can't enhance a used extract!"
- return ..()
- user <<"You apply the enhancer. It now has triple the amount of uses."
- Uses = 3
- enhanced = 1
- qdel(O)
-
-/obj/item/slime_extract/New()
- ..()
- create_reagents(100)
-
-/obj/item/slime_extract/grey
- name = "grey slime extract"
- icon_state = "grey slime extract"
-
-/obj/item/slime_extract/gold
- name = "gold slime extract"
- icon_state = "gold slime extract"
-
-/obj/item/slime_extract/silver
- name = "silver slime extract"
- icon_state = "silver slime extract"
-
-/obj/item/slime_extract/metal
- name = "metal slime extract"
- icon_state = "metal slime extract"
-
-/obj/item/slime_extract/purple
- name = "purple slime extract"
- icon_state = "purple slime extract"
-
-/obj/item/slime_extract/darkpurple
- name = "dark purple slime extract"
- icon_state = "dark purple slime extract"
-
-/obj/item/slime_extract/orange
- name = "orange slime extract"
- icon_state = "orange slime extract"
-
-/obj/item/slime_extract/yellow
- name = "yellow slime extract"
- icon_state = "yellow slime extract"
-
-/obj/item/slime_extract/red
- name = "red slime extract"
- icon_state = "red slime extract"
-
-/obj/item/slime_extract/blue
- name = "blue slime extract"
- icon_state = "blue slime extract"
-
-/obj/item/slime_extract/darkblue
- name = "dark blue slime extract"
- icon_state = "dark blue slime extract"
-
-/obj/item/slime_extract/pink
- name = "pink slime extract"
- icon_state = "pink slime extract"
-
-/obj/item/slime_extract/green
- name = "green slime extract"
- icon_state = "green slime extract"
-
-/obj/item/slime_extract/lightpink
- name = "light pink slime extract"
- icon_state = "light pink slime extract"
-
-/obj/item/slime_extract/black
- name = "black slime extract"
- icon_state = "black slime extract"
-
-/obj/item/slime_extract/oil
- name = "oil slime extract"
- icon_state = "oil slime extract"
-
-/obj/item/slime_extract/adamantine
- name = "adamantine slime extract"
- icon_state = "adamantine slime extract"
-
-/obj/item/slime_extract/bluespace
- name = "bluespace slime extract"
- icon_state = "bluespace slime extract"
-
-/obj/item/slime_extract/pyrite
- name = "pyrite slime extract"
- icon_state = "pyrite slime extract"
-
-/obj/item/slime_extract/cerulean
- name = "cerulean slime extract"
- icon_state = "cerulean slime extract"
-
-/obj/item/slime_extract/sepia
- name = "sepia slime extract"
- icon_state = "sepia slime extract"
-
-/obj/item/slime_extract/rainbow
- name = "rainbow slime extract"
- icon_state = "rainbow slime extract"
-
-////Pet Slime Creation///
-
-/obj/item/slimepotion
- name = "docility potion"
- desc = "A potent chemical mix that nullifies a slime's hunger, causing it to become docile and tame."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle19"
-
-/obj/item/slimepotion/attack(mob/living/simple_animal/slime/M as mob, mob/user as mob)
- if(!isslime(M))
- user << "The potion only works on slimes!"
- return ..()
- if(M.stat)
- user << "The slime is dead!"
- return..()
-
- M.docile = 1
- M.nutrition = 700
- M <<" You absorb the potion and feel your intense desire to feed melt away."
- user <<" You feed the slime the potion, removing it's hunger and calming it."
- var/newname = copytext(sanitize(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text),1,MAX_NAME_LEN)
-
- if (!newname)
- newname = "pet slime"
- M.name = newname
- M.real_name = newname
- qdel(src)
-
-/obj/item/slimepotion2
- name = "sentience potion"
- desc = "A miraculous chemical mix that can raise the intelligence of creatures to human levels."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle19"
- var/list/not_interested = list()
- var/being_used = 0
-
-/obj/item/slimepotion2/afterattack(mob/living/M as mob, mob/user as mob)
- if(being_used || !ismob(M))
- return
- if( !(isanimal(M) || ismonkey(M)) || M.ckey) //only works on monkeys and animals that aren't player controlled
- user << "[M] is already too intelligent for this to work!"
- return ..()
- if(M.stat)
- user << "[M] is dead!"
- return..()
-
- user << "You begin to apply the potion to [M]..."
- being_used = 1
-
- var/list/candidates = get_candidates(BE_ALIEN, ALIEN_AFK_BRACKET)
-
- shuffle(candidates)
-
- var/time_passed = world.time
- var/list/consenting_candidates = list()
-
- for(var/candidate in candidates)
-
- if(candidate in not_interested)
- continue
-
- spawn(0)
- switch(alert(candidate, "Would you like to play as [M.name]? Please choose quickly!","Confirmation","Yes","No"))
- if("Yes")
- if((world.time-time_passed)>=50 || !src)
- return
- consenting_candidates += candidate
- if("No")
- if(!src)
- return
- not_interested += candidate
-
- sleep(50)
-
- if(!src)
- return
-
- if(consenting_candidates.len)
- var/client/C = null
- C = pick(consenting_candidates)
- M.key = C.key
- M.languages |= HUMAN
- M.faction -= "neutral"
- M << "All at once it makes sense, you know what you are and who you are! Self awareness is yours!"
- M << "You are grateful to be self aware and owe [user] a great debt. Serve [user], and assist them in completing their goals at any cost."
- user << "[M] is suddenly attentive and aware. It worked!"
- qdel(src)
- else
- user << "[M] looks interested for a moment, but then looks back down. Maybe you should try again later..."
- being_used = 0
- ..()
-
-/obj/item/weapon/slimesteroid
- name = "slime steroid"
- desc = "A potent chemical mix that will cause a slime to generate more extract."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle16"
-
-/obj/item/weapon/slimesteroid/attack(mob/living/simple_animal/slime/M as mob, mob/user as mob)
- if(!isslime(M))//If target is not a slime.
- user << " The steroid only works on baby slimes!"
- return ..()
- if(M.is_adult) //Can't tame adults
- user << " Only baby slimes can use the steroid!"
- return..()
- if(M.stat)
- user << " The slime is dead!"
- return..()
- if(M.cores == 3)
- user <<" The slime already has the maximum amount of extract!"
- return..()
-
- user <<"You feed the slime the steroid. It now has triple the amount of extract."
- M.cores = 3
- qdel(src)
-
-/obj/item/weapon/slimesteroid2
- name = "extract enhancer"
- desc = "A potent chemical mix that will give a slime extract three uses."
- icon = 'icons/obj/chemical.dmi'
- icon_state = "bottle17"
-
- /*afterattack(obj/target, mob/user , flag)
- if(istype(target, /obj/item/slime_extract))
- if(target.enhanced == 1)
- user << " This extract has already been enhanced!"
- return ..()
- if(target.Uses == 0)
- user << " You can't enhance a used extract!"
- return ..()
- user <<"You apply the enhancer. It now has triple the amount of uses."
- target.Uses = 3
- target.enahnced = 1
- qdel(src)*/
-
-
-////////Adamantine Golem stuff I dunno where else to put it
-
-// This will eventually be removed.
-
-/obj/item/clothing/under/golem
- name = "adamantine skin"
- desc = "a golem's skin"
- icon_state = "golem"
- item_state = "golem"
- item_color = "golem"
- flags = ABSTRACT | NODROP
- has_sensor = 0
-
-/obj/item/clothing/suit/golem
- name = "adamantine shell"
- desc = "a golem's thick outter shell"
- icon_state = "golem"
- item_state = "golem"
- w_class = 4//bulky item
- gas_transfer_coefficient = 0.90
- permeability_coefficient = 0.50
- body_parts_covered = FULL_BODY
- flags_inv = HIDEGLOVES | HIDESHOES | HIDEJUMPSUIT
- flags = ABSTRACT | NODROP
-
-/obj/item/clothing/shoes/golem
- name = "golem's feet"
- desc = "sturdy adamantine feet"
- icon_state = "golem"
- item_state = null
- flags = NOSLIP | ABSTRACT | NODROP
-
-
-/obj/item/clothing/mask/breath/golem
- name = "golem's face"
- desc = "the imposing face of an adamantine golem"
- icon_state = "golem"
- item_state = "golem"
- siemens_coefficient = 0
- unacidable = 1
- flags = ABSTRACT | NODROP
-
-
-/obj/item/clothing/gloves/golem
- name = "golem's hands"
- desc = "strong adamantine hands"
- icon_state = "golem"
- item_state = null
- siemens_coefficient = 0
- flags = ABSTRACT | NODROP
-
-
-/obj/item/clothing/head/space/golem
- icon_state = "golem"
- item_state = "dermal"
- item_color = "dermal"
- name = "golem's head"
- desc = "a golem's head"
- unacidable = 1
- flags = ABSTRACT | NODROP
-
-/obj/effect/golemrune
- anchored = 1
- desc = "a strange rune used to create golems. It glows when spirits are nearby."
- name = "rune"
- icon = 'icons/obj/rune.dmi'
- icon_state = "golem"
- unacidable = 1
- layer = TURF_LAYER
-
- New()
- ..()
- SSobj.processing |= src
-
-/obj/effect/golemrune/process()
- var/mob/dead/observer/ghost
- for(var/mob/dead/observer/O in src.loc)
- if(!O.client) continue
- if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
- ghost = O
- break
- if(ghost)
- icon_state = "golem2"
- else
- icon_state = "golem"
-
-/obj/effect/golemrune/attack_hand(mob/living/user as mob)
- var/mob/dead/observer/ghost
- for(var/mob/dead/observer/O in src.loc)
- if(!O.client) continue
- if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
- ghost = O
- break
- if(!ghost)
- user << "The rune fizzles uselessly. There is no spirit nearby."
- return
- var/mob/living/carbon/human/G = new /mob/living/carbon/human
- if(prob(50)) G.gender = "female"
- hardset_dna(G, null, null, null, null, /datum/species/golem/adamantine)
-
- G.set_cloned_appearance()
- G.real_name = text("Adamantine Golem ([rand(1, 1000)])")
- G.dna.species.auto_equip(G)
- G.loc = src.loc
- G.key = ghost.key
- G << "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost."
- qdel(src)
\ No newline at end of file
diff --git a/code/modules/scripting/Implementations/Telecomms.dm b/code/modules/scripting/Implementations/Telecomms.dm
index 42c5c7aec4091..ea9fda485e7bb 100644
--- a/code/modules/scripting/Implementations/Telecomms.dm
+++ b/code/modules/scripting/Implementations/Telecomms.dm
@@ -4,9 +4,6 @@
/* --- Traffic Control Scripting Language --- */
// Nanotrasen TCS Language - Made by Doohl
-//Span classes that players are allowed to set in a radio transmission.
-var/list/allowed_custom_spans = list(SPAN_ROBOT,SPAN_YELL,SPAN_ITALICS,SPAN_SANS)
-
/n_Interpreter/TCS_Interpreter
var/datum/TCS_Compiler/Compiler
@@ -99,17 +96,6 @@ var/list/allowed_custom_spans = list(SPAN_ROBOT,SPAN_YELL,SPAN_ITALICS,SPAN_SANS
interpreter.SetVar("$job" , signal.data["job"])
interpreter.SetVar("$sign" , signal)
interpreter.SetVar("$pass" , !(signal.data["reject"])) // if the signal isn't rejected, pass = 1; if the signal IS rejected, pass = 0
- interpreter.SetVar("$filters" , signal.data["spans"]) //Important, this is given as a vector! (a list)
- interpreter.SetVar("$say" , signal.data["verb_say"])
- interpreter.SetVar("$ask" , signal.data["verb_ask"])
- interpreter.SetVar("$yell" , signal.data["verb_yell"])
- interpreter.SetVar("$exclaim" , signal.data["verb_exclaim"])
-
- //Current allowed span classes
- interpreter.SetVar("$robot", SPAN_ROBOT) //The font used by silicons!
- interpreter.SetVar("$loud", SPAN_YELL) //Bolding, applied when ending a message with several exclamation marks.
- interpreter.SetVar("$emphasis", SPAN_ITALICS) //Italics
- interpreter.SetVar("$wacky", SPAN_SANS) //Comic sans font, normally seen from the genetics power.
//Language bitflags
interpreter.SetVar("HUMAN" , HUMAN)
@@ -138,15 +124,9 @@ var/list/allowed_custom_spans = list(SPAN_ROBOT,SPAN_YELL,SPAN_ITALICS,SPAN_SANS
@param content: Message to broadcast
@param frequency: Frequency to broadcast to
@param source: The name of the source you wish to imitate. Must be stored in stored_names list.
- @param job: The name of the job.
- @param spans What span classes you want to apply to your message. Must be in the "allowed_custom_spans" list.
- @param say Say verb used in messages ending in ".".
- @param ask Say verb used in messages ending in "?".
- @param yell Say verb used in messages ending in "!!" (or more).
- @param exclaim Say verb used in messages ending in "!".
-
+ @param job: The name of the job.
*/
- interpreter.SetProc("broadcast", "tcombroadcast", signal, list("message", "freq", "source", "job","spans","say","ask","yell","exclaim"))
+ interpreter.SetProc("broadcast", "tcombroadcast", signal, list("message", "freq", "source", "job"))
/*
-> Send a code signal.
@@ -234,16 +214,9 @@ var/list/allowed_custom_spans = list(SPAN_ROBOT,SPAN_YELL,SPAN_ITALICS,SPAN_SANS
if(signal.data["name"] != setname)
signal.data["realname"] = setname
- signal.data["name"] = setname
- signal.data["job"] = interpreter.GetCleanVar("$job", signal.data["job"])
- signal.data["reject"] = !(interpreter.GetCleanVar("$pass")) // set reject to the opposite of $pass
- signal.data["verb_say"] = interpreter.GetCleanVar("$say")
- signal.data["verb_ask"] = interpreter.GetCleanVar("$ask")
- signal.data["verb_yell"] = interpreter.GetCleanVar("$yell")
- signal.data["verb_exclaim"] = interpreter.GetCleanVar("$exclaim")
- var/list/setspans = interpreter.GetCleanVar("$filters") //Save the span vector/list to a holder list
- setspans &= allowed_custom_spans //Prune out any illegal ones. Go ahead, comment this line out. See the horror you can unleash!
- signal.data["spans"] = setspans //Apply it to the signal
+ signal.data["name"] = setname
+ signal.data["job"] = interpreter.GetCleanVar("$job", signal.data["job"])
+ signal.data["reject"] = !(interpreter.GetCleanVar("$pass")) // set reject to the opposite of $pass
// If the message is invalid, just don't broadcast it!
if(signal.data["message"] == "" || !signal.data["message"])
@@ -298,7 +271,7 @@ datum/signal
lastsignalers.Add("[time] : [S.id] sent a signal command, which was triggered by NTSL.: [format_frequency(freq)]/[code]")
- proc/tcombroadcast(var/message, var/freq, var/source, var/job, var/spans, var/say = "says", var/ask = "asks", var/yell = "yells", var/exclaim = "exclaims")
+ proc/tcombroadcast(var/message, var/freq, var/source, var/job)
var/datum/signal/newsign = new
var/obj/machinery/telecomms/server/S = data["server"]
@@ -321,11 +294,6 @@ datum/signal
if(!job)
job = "Unknown"
- if(!islist(spans))
- spans = list()
- else
- spans &= allowed_custom_spans //Removes any spans not on the allowed list. Comment this out if want to let players use ANY span in stylesheet.dm!
-
//SAY REWRITE RELATED CODE.
//This code is a little hacky, but it *should* work. Even though it'll result in a virtual speaker referencing another virtual speaker. vOv
var/atom/movable/virtualspeaker/virt = PoolOrNew(/atom/movable/virtualspeaker,null)
@@ -343,11 +311,6 @@ datum/signal
newsign.data["compression"] = 0
newsign.data["message"] = message
newsign.data["type"] = 2 // artificial broadcast
- newsign.data["spans"] = spans
- newsign.data["verb_say"] = say
- newsign.data["verb_ask"] = ask
- newsign.data["verb_yell"]= yell
- newsign.data["verb_exclaim"] = exclaim
if(!isnum(freq))
freq = text2num(freq)
newsign.frequency = freq
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index 204b94477e755..b41d28366d891 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -321,8 +321,6 @@
for(var/obj/O in T0)
if(O.invisibility >= 101)
continue
- if(O == T0.lighting_object)
- continue
O.loc = T1
//close open doors
@@ -352,13 +350,13 @@
//air system updates
for(var/turf/T1 in L1)
- T1.redraw_lighting()
+ T1.shift_to_subarea()
SSair.remove_from_active(T1)
T1.CalculateAdjacentTurfs()
SSair.add_to_active(T1,1)
for(var/turf/T0 in L0)
- T0.redraw_lighting()
+ T0.shift_to_subarea()
SSair.remove_from_active(T0)
T0.CalculateAdjacentTurfs()
SSair.add_to_active(T0,1)
@@ -518,7 +516,7 @@
if(href_list["move"])
switch(SSshuttle.moveShuttle(shuttleId, href_list["move"], 1))
- if(0) usr << "Shuttle received message and will be sent shortly."
+ if(0) usr << "Shuttle recieved message and will be sent shortly."
if(1) usr << "Invalid shuttle requested."
else usr << "Unable to comply."
diff --git a/code/modules/surgery/core_removal.dm b/code/modules/surgery/core_removal.dm
index 2f8dff6988f84..0064b7d1541ef 100644
--- a/code/modules/surgery/core_removal.dm
+++ b/code/modules/surgery/core_removal.dm
@@ -1,7 +1,7 @@
/datum/surgery/core_removal
name = "core removal"
steps = list(/datum/surgery_step/incise, /datum/surgery_step/incise, /datum/surgery_step/extract_core)
- species = list(/mob/living/simple_animal/slime)
+ species = list(/mob/living/carbon/slime)
target_must_be_dead = 1
@@ -14,7 +14,7 @@
user.visible_message("[user] begins to extract a core from [target].")
/datum/surgery_step/extract_core/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- var/mob/living/simple_animal/slime/slime = target
+ var/mob/living/carbon/slime/slime = target
if(slime.cores > 0)
slime.cores--
user.visible_message("[user] successfully extracts a core from [target]!")
diff --git a/code/modules/surgery/cybernetic_implants.dm b/code/modules/surgery/cybernetic_implants.dm
index 0e4312f7263f7..66792e9c61b77 100644
--- a/code/modules/surgery/cybernetic_implants.dm
+++ b/code/modules/surgery/cybernetic_implants.dm
@@ -63,6 +63,10 @@
if(full < MAX_CHEST_IMPLANT)
full = 0
+ if(istype(implant,/obj/item/cybernetic_implant/chest/heart))
+ if(locate(/obj/item/cybernetic_implant/chest/heart) in target.internal_organs)
+ full = 1
+
insert(user,target,implant,target_zone,full)
return 1
diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm
index 360e46077203d..8d23d98378daf 100644
--- a/code/modules/surgery/helpers.dm
+++ b/code/modules/surgery/helpers.dm
@@ -8,12 +8,6 @@
if(locate(S.type) in M.surgeries)
continue
- if(S.user_species_restricted)
- if(!istype(user, /mob/living/carbon/human))
- continue
- var/mob/living/carbon/human/doc = user
- if(!(doc.dna.species.id in S.user_species_ids))
- continue
if(S.target_must_be_dead && M.stat != DEAD)
continue
if(S.target_must_be_fat && !(M.disabilities & FAT))
@@ -76,13 +70,13 @@ proc/get_location_modifier(mob/M)
var/eyesmouth_covered = 0 //based on flags
if(iscarbon(M))
var/mob/living/carbon/C = M
- for(var/obj/item/clothing/I in list(C.back, C.wear_mask, C.head))
+ for(var/obj/item/clothing/I in list(C.back, C.wear_mask))
covered_locations |= I.body_parts_covered
face_covered |= I.flags_inv
eyesmouth_covered |= I.flags
if(ishuman(C))
var/mob/living/carbon/human/H = C
- for(var/obj/item/I in list(H.wear_suit, H.w_uniform, H.shoes, H.belt, H.gloves, H.glasses, H.ears))
+ for(var/obj/item/I in list(H.wear_suit, H.w_uniform, H.shoes, H.belt, H.gloves, H.glasses, H.head, H.ears))
covered_locations |= I.body_parts_covered
face_covered |= I.flags_inv
eyesmouth_covered |= I.flags
@@ -95,7 +89,7 @@ proc/get_location_modifier(mob/M)
if(covered_locations & HEAD || face_covered & HIDEEYES || eyesmouth_covered & GLASSESCOVERSEYES)
return 0
if("mouth")
- if(covered_locations & HEAD || face_covered & HIDEFACE || eyesmouth_covered & MASKCOVERSMOUTH || eyesmouth_covered & HEADCOVERSMOUTH)
+ if(covered_locations & HEAD || face_covered & HIDEFACE || eyesmouth_covered & MASKCOVERSMOUTH)
return 0
if("chest")
if(covered_locations & CHEST)
diff --git a/code/modules/surgery/lipoplasty.dm b/code/modules/surgery/lipoplasty.dm
index 2f3645a5df370..ae8b5147e9136 100644
--- a/code/modules/surgery/lipoplasty.dm
+++ b/code/modules/surgery/lipoplasty.dm
@@ -33,7 +33,7 @@
var/removednutriment = target.nutrition
target.nutrition = NUTRITION_LEVEL_WELL_FED
removednutriment -= 450 //whatever was removed goes into the meat
- var/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/newmeat = new
+ var/obj/item/weapon/reagent_containers/food/snacks/meat/human/newmeat = new
newmeat.name = "fatty meat"
newmeat.desc = "Extremely fatty tissue taken from a patient."
newmeat.reagents.add_reagent ("nutriment", (removednutriment / 15)) //To balance with nutriment_factor of nutriment
diff --git a/code/modules/surgery/organs/cybernetic_implants.dm b/code/modules/surgery/organs/cybernetic_implants.dm
index 5a6d84c3019a7..06994fd92e155 100644
--- a/code/modules/surgery/organs/cybernetic_implants.dm
+++ b/code/modules/surgery/organs/cybernetic_implants.dm
@@ -308,3 +308,64 @@
return
owner.reagents.add_reagent("????",poison_amount / severity) //food poisoning
owner << "You feel like your insides are burning."
+
+/obj/item/cybernetic_implant/chest/heart/reviver
+ name = "Reviver implant"
+ desc = "This implant will automatically deliver a therapeutic dose of electrical energy to your heart if it ever stops beating, and inject nanites into your bloodstream. A second chance!"
+ icon_state = "chest_implant"
+ implant_color = "#AD0000"
+ var/defibrillating = 0
+ var/recharge_time = 0
+ origin_tech = "materials=7;programming=3;biotech=4"
+
+/obj/item/cybernetic_implant/chest/heart/reviver/function()
+ if(istype(owner,/mob/living/carbon/human))
+ recharge_time = world.time + 2000
+ SSobj.processing |= src
+
+/obj/item/cybernetic_implant/chest/heart/reviver/process()
+ if(defibrillating)
+ return
+ if(!owner)
+ SSobj.processing.Remove(src)
+ qdel(src)
+ return
+ if(world.time < recharge_time)
+ return
+ if(owner.stat != DEAD)
+ return
+
+ defibrillating = 1
+ spawn(600)
+ if(owner.stat == DEAD)
+ owner.visible_message("[owner]'s body convulses by itself.")
+ playsound(owner, "bodyfall", 50, 1)
+ playsound(owner, 'sound/machines/defib_zap.ogg', 50, 1, -1)
+ dead_mob_list -= owner
+ living_mob_list |= list(owner)
+ owner.stat = UNCONSCIOUS
+ owner.reagents.add_reagent("nanites",10)
+ var/mob/living/carbon/human/H = owner
+ var/amount = BLOOD_VOLUME_OKAY - H.vessel.total_volume
+ H.vessel.add_reagent("blood", amount)
+ H.vessel.update_total()
+ owner.emote("gasp")
+ add_logs(owner, owner, "revived", object="defibrillator implant")
+ recharge_time = world.time + 20000
+ defibrillating = 0
+
+/obj/item/cybernetic_implant/chest/heart/reviver/emp_act(severity)
+ if(!owner)
+ return
+ if(recharge_time < world.time)
+ recharge_time = world.time + (2000 / severity)
+ else
+ recharge_time += 2000 / severity
+
+ if(prob(60/severity))
+ playsound(owner, 'sound/machines/defib_saftyOff.ogg', 50, 1, -1)
+ spawn(30)
+ playsound(owner, 'sound/machines/defib_zap.ogg', 50, 1, -1)
+ if(owner.stat == CONSCIOUS)
+ owner.Weaken(5)
+ owner.visible_message("[owner] clutches at their chest as if their heart stopped!")
\ No newline at end of file
diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm
index 88e590ca8dc1d..0ade9193386d3 100644
--- a/code/modules/surgery/surgery.dm
+++ b/code/modules/surgery/surgery.dm
@@ -9,8 +9,7 @@
var/target_must_be_fat = 0 //Needs to be fat
var/requires_organic_chest = 0 //Prevents you from performing an operation on Robotic chests***
var/has_multi_loc = 0 //Multiple locations - RR
- var/user_species_restricted = 0 //Surgery only performable BY species
- var/list/user_species_ids
+
/datum/surgery/proc/next_step(mob/user, mob/living/carbon/target)
if(step_in_progress) return
diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm
index 19d5eca182ceb..1d50721e9f5c8 100644
--- a/code/modules/surgery/surgery_step.dm
+++ b/code/modules/surgery/surgery_step.dm
@@ -107,7 +107,6 @@
var/obj/item/organ/limb/limb = target.getlimb(limb_type)
if(limb)
limb.heal_damage(45,0,0)
- return ..()
/datum/surgery_step/proc/tool_check(mob/user, obj/item/tool)
return 1
diff --git a/code/modules/surgery/xenomorph_removal.dm b/code/modules/surgery/xenomorph_removal.dm
index 98b81efcf5ec4..9143713034d4e 100644
--- a/code/modules/surgery/xenomorph_removal.dm
+++ b/code/modules/surgery/xenomorph_removal.dm
@@ -23,7 +23,7 @@
return 1
/datum/surgery_step/xenomorph_removal/proc/remove_xeno(mob/user, mob/living/carbon/target)
- var/obj/item/body_egg/alien_embryo/A = locate() in target.contents
+ var/obj/item/alien_embryo/A = locate() in target.contents
if(A)
user << "You found an unknown alien organism in [target]'s chest!"
if(A.stage < 4)
@@ -38,7 +38,7 @@
/datum/surgery_step/xenomorph_removal/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- var/obj/item/body_egg/alien_embryo/A = locate() in target.contents
+ var/obj/item/alien_embryo/A = locate() in target.contents
if(A)
if(prob(50))
A.AttemptGrow(0)
diff --git a/code/modules/telesci/bscrystal.dm b/code/modules/telesci/bscrystal.dm
index 7c64352ca8f35..9249d0c9ccd19 100644
--- a/code/modules/telesci/bscrystal.dm
+++ b/code/modules/telesci/bscrystal.dm
@@ -18,7 +18,7 @@
/obj/item/bluespace_crystal/attack_self(var/mob/user)
user.visible_message("[user] crushes [src]!")
- PoolOrNew(/obj/effect/effect/sparks, loc)
+ new /obj/effect/effect/sparks(src.loc)
playsound(src.loc, "sparks", 50, 1)
blink_mob(user)
user.drop_item()
@@ -30,7 +30,7 @@
/obj/item/bluespace_crystal/throw_impact(atom/hit_atom)
..()
visible_message("[src] fizzles and disappears upon impact!")
- PoolOrNew(/obj/effect/effect/sparks, loc)
+ new /obj/effect/effect/sparks(src.loc)
playsound(src.loc, "sparks", 50, 1)
if(isliving(hit_atom))
blink_mob(hit_atom)
diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm
index ea9d253b54f83..4d7d9d21adf98 100644
--- a/code/modules/telesci/telesci_computer.dm
+++ b/code/modules/telesci/telesci_computer.dm
@@ -280,9 +280,9 @@
telefail()
temp_msg = "ERROR! Elevation is less than 1 or greater than 90."
return
- if(z_co == 2 || z_co < 1 || z_co > 6)
+ if(z_co == 2 || z_co < 1 || z_co > 8)
telefail()
- temp_msg = "ERROR! Sector is less than 1, greater than 6, or equal to 2."
+ temp_msg = "ERROR! Sector is less than 1, greater than 8, or equal to 2."
return
if(teles_left > 0)
doteleport(user)
diff --git a/config/admin_nicknames.txt b/config/admin_nicknames.txt
index 76198b6c050c1..e69de29bb2d1d 100644
--- a/config/admin_nicknames.txt
+++ b/config/admin_nicknames.txt
@@ -1,2 +0,0 @@
-Badmin
-Spanmin
\ No newline at end of file
diff --git a/config/admin_ranks.txt b/config/admin_ranks.txt
index 67c08182b01a1..c4afe4e9dc362 100644
--- a/config/admin_ranks.txt
+++ b/config/admin_ranks.txt
@@ -28,13 +28,15 @@
# +EVERYTHING (or +HOST or +ALL) = Simply gives you everything without having to type every flag
Admin Observer
-Moderator = +ADMIN
-Admin Candidate = +@
-Trial Admin = +@ +SPAWN +REJUV +VAREDIT +BAN
-Badmin = +@ +POSSESS +BUILDMODE +SERVER +FUN
-Game Admin = +@ +STEALTH +SOUNDS +DEBUG
-Game Master = +EVERYTHING
+Moderator = +ADMIN +BAN
+Trial Admin = +@ +REJUV +STEALTH +FUN +SOUNDS
+Badmin = +@ +VAREDIT +SPAWN
+Retired Host = +@
+Super Badmin = +@ +BUILDMODE +DEBUG +POSSESS +SERVER
-Host = +EVERYTHING
+Head Shitmin = +EVERYTHING
-Coder = +DEBUG +VAREDIT +SERVER +SPAWN
\ No newline at end of file
+Coder = +ADMIN +DEBUG +VAREDIT +SERVER +SPAWN
+Coder-Admin = +@ +FUN +SOUNDS +BAN +REJUV +STEALTH
+
+Host = +EVERYTHING
diff --git a/config/admins.txt b/config/admins.txt
index 7ee8062dcb014..5edf105477112 100644
--- a/config/admins.txt
+++ b/config/admins.txt
@@ -1,84 +1,28 @@
###############################################################################################
-# Basically, ckey goes first. Rank goes after the "=" #
-# Case is not important for ckey. #
-# Case IS important for the rank. #
-# All punctuation (spaces etc) EXCEPT '-', '_' and '@' will be stripped from rank names. #
-# Ranks can be anything defined in admin_ranks.txt #
-# NOTE: if the rank-name cannot be found in admin_ranks.txt, they will not be adminned! ~Carn #
-# NOTE: syntax was changed to allow hyphenation of ranknames, since spaces are stripped. #
-###############################################################################################
-MrStonedOne = Host
-Gun Hog = Game Master
-razharas = Game Master
-Niknakflak = Game Master
-rolan7 = Game Master
-quarxink = Game Master
-adrix89 = Game Master
-tle = Game Master
-xsi = Game Master
-scaredofshadows = Game Master
-neofite = Game Master
-trubblebass = Game Master
-mport2004 = Game Master
-deuryn = Game Master
-agouri = Game Master
-errorage = Game Master
-superxpdude = Game Master
-petethegoat = Game Master
-korphaeron = Game Master
-nodrak = Game Master
-carnwennan = Game Master
-ikarrus = Game Master
-cheridan = Game Master
-giacomand = Game Master
-rockdtben = Game Master
-sieve = Game Master
-aranclanos = Game Master
-intigracy = Game Master
-dumpdavidson = Game Master
-kazeespada = Game Master
-malkevin = Game Master
-incoming = Game Master
-demas = Game Master
-fleure = Game Master
-ricotez = Game Master
-misterperson = Game Master
-crimsonvision = Game Master
-iamgoofball = Game Master
-zelacks = Game Master
-androidsfv = Game Master
-miggles = Game Master
-jordie0608 = Game Master
-s0ldi3rkr4s0 = Game Master
-ergovisavi = Game Master
-vistapowa = Game Master
-miauw62 = Game Master
-kazeespada = Game Master
-rumia29 = Game Master
-bobylein = Game Master
-sirbayer = Game Master
-hornygranny = Game Master
-yota = Game Master
-firecage = Game Master
-donkieyo = Game Master
-argoneus = Game Master
-paprka = Game Master
-cookingboy3 = Game Master
-limeliz = Game Master
-steelpoint = Game Master
-phil235 = Game Master
-xxnoob = Game Master
-tkdrg = Game Master
-Cuboos = Game Master
-thunder12345 = Game Master
-wjohnston = Game Master
-mandurrh = Game Master
-thurgatar = Game Master
-xerux = Game Master
-dannno = Game Master
-allura = Game Master
-lo6a4evskiy = Game Master
-vekter = Game Master
-Ahammer18 = Game Master
-ACCount12 = Game Master
-fayrik = Game Master
+#
+## Basically, ckey goes first. Rank goes after the "="
+#
+# Case is not important for ckey.
+#
+# Case IS important for the rank.
+#
+# All punctuation (spaces etc) EXCEPT '-', '_' and '@' will be stripped from rank names.
+#
+# Ranks can be anything defined in admin_ranks.txt
+#
+# NOTE: if the rank-name cannot be found in admin_ranks.txt, they will not be adminned! ~Carn
+#
+# NOTE: syntax was changed to allow hyphenation of ranknames, since spaces are stripped. ################################################################################################
+
+
+## You gotta do what you gotta do. (For free.)
+
+Kuranyll = Host
+Riesen = Head Shitmin
+DimJim = Badmin
+GreyTideStationWide = Badmin
+Dopaper = Badmin
+AlwaysbetonNanako = Badmin
+Hextopia = Badmin
+MrPuppySky = Trial Admin
+0ak = Trial Admin
diff --git a/config/config.txt b/config/config.txt
index cdfd19f9f34a3..7fe7d09e898fc 100644
--- a/config/config.txt
+++ b/config/config.txt
@@ -1,17 +1,17 @@
## Server name: This appears at the top of the screen in-game. Remove the # infront of SERVERNAME and replace 'tgstation' with the name of your choice
-# SERVERNAME tgstation
+SERVERNAME PizzaStation
## Station name: The name of the station as it is referred to in-game. If commented out, the game will generate a random name instead.
-STATIONNAME Space Station 13
+#STATIONNAME Space Station 13
# Lobby time: This is the amount of time between rounds that players have to setup their characters and be ready.
-LOBBY_COUNTDOWN 120
+LOBBY_COUNTDOWN 200
## Add a # infront of this if you want to use the SQL based admin system, the legacy system uses admins.txt. You need to set up your database to use the SQL based system.
ADMIN_LEGACY_SYSTEM
## Add a # infront of this if you want to use the SQL based banning system. The legacy systems use the files in the data folder. You need to set up your database to use the SQL based system.
-BAN_LEGACY_SYSTEM
+#BAN_LEGACY_SYSTEM
## Unhash this entry to have certain jobs require your account to be at least a certain number of days old to select. You can configure the exact age requirement for different jobs by editing
## the minimal_player_age variable in the files in folder /code/game/jobs/job/.. for the job you want to edit. Set minimal_player_age to 0 to disable age requirement for that job.
@@ -93,7 +93,7 @@ NORESPAWN
# DONT_DEL_NEWMOB
## set a hosted by name for unix platforms
-HOSTEDBY Yournamehere
+HOSTEDBY Kuranyll
## Set to jobban "Guest-" accounts from Captain, HoS, HoP, CE, RD, CMO, Warden, Security, Detective, and AI positions.
## Set to 1 to jobban them from those positions, set to 0 to allow them.
@@ -111,23 +111,23 @@ GUEST_BAN
# SERVER ss13.example.com:2506
## forum address
-# FORUMURL http://tgstation13.org/phpBB/index.php
+FORUMURL http://8ch.net/nofun
## Wiki address
-# WIKIURL http://www.tgstation13.org/wiki
+WIKIURL https://tgstation13.org/wiki/Main_Page
##Rules address
-# RULESURL http://www.tgstation13.org/wiki/Rules
+RULESURL http://64.94.238.144/rules/ruurs.html
##Github address
-# GITHUBURL https://www.github.com/tgstation/-tg-station
+GITHUBURL https://github.com/Skrylar/-tg-station
## Ban appeals URL - usually for a forum or wherever people should go to contact your admins.
# BANAPPEALS http://justanotherday.example.com
## In-game features
##Toggle for having jobs load up from the .txt
-# LOAD_JOBS_FROM_TXT
+LOAD_JOBS_FROM_TXT
##Remove the # mark infront of this to forbid admins from possessing the singularity.
#FORBID_SINGULO_POSSESSION
@@ -143,7 +143,7 @@ ALLOW_HOLIDAYS
#USEIRCBOT
##Defines the ticklag for the world. 0.9 is the normal one, 0.5 is smoother.
-TICKLAG 0.9
+TICKLAG 0.6
## Defines if Tick Compensation is used. It results in a minor slowdown of movement of all mobs, but attempts to result in a level movement speed across all ticks. Recommended if tickrate is lowered.
TICKCOMP 0
@@ -157,6 +157,9 @@ TICKCOMP 0
## Uncomment this to let players see their own notes (they can still be set by admins only)
#SEE_OWN_NOTES
+## Chances are you only want this enabled if you are a developer
+HOOK_ROUND_END
+
##Note: all population caps can be used with each other if desired.
## Uncomment for 'soft' population caps, players will be warned while joining if the living crew exceeds the listed number.
diff --git a/config/dbconfig.txt b/config/dbconfig.txt
index dbc09df51dfb2..3d8ae46f1a03c 100644
--- a/config/dbconfig.txt
+++ b/config/dbconfig.txt
@@ -3,7 +3,7 @@
## administration, and the in game library.
## Should SQL be enabled? Uncomment to enable.
-#SQL_ENABLED
+SQL_ENABLED
## Server the MySQL database can be found at.
# Examples: localhost, 200.135.5.43, www.mysqldb.com, etc.
@@ -27,7 +27,7 @@ FEEDBACK_DATABASE feedback
FEEDBACK_TABLEPREFIX
## Username/Login used to access the database.
-FEEDBACK_LOGIN username
+FEEDBACK_LOGIN spoky
## Password used to access the database.
-FEEDBACK_PASSWORD password
\ No newline at end of file
+FEEDBACK_PASSWORD spoks
\ No newline at end of file
diff --git a/config/game_options.txt b/config/game_options.txt
index ae06f1b36754f..4598426155c8b 100644
--- a/config/game_options.txt
+++ b/config/game_options.txt
@@ -21,7 +21,7 @@ REVIVAL_BRAIN_LIFE -1
### RENAMING ###
#Uncomment to allow cyborgs to rename themselves at roundstart. Has no effect on roboticists renaming cyborgs the normal way.
-#RENAME_CYBORG
+RENAME_CYBORG
### OOC DURING ROUND ###
#Comment this out if you want OOC to be automatically disabled during the round, it will be enabled during the lobby and after the round end results.
@@ -29,7 +29,7 @@ OOC_DURING_ROUND
### EMOJI ###
#Comment this out if you want to disable emojis
-EMOJIS
+#EMOJIS
### MOB MOVEMENT ###
@@ -41,8 +41,8 @@ EMOJIS
## To speed things up make the number negative, to slow things down, make the number positive.
## These modify the run/walk speed of all mobs before the mob-specific modifiers are applied.
-RUN_DELAY 1
-WALK_DELAY 4
+RUN_DELAY 0
+WALK_DELAY 3
## The variables below affect the movement of specific mob types.
HUMAN_DELAY 0
@@ -58,7 +58,7 @@ ANIMAL_DELAY 0
#HUMANS_NEED_SURNAMES
## If uncommented, this forces all players to use random names !and appearances!.
-#FORCE_RANDOM_NAMES
+FORCE_RANDOM_NAMES
### ALERT LEVELS ###
@@ -78,51 +78,40 @@ ALERT_DELTA The station's self-destruct mechanism has been engaged. All crew are
## Set to 0 to disable that mode.
PROBABILITY TRAITOR 5
-PROBABILITY TRAITORCHAN 4
+PROBABILITY TRAITORCHAN 2
PROBABILITY DOUBLE_AGENTS 3
-PROBABILITY NUCLEAR 2
-PROBABILITY REVOLUTION 2
-PROBABILITY SHADOWLING 2
-PROBABILITY GANG 2
-PROBABILITY CULT 2
-PROBABILITY CHANGELING 2
+PROBABILITY NUCLEAR 3
+PROBABILITY REVOLUTION 1
+PROBABILITY GANG 1
+PROBABILITY CULT 3
+PROBABILITY CHANGELING 3
PROBABILITY WIZARD 4
-PROBABILITY MALFUNCTION 1
-PROBABILITY BLOB 2
-PROBABILITY RAGINMAGES 2
-PROBABILITY MONKEY 0
+PROBABILITY MALFUNCTION 3
+PROBABILITY BLOB 4
+PROBABILITY RAGINMAGES 0
+PROBABILITY SHADOWLING 3
+PROBABILITY MONKEY 2
PROBABILITY METEOR 0
PROBABILITY EXTENDED 0
## You probably want to keep sandbox off by default for secret and random.
PROBABILITY SANDBOX 0
-
-## Toggles for continuous modes.
-## Modes that aren't continuous will end the instant all antagonists are dead.
-## Unlisted modes are not currently supported for noncontinous play
-
-#CONTINUOUS REVOLUTION
-CONTINUOUS WIZARD
-CONTINUOUS MALFUNCTION
-CONTINUOUS BLOB
-
-## Toggles for allowing midround antagonists (aka mulligan antagonists).
-## In modes that are continuous, if all antagonists should die then a new set of antagonists will be created.
-## Only the listed modes are currently supported for this system
-
-MIDROUND_ANTAG WIZARD
-MIDROUND_ANTAG MALFUNCTION
-MIDROUND_ANTAG BLOB
+## Uncomment to make rounds which end instantly (Rev, Wizard, Malf) continue until
+## the shuttle is called or the station is nuked.
+## Malf and Rev will let the shuttle be called when the antags/protags are dead.
+#CONTINUOUS_ROUND_REV
+CONTINUOUS_ROUND_WIZ
+#CONTINUOUS_ROUND_MALF
## The amount of time it takes for the emergency shuttle to be called, from round start.
-SHUTTLE_REFUEL_DELAY 12000
+SHUTTLE_REFUEL_DELAY 9000
## Variables calculate how number of antagonists will scale to population.
## Used as (Antagonists = Population / Coeff)
## Set to 0 to disable scaling and use default numbers instead.
TRAITOR_SCALING_COEFF 6
-CHANGELING_SCALING_COEFF 6
+CHANGELING_SCALING_COEFF 8
## Variables calculate how number of open security officer positions will scale to population.
## Used as (Officers = Population / Coeff)
@@ -131,17 +120,17 @@ SECURITY_SCALING_COEFF 8
# The number of objectives traitors get.
# Not including escaping/hijacking.
-TRAITOR_OBJECTIVES_AMOUNT 2
+TRAITOR_OBJECTIVES_AMOUNT 3
## Uncomment to prohibit jobs that start with loyalty
## implants from being most antagonists.
-#PROTECT_ROLES_FROM_ANTAGONIST
+PROTECT_ROLES_FROM_ANTAGONIST
## Uncomment to prohibit assistants from becoming most antagonists.
#PROTECT_ASSISTANT_FROM_ANTAGONIST
## If non-human species are barred from joining as a head of staff
-#ENFORCE_HUMAN_AUTHORITY
+ENFORCE_HUMAN_AUTHORITY
## If late-joining players have a chance to become a traitor/changeling
ALLOW_LATEJOIN_ANTAGONISTS
@@ -166,7 +155,7 @@ ALLOW_AI
## How long the delay is before the Away Mission gate opens. Default is half an hour.
## 600 is one minute.
-GATEWAY_DELAY 18000
+GATEWAY_DELAY 9000
### ACCESS ###
@@ -174,7 +163,7 @@ GATEWAY_DELAY 18000
## If the number of players ready at round starts exceeds this threshold, JOBS_HAVE_MINIMAL_ACCESS will automatically be enabled. Otherwise, it will be disabled.
## This is useful for accomodating both low and high population rounds on the same server.
## Comment out or set to 0 to disable this automatic toggle.
-MINIMAL_ACCESS_THRESHOLD 20
+MINIMAL_ACCESS_THRESHOLD 30
## Comment this out if you wish to use the setup where jobs have more access.
## This is intended for servers with low populations - where there are not enough
@@ -183,10 +172,10 @@ MINIMAL_ACCESS_THRESHOLD 20
#JOBS_HAVE_MINIMAL_ACCESS
## Uncomment to give assistants maint access.
-#ASSISTANTS_HAVE_MAINT_ACCESS
+ASSISTANTS_HAVE_MAINT_ACCESS
## Uncoment to give security maint access. Note that if you comment JOBS_HAVE_MINIMAL_ACCESS security already gets maint from that.
-#SECURITY_HAS_MAINT_ACCESS
+SECURITY_HAS_MAINT_ACCESS
## Uncomment to give everyone maint access.
#EVERYONE_HAS_MAINT_ACCESS
@@ -197,7 +186,7 @@ SEC_START_BRIG
### GHOST INTERACTION ###
## Uncomment to let ghosts spin chairs. You may be wondering why this is a config option. Don't ask.
-#GHOST_INTERACTION
+GHOST_INTERACTION
### NON-VOCAL SILICONS ###
## Uncomment to stop the AI, or cyborgs, from having vocal communication.
@@ -216,7 +205,7 @@ SEC_START_BRIG
## Set to 0/commented for "off", silicons will just start with Asimov.
## Set to 1 for "custom", silicons will start with the custom laws defined in silicon_laws.txt. (If silicon_laws.txt is empty, the AI will spawn with asimov and Custom boards will auto-delete.)
## Set to 2 for "random", silicons will start with a random lawset picked from (at the time of writing): P.A.L.A.D.I.N., Corporate, Asimov. More can be added by changing the law datum paths in ai_laws.dm.
-DEFAULT_LAWS 1
+DEFAULT_LAWS 2
### SILICON LAW MAX AMOUNT ###
## The maximum number of laws a silicon can have
@@ -226,6 +215,9 @@ SILICON_MAX_LAW_AMOUNT 12
## Uncoment to give players the choice of their species before they join the game
#JOIN_WITH_MUTANT_RACE
+## Uncomment to allow certain species to have custom colors
+#MUTANT_COLORS
+
## Assistant slot cap. Set to -1 for unlimited.
ASSISTANT_CAP -1
@@ -233,20 +225,11 @@ ASSISTANT_CAP -1
STARLIGHT
## Uncomment to bring back old grey suit assistants instead of the now default rainbow colored assistants.
-#GREY_ASSISTANTS
+GREY_ASSISTANTS
### Midround Antag (aka Mulligan antag) config options ###
-
## A time, in minutes, after which the midround antag system stops attempting to run and continuous rounds end immediately upon completion.
-MIDROUND_ANTAG_TIME_CHECK 60
+MIDROUND_ANTAG_TIME_CHECK 90
## A ratio of living to total crew members, the lower this is, the more people will have to die in order for midround antag to be skipped
-MIDROUND_ANTAG_LIFE_CHECK 0.7
-
-###Limit Spell Choices##
-## Uncomment to disallow wizards from using certain spells that may be too chaotic/fun for your playerbase
-
-#NO_SUMMON_GUNS
-#NO_SUMMON_MAGIC
-#NO_SUMMON_EVENTS
-
+MIDROUND_ANTAG_LIFE_CHECK 0.6
\ No newline at end of file
diff --git a/config/jobs.txt b/config/jobs.txt
index c694bce28d05c..66cfa3492d7f3 100644
--- a/config/jobs.txt
+++ b/config/jobs.txt
@@ -6,7 +6,7 @@ Research Director=1
Chief Medical Officer=1
Station Engineer=5
-Roboticist=1
+Roboticist=2
Medical Doctor=5
Geneticist=2
@@ -29,11 +29,11 @@ Detective=1
Security Officer=5
Assistant=-1
-Atmospheric Technician=4
+Atmospheric Technician=3
Cargo Technician=3
Chaplain=1
-Lawyer=2
+Lawyer=1
Librarian=1
AI=1
-Cyborg=1
\ No newline at end of file
+Cyborg=2
\ No newline at end of file
diff --git a/config/motd.txt b/config/motd.txt
index dd3234cbb69ee..654d573092037 100644
--- a/config/motd.txt
+++ b/config/motd.txt
@@ -1,5 +1,4 @@
-
-
Welcome to Space Station 13!
-
-This server is running a /tg/station 13 Git build.
+
Newfriends, click the rules button at the top right of your screen to check them.
+
Still looking for active admins in various timezones. Send me an email (Spoky@redchan.it) with your BYOND CKey, timezone, and what times you play if you're interested. Experience in SS13 is prefered.
+
If you have any complaints, don't just shitpost in the thread, please send an email to seiji@8chan.co instead. Alternatively, you can hop in our secret irc circlejerk @ #pizzastation on irc.rizon.net
diff --git a/config/tips.txt b/config/tips.txt
index c779fb3c65377..4738b3c678072 100644
--- a/config/tips.txt
+++ b/config/tips.txt
@@ -76,12 +76,4 @@ Alt-click on an adjacent tile to see its contents in the top right pane.
While observing or as a ghost, double click on people, bots, or the singularity to follow them.
Ghosts can click on active teleporters, portals, wormholes, or the gateway to jump to its destination!
Ghosts can double-click their corpse, or the object containing their corpse (such as the cloning scanner), to re-enter it.
-Ghosts can see inside storage items that have been left on the ground.
-If you click on the command/chat bar to give it full focus you can use control + arrow keys to move the cursor around or scroll through the history of commands. (Control + home/end work too)
-Locked down rogue borgs can be dismantled to return the mmi for placement in a new borg.
-Fore = north, aft = south, starboard = east and port = west.
-Many things that bind you can be resisted out of with the resist button. This includes locked or welded lockers, chairs, handcuffs. When ever stuck, just give it a try!
-You can use . or # instead of : for radio channels. Building this habit reduces the chance of accidentally saying things on common.
-Clicking on a tile with an empty hand while pulling something moves it to that tile. No more getting stuck in maint while dragging something!
-Things that override clicks like decks of cards or paper bins can still be picked up by dragging them to your character. Equipped things that override click can be unequipped by dragging it to an empty hand.
-In the job selection menu, from the lobby, you can use right click on the "Low/Medium/High" priority button to make it cycle backwards.
+Ghosts can see inside storage items that have been left on the ground.
\ No newline at end of file
diff --git a/data/mode.txt b/data/mode.txt
index cf1ffd5c991a4..d97c5eada5d8c 100644
--- a/data/mode.txt
+++ b/data/mode.txt
@@ -1 +1 @@
-extended
\ No newline at end of file
+secret
diff --git a/hooks/onRoundEnd/last_restart b/hooks/onRoundEnd/last_restart
new file mode 100644
index 0000000000000..b39356075901a
--- /dev/null
+++ b/hooks/onRoundEnd/last_restart
@@ -0,0 +1 @@
+23
\ No newline at end of file
diff --git a/hooks/onRoundEnd/onRoundEnd.py b/hooks/onRoundEnd/onRoundEnd.py
new file mode 100644
index 0000000000000..2cb18e22f9522
--- /dev/null
+++ b/hooks/onRoundEnd/onRoundEnd.py
@@ -0,0 +1,29 @@
+#This script kills the server once a day, at the earliest roundend after 12 PM
+#How the server is restarted depends on how your server's service management is set up
+
+import datetime
+import os
+import time
+
+#12 PM
+RESTART_THRESHOLD = 12
+LAST_RESTART_FILE = "last_restart"
+
+now = datetime.datetime.now()
+curDay = int(now.day)
+curHour = int(now.hour)
+
+resfile = open(LAST_RESTART_FILE)
+lastrestart = int(resfile.readline())
+resfile.close()
+print datetime.datetime.now().strftime("%c")
+print "onRestart\n"
+if curHour > (RESTART_THRESHOLD-1) and lastrestart != curDay:
+ resfile = open(LAST_RESTART_FILE, "w+")
+ resfile.write(str(curDay))
+ resfile.close()
+ print "restart at"
+ print datetime.datetime.now().strftime("%c")
+ print "\n"
+ os.system("svc -t /etc/service/dreamdaemon/")
+ #He's dead, Jim
diff --git a/html/changelog.html b/html/changelog.html
index f319c4ab2b9b9..834938db07d23 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -1,7 +1,7 @@
- /tg/ Station 13 Changelog
+ PizzaStation 13 Changelog