Merge branch 'master' into alcohol-intolerance
This commit is contained in:
@@ -693,7 +693,7 @@
|
||||
var/prev_dynamic_voting = CONFIG_GET(flag/dynamic_voting)
|
||||
CONFIG_SET(flag/dynamic_voting,!prev_dynamic_voting)
|
||||
if (!prev_dynamic_voting)
|
||||
to_chat(world, "<B>Vote is now between extended and dynamic chaos.</B>")
|
||||
to_chat(world, "<B>Vote is now a ranked choice of dynamic storytellers.</B>")
|
||||
else
|
||||
to_chat(world, "<B>Vote is now between extended and secret.</B>")
|
||||
log_admin("[key_name(usr)] [prev_dynamic_voting ? "disabled" : "enabled"] dynamic voting.")
|
||||
|
||||
@@ -492,7 +492,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
|
||||
message_admins("<span class='adminnotice'>[key_name_admin(usr)] assumed direct control of [M].</span>")
|
||||
log_admin("[key_name(usr)] assumed direct control of [M].")
|
||||
var/mob/adminmob = src.mob
|
||||
M.ckey = src.ckey
|
||||
adminmob.transfer_ckey(M, send_signal = FALSE)
|
||||
if( isobserver(adminmob) )
|
||||
qdel(adminmob)
|
||||
SSblackbox.record_feedback("tally", "admin_verb", 1, "Assume Direct Control") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
@@ -35,6 +35,9 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list(
|
||||
/client/proc/cmd_admin_grantfullaccess,
|
||||
/client/proc/cmd_admin_areatest_all,
|
||||
/client/proc/cmd_admin_areatest_station,
|
||||
#ifdef TESTING
|
||||
/client/proc/see_dirty_varedits,
|
||||
#endif
|
||||
/client/proc/cmd_admin_test_atmos_controllers,
|
||||
/client/proc/cmd_admin_rejuvenate,
|
||||
/datum/admins/proc/show_traitor_panel,
|
||||
@@ -84,8 +87,24 @@ GLOBAL_PROTECT(admin_verbs_debug_mapping)
|
||||
SSblackbox.record_feedback("tally", "admin_verb", 1, "Show Camera Range") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
SSblackbox.record_feedback("tally", "admin_verb", 1, "Show Camera Range")
|
||||
|
||||
#ifdef TESTING
|
||||
GLOBAL_LIST_EMPTY(dirty_vars)
|
||||
|
||||
|
||||
/client/proc/see_dirty_varedits()
|
||||
set category = "Mapping"
|
||||
set name = "Dirty Varedits"
|
||||
|
||||
var/list/dat = list()
|
||||
dat += "<h3>Abandon all hope ye who enter here</h3><br><br>"
|
||||
for(var/thing in GLOB.dirty_vars)
|
||||
dat += "[thing]<br>"
|
||||
CHECK_TICK
|
||||
var/datum/browser/popup = new(usr, "dirty_vars", "Dirty Varedits", 900, 750)
|
||||
popup.set_content(dat.Join())
|
||||
popup.open()
|
||||
#endif
|
||||
|
||||
/client/proc/sec_camera_report()
|
||||
set category = "Mapping"
|
||||
set name = "Camera Report"
|
||||
|
||||
@@ -37,6 +37,8 @@
|
||||
dat += "<I>Your apprentice is training to cast spells that will aid your survival. They know Forcewall and Charge and come with a Staff of Healing.</I><BR>"
|
||||
dat += "<A href='byond://?src=[REF(src)];school=[APPRENTICE_ROBELESS]'>Robeless</A><BR>"
|
||||
dat += "<I>Your apprentice is training to cast spells without their robes. They know Knock and Mindswap.</I><BR>"
|
||||
dat += "<A href='byond://?src=[REF(src)];school=[APPRENTICE_MARTIAL]'>Martial Artist</a><BR>"
|
||||
dat += "<I>Your apprentice is training in ancient martial arts. They know the Plasmafist and Nuclear Fist.</I><BR>"
|
||||
user << browse(dat, "window=radio")
|
||||
onclose(user, "radio")
|
||||
return
|
||||
|
||||
@@ -65,6 +65,8 @@
|
||||
//Equip
|
||||
var/mob/living/carbon/human/H = owner.current
|
||||
H.set_species(/datum/species/abductor)
|
||||
var/obj/item/organ/tongue/abductor/T = H.getorganslot(ORGAN_SLOT_TONGUE)
|
||||
T.mothership = "[team.name]"
|
||||
|
||||
H.real_name = "[team.name] [sub_role]"
|
||||
H.equipOutfit(outfit)
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
actions_types = list(/datum/action/item_action/hands_free/activate)
|
||||
allowed = list(
|
||||
/obj/item/abductor,
|
||||
/obj/item/abductor_baton,
|
||||
/obj/item/abductor/baton,
|
||||
/obj/item/melee/baton,
|
||||
/obj/item/gun/energy,
|
||||
/obj/item/restraints/handcuffs
|
||||
@@ -57,7 +57,7 @@
|
||||
|
||||
/obj/item/clothing/suit/armor/abductor/vest/item_action_slot_check(slot, mob/user, datum/action/A)
|
||||
if(slot == SLOT_WEAR_SUIT) //we only give the mob the ability to activate the vest if he's actually wearing it.
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/suit/armor/abductor/vest/proc/SetDisguise(datum/icon_snapshot/entry)
|
||||
disguise = entry
|
||||
@@ -89,11 +89,9 @@
|
||||
|
||||
/obj/item/clothing/suit/armor/abductor/vest/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
|
||||
DeactivateStealth()
|
||||
return 0
|
||||
|
||||
/obj/item/clothing/suit/armor/abductor/vest/IsReflect()
|
||||
DeactivateStealth()
|
||||
return 0
|
||||
|
||||
/obj/item/clothing/suit/armor/abductor/vest/ui_action_click()
|
||||
switch(mode)
|
||||
@@ -111,7 +109,10 @@
|
||||
to_chat(loc, "<span class='warning'>Combat injection is still recharging.</span>")
|
||||
return
|
||||
var/mob/living/carbon/human/M = loc
|
||||
M.do_adrenaline(150, FALSE, 0, 0, TRUE, list("inaprovaline" = 3, "synaptizine" = 10, "omnizine" = 10), "<span class='boldnotice'>You feel a sudden surge of energy!</span>")
|
||||
M.adjustStaminaLoss(-75)
|
||||
M.SetUnconscious(0)
|
||||
M.SetStun(0)
|
||||
M.SetKnockdown(0)
|
||||
combat_cooldown = 0
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
@@ -131,9 +132,11 @@
|
||||
|
||||
/obj/item/abductor
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
lefthand_file = 'icons/mob/inhands/antag/abductor_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/antag/abductor_righthand.dmi'
|
||||
|
||||
/obj/item/abductor/proc/AbductorCheck(mob/user)
|
||||
if(HAS_TRAIT(user, TRAIT_ABDUCTOR_TRAINING))
|
||||
if (HAS_TRAIT(user, TRAIT_ABDUCTOR_TRAINING))
|
||||
return TRUE
|
||||
if (istype(user) && user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_TRAINING))
|
||||
return TRUE
|
||||
@@ -158,8 +161,6 @@
|
||||
desc = "A dual-mode tool for retrieving specimens and scanning appearances. Scanning can be done through cameras."
|
||||
icon_state = "gizmo_scan"
|
||||
item_state = "silencer"
|
||||
lefthand_file = 'icons/mob/inhands/antag/abductor_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/antag/abductor_righthand.dmi'
|
||||
var/mode = GIZMO_SCAN
|
||||
var/mob/living/marked = null
|
||||
var/obj/machinery/abductor/console/console
|
||||
@@ -218,12 +219,9 @@
|
||||
if(marked == target)
|
||||
to_chat(user, "<span class='warning'>This specimen is already marked!</span>")
|
||||
return
|
||||
if(ishuman(target))
|
||||
if(isabductor(target))
|
||||
marked = target
|
||||
to_chat(user, "<span class='notice'>You mark [target] for future retrieval.</span>")
|
||||
else
|
||||
prepare(target,user)
|
||||
if(isabductor(target) || iscow(target))
|
||||
marked = target
|
||||
to_chat(user, "<span class='notice'>You mark [target] for future retrieval.</span>")
|
||||
else
|
||||
prepare(target,user)
|
||||
|
||||
@@ -247,8 +245,6 @@
|
||||
desc = "A compact device used to shut down communications equipment."
|
||||
icon_state = "silencer"
|
||||
item_state = "gizmo"
|
||||
lefthand_file = 'icons/mob/inhands/antag/abductor_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/antag/abductor_righthand.dmi'
|
||||
|
||||
/obj/item/abductor/silencer/attack(mob/living/M, mob/user)
|
||||
if(!AbductorCheck(user))
|
||||
@@ -292,8 +288,6 @@
|
||||
or to send a command to a test subject with a charged gland."
|
||||
icon_state = "mind_device_message"
|
||||
item_state = "silencer"
|
||||
lefthand_file = 'icons/mob/inhands/antag/abductor_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/antag/abductor_righthand.dmi'
|
||||
var/mode = MIND_DEVICE_MESSAGE
|
||||
|
||||
/obj/item/abductor/mind_device/attack_self(mob/user)
|
||||
@@ -389,6 +383,17 @@
|
||||
item_state = "alienpistol"
|
||||
trigger_guard = TRIGGER_GUARD_ALLOW_ALL
|
||||
|
||||
/obj/item/gun/energy/shrink_ray
|
||||
name = "shrink ray blaster"
|
||||
desc = "This is a piece of frightening alien tech that enhances the magnetic pull of atoms in a localized space to temporarily make an object shrink. \
|
||||
That or it's just space magic. Either way, it shrinks stuff."
|
||||
ammo_type = list(/obj/item/ammo_casing/energy/shrink)
|
||||
item_state = "shrink_ray"
|
||||
icon_state = "shrink_ray"
|
||||
fire_delay = 30
|
||||
selfcharge = 1//shot costs 200 energy, has a max capacity of 1000 for 5 shots. self charge returns 25 energy every couple ticks, so about 1 shot charged every 12~ seconds
|
||||
trigger_guard = TRIGGER_GUARD_ALLOW_ALL// variable-size trigger, get it? (abductors need this to be set so the gun is usable for them)
|
||||
|
||||
/obj/item/paper/guides/antag/abductor
|
||||
name = "Dissection Guide"
|
||||
icon_state = "alienpaper_words"
|
||||
@@ -422,21 +427,18 @@
|
||||
#define BATON_PROBE 3
|
||||
#define BATON_MODES 4
|
||||
|
||||
/obj/item/abductor_baton
|
||||
/obj/item/abductor/baton
|
||||
name = "advanced baton"
|
||||
desc = "A quad-mode baton used for incapacitation and restraining of specimens."
|
||||
var/mode = BATON_STUN
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "wonderprodStun"
|
||||
item_state = "wonderprod"
|
||||
lefthand_file = 'icons/mob/inhands/antag/abductor_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/antag/abductor_righthand.dmi'
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
force = 7
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
actions_types = list(/datum/action/item_action/toggle_mode)
|
||||
|
||||
/obj/item/abductor_baton/proc/toggle(mob/living/user=usr)
|
||||
/obj/item/abductor/baton/proc/toggle(mob/living/user=usr)
|
||||
mode = (mode+1)%BATON_MODES
|
||||
var/txt
|
||||
switch(mode)
|
||||
@@ -452,7 +454,7 @@
|
||||
to_chat(usr, "<span class='notice'>You switch the baton to [txt] mode.</span>")
|
||||
update_icon()
|
||||
|
||||
/obj/item/abductor_baton/update_icon()
|
||||
/obj/item/abductor/baton/update_icon()
|
||||
switch(mode)
|
||||
if(BATON_STUN)
|
||||
icon_state = "wonderprodStun"
|
||||
@@ -467,8 +469,8 @@
|
||||
icon_state = "wonderprodProbe"
|
||||
item_state = "wonderprodProbe"
|
||||
|
||||
/obj/item/abductor_baton/attack(mob/target, mob/living/user)
|
||||
if(!isabductor(user))
|
||||
/obj/item/abductor/baton/attack(mob/target, mob/living/user)
|
||||
if(!AbductorCheck(user))
|
||||
return
|
||||
|
||||
if(iscyborg(target))
|
||||
@@ -482,11 +484,9 @@
|
||||
|
||||
user.do_attack_animation(L)
|
||||
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
if(H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK))
|
||||
playsound(L, 'sound/weapons/genhit.ogg', 50, 1)
|
||||
return 0
|
||||
if(L.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK))
|
||||
playsound(L, 'sound/weapons/genhit.ogg', 50, TRUE)
|
||||
return FALSE
|
||||
|
||||
switch (mode)
|
||||
if(BATON_STUN)
|
||||
@@ -498,10 +498,10 @@
|
||||
if(BATON_PROBE)
|
||||
ProbeAttack(L,user)
|
||||
|
||||
/obj/item/abductor_baton/attack_self(mob/living/user)
|
||||
/obj/item/abductor/baton/attack_self(mob/living/user)
|
||||
toggle(user)
|
||||
|
||||
/obj/item/abductor_baton/proc/StunAttack(mob/living/L,mob/living/user)
|
||||
/obj/item/abductor/baton/proc/StunAttack(mob/living/L,mob/living/user)
|
||||
|
||||
L.lastattacker = user.real_name
|
||||
L.lastattackerckey = user.ckey
|
||||
@@ -513,7 +513,7 @@
|
||||
|
||||
L.visible_message("<span class='danger'>[user] has stunned [L] with [src]!</span>", \
|
||||
"<span class='userdanger'>[user] has stunned you with [src]!</span>")
|
||||
playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1)
|
||||
playsound(src, 'sound/weapons/egloves.ogg', 50, TRUE, -1)
|
||||
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
@@ -521,7 +521,7 @@
|
||||
|
||||
log_combat(user, L, "stunned")
|
||||
|
||||
/obj/item/abductor_baton/proc/SleepAttack(mob/living/L,mob/living/user)
|
||||
/obj/item/abductor/baton/proc/SleepAttack(mob/living/L,mob/living/user)
|
||||
if(L.incapacitated(TRUE, TRUE))
|
||||
if(L.anti_magic_check(FALSE, FALSE, TRUE, 0))
|
||||
to_chat(user, "<span class='warning'>The specimen's tinfoil protection is interfering with the sleep inducement!</span>")
|
||||
@@ -531,7 +531,7 @@
|
||||
return
|
||||
L.visible_message("<span class='danger'>[user] has induced sleep in [L] with [src]!</span>", \
|
||||
"<span class='userdanger'>You suddenly feel very drowsy!</span>")
|
||||
playsound(loc, 'sound/weapons/egloves.ogg', 50, 1, -1)
|
||||
playsound(src, 'sound/weapons/egloves.ogg', 50, TRUE, -1)
|
||||
L.Sleeping(1200)
|
||||
log_combat(user, L, "put to sleep")
|
||||
else
|
||||
@@ -545,13 +545,13 @@
|
||||
L.visible_message("<span class='danger'>[user] tried to induce sleep in [L] with [src]!</span>", \
|
||||
"<span class='userdanger'>You suddenly feel drowsy!</span>")
|
||||
|
||||
/obj/item/abductor_baton/proc/CuffAttack(mob/living/L,mob/living/user)
|
||||
/obj/item/abductor/baton/proc/CuffAttack(mob/living/L,mob/living/user)
|
||||
if(!iscarbon(L))
|
||||
return
|
||||
var/mob/living/carbon/C = L
|
||||
if(!C.handcuffed)
|
||||
if(C.get_num_arms(FALSE) >= 2 || C.get_arm_ignore())
|
||||
playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2)
|
||||
playsound(src, 'sound/weapons/cablecuff.ogg', 30, TRUE, -2)
|
||||
C.visible_message("<span class='danger'>[user] begins restraining [C] with [src]!</span>", \
|
||||
"<span class='userdanger'>[user] begins shaping an energy field around your hands!</span>")
|
||||
if(do_mob(user, C, 30) && (C.get_num_arms(FALSE) >= 2 || C.get_arm_ignore()))
|
||||
@@ -565,7 +565,7 @@
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[C] doesn't have two hands...</span>")
|
||||
|
||||
/obj/item/abductor_baton/proc/ProbeAttack(mob/living/L,mob/living/user)
|
||||
/obj/item/abductor/baton/proc/ProbeAttack(mob/living/L,mob/living/user)
|
||||
L.visible_message("<span class='danger'>[user] probes [L] with [src]!</span>", \
|
||||
"<span class='userdanger'>[user] probes you!</span>")
|
||||
|
||||
@@ -610,7 +610,7 @@
|
||||
S.start()
|
||||
. = ..()
|
||||
|
||||
/obj/item/abductor_baton/examine(mob/user)
|
||||
/obj/item/abductor/baton/examine(mob/user)
|
||||
. = ..()
|
||||
switch(mode)
|
||||
if(BATON_STUN)
|
||||
@@ -639,10 +639,44 @@
|
||||
AddComponent(/datum/component/wearertargeting/earprotection, list(SLOT_EARS))
|
||||
|
||||
/obj/item/radio/headset/abductor/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/screwdriver))
|
||||
if(W.tool_behaviour == TOOL_SCREWDRIVER)
|
||||
return // Stops humans from disassembling abductor headsets.
|
||||
return ..()
|
||||
|
||||
/obj/item/abductor_machine_beacon
|
||||
name = "machine beacon"
|
||||
desc = "A beacon designed to instantly tele-construct abductor machinery."
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "beacon"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
var/obj/machinery/spawned_machine
|
||||
|
||||
/obj/item/abductor_machine_beacon/attack_self(mob/user)
|
||||
..()
|
||||
user.visible_message("<span class='notice'>[user] places down [src] and activates it.</span>", "<span class='notice'>You place down [src] and activate it.</span>")
|
||||
user.dropItemToGround(src)
|
||||
playsound(src, 'sound/machines/terminal_alert.ogg', 50)
|
||||
addtimer(CALLBACK(src, .proc/try_spawn_machine), 30)
|
||||
|
||||
/obj/item/abductor_machine_beacon/proc/try_spawn_machine()
|
||||
var/viable = FALSE
|
||||
if(isfloorturf(loc))
|
||||
var/turf/T = loc
|
||||
viable = TRUE
|
||||
for(var/obj/thing in T.contents)
|
||||
if(thing.density || ismachinery(thing) || isstructure(thing))
|
||||
viable = FALSE
|
||||
if(viable)
|
||||
playsound(src, 'sound/effects/phasein.ogg', 50, TRUE)
|
||||
var/new_machine = new spawned_machine(loc)
|
||||
visible_message("<span class='notice'>[new_machine] warps on top of the beacon!</span>")
|
||||
qdel(src)
|
||||
else
|
||||
playsound(src, 'sound/machines/buzz-two.ogg', 50)
|
||||
|
||||
/obj/item/abductor_machine_beacon/chem_dispenser
|
||||
name = "beacon - Reagent Synthesizer"
|
||||
spawned_machine = /obj/machinery/chem_dispenser/abductor
|
||||
|
||||
/obj/item/scalpel/alien
|
||||
name = "alien scalpel"
|
||||
@@ -706,11 +740,11 @@
|
||||
framestackamount = 1
|
||||
|
||||
/obj/structure/table_frame/abductor/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/wrench))
|
||||
if(I.tool_behaviour == TOOL_WRENCH)
|
||||
to_chat(user, "<span class='notice'>You start disassembling [src]...</span>")
|
||||
I.play_tool_sound(src)
|
||||
if(I.use_tool(src, user, 30))
|
||||
playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
|
||||
playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE)
|
||||
for(var/i = 1, i <= framestackamount, i++)
|
||||
new framestack(get_turf(src))
|
||||
qdel(src)
|
||||
@@ -760,7 +794,6 @@
|
||||
icon = 'icons/obj/abductor.dmi'
|
||||
icon_state = "bed"
|
||||
can_buckle = 1
|
||||
buckle_lying = 1
|
||||
|
||||
var/static/list/injected_reagents = list("corazone")
|
||||
|
||||
@@ -798,3 +831,11 @@
|
||||
airlock_type = /obj/machinery/door/airlock/abductor
|
||||
material_type = /obj/item/stack/sheet/mineral/abductor
|
||||
noglass = TRUE
|
||||
|
||||
/obj/item/clothing/under/abductor
|
||||
desc = "The most advanced form of jumpsuit known to reality, looks uncomfortable."
|
||||
name = "alien jumpsuit"
|
||||
icon_state = "abductor"
|
||||
item_state = "bl_suit"
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 10, rad = 0, fire = 0, acid = 0)
|
||||
can_adjust = 0
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/datum/outfit/abductor
|
||||
name = "Abductor Basic"
|
||||
uniform = /obj/item/clothing/under/color/grey //they're greys gettit
|
||||
uniform = /obj/item/clothing/under/abductor
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
back = /obj/item/storage/backpack
|
||||
ears = /obj/item/radio/headset/abductor
|
||||
@@ -34,7 +34,7 @@
|
||||
name = "Abductor Agent"
|
||||
head = /obj/item/clothing/head/helmet/abductor
|
||||
suit = /obj/item/clothing/suit/armor/abductor/vest
|
||||
suit_store = /obj/item/abductor_baton
|
||||
suit_store = /obj/item/abductor/baton
|
||||
belt = /obj/item/storage/belt/military/abductor/full
|
||||
|
||||
backpack_contents = list(
|
||||
|
||||
@@ -5,18 +5,23 @@
|
||||
icon_state = "gland"
|
||||
status = ORGAN_ROBOTIC
|
||||
beating = TRUE
|
||||
organ_flags = ORGAN_NO_SPOIL
|
||||
var/true_name = "baseline placebo referencer"
|
||||
var/cooldown_low = 300
|
||||
var/cooldown_high = 300
|
||||
var/next_activation = 0
|
||||
var/uses // -1 For infinite
|
||||
var/human_only = 0
|
||||
var/active = 0
|
||||
var/human_only = FALSE
|
||||
var/active = FALSE
|
||||
|
||||
var/mind_control_uses = 1
|
||||
var/mind_control_duration = 1800
|
||||
var/active_mind_control = FALSE
|
||||
|
||||
/obj/item/organ/heart/gland/Initialize()
|
||||
. = ..()
|
||||
icon_state = pick(list("health", "spider", "slime", "emp", "species", "egg", "vent", "mindshock", "viral"))
|
||||
|
||||
/obj/item/organ/heart/gland/examine(mob/user)
|
||||
. = ..()
|
||||
if((user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_SCIENTIST_TRAINING)) || isobserver(user))
|
||||
@@ -55,14 +60,18 @@
|
||||
active_mind_control = TRUE
|
||||
message_admins("[key_name(user)] sent an abductor mind control message to [key_name(owner)]: [command]")
|
||||
update_gland_hud()
|
||||
|
||||
var/obj/screen/alert/mind_control/mind_alert = owner.throw_alert("mind_control", /obj/screen/alert/mind_control)
|
||||
mind_alert.command = command
|
||||
addtimer(CALLBACK(src, .proc/clear_mind_control), mind_control_duration)
|
||||
return TRUE
|
||||
|
||||
/obj/item/organ/heart/gland/proc/clear_mind_control()
|
||||
if(!ownerCheck() || !active_mind_control)
|
||||
return FALSE
|
||||
to_chat(owner, "<span class='userdanger'>You feel the compulsion fade, and you completely forget about your previous orders.</span>")
|
||||
to_chat(owner, "<span class='userdanger'>You feel the compulsion fade, and you <i>completely forget</i> about your previous orders.</span>")
|
||||
owner.clear_alert("mind_control")
|
||||
active_mind_control = FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/item/organ/heart/gland/Remove(mob/living/carbon/M, special = 0)
|
||||
active = 0
|
||||
@@ -98,257 +107,4 @@
|
||||
active = 0
|
||||
|
||||
/obj/item/organ/heart/gland/proc/activate()
|
||||
return
|
||||
|
||||
/obj/item/organ/heart/gland/heals
|
||||
true_name = "coherency harmonizer"
|
||||
cooldown_low = 200
|
||||
cooldown_high = 400
|
||||
uses = -1
|
||||
icon_state = "health"
|
||||
mind_control_uses = 3
|
||||
mind_control_duration = 3000
|
||||
|
||||
/obj/item/organ/heart/gland/heals/activate()
|
||||
to_chat(owner, "<span class='notice'>You feel curiously revitalized.</span>")
|
||||
owner.adjustToxLoss(-20, FALSE, TRUE)
|
||||
owner.heal_bodypart_damage(20, 20, 0, TRUE)
|
||||
owner.adjustOxyLoss(-20)
|
||||
|
||||
/obj/item/organ/heart/gland/slime
|
||||
true_name = "gastric animation galvanizer"
|
||||
cooldown_low = 600
|
||||
cooldown_high = 1200
|
||||
uses = -1
|
||||
icon_state = "slime"
|
||||
mind_control_uses = 1
|
||||
mind_control_duration = 2400
|
||||
|
||||
/obj/item/organ/heart/gland/slime/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)
|
||||
..()
|
||||
owner.faction |= "slime"
|
||||
owner.grant_language(/datum/language/slime)
|
||||
|
||||
/obj/item/organ/heart/gland/slime/activate()
|
||||
to_chat(owner, "<span class='warning'>You feel nauseated!</span>")
|
||||
owner.vomit(20)
|
||||
|
||||
var/mob/living/simple_animal/slime/Slime = new(get_turf(owner), "grey")
|
||||
Slime.Friends = list(owner)
|
||||
Slime.Leader = owner
|
||||
|
||||
/obj/item/organ/heart/gland/mindshock
|
||||
true_name = "neural crosstalk uninhibitor"
|
||||
cooldown_low = 400
|
||||
cooldown_high = 700
|
||||
uses = -1
|
||||
icon_state = "mindshock"
|
||||
mind_control_uses = 1
|
||||
mind_control_duration = 6000
|
||||
|
||||
/obj/item/organ/heart/gland/mindshock/activate()
|
||||
to_chat(owner, "<span class='notice'>You get a headache.</span>")
|
||||
|
||||
var/turf/T = get_turf(owner)
|
||||
for(var/mob/living/carbon/H in orange(4,T))
|
||||
if(H == owner)
|
||||
continue
|
||||
switch(pick(1,3))
|
||||
if(1)
|
||||
to_chat(H, "<span class='userdanger'>You hear a loud buzz in your head, silencing your thoughts!</span>")
|
||||
H.Stun(50)
|
||||
if(2)
|
||||
to_chat(H, "<span class='warning'>You hear an annoying buzz in your head.</span>")
|
||||
H.confused += 15
|
||||
H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 160)
|
||||
if(3)
|
||||
H.hallucination += 60
|
||||
|
||||
/obj/item/organ/heart/gland/pop
|
||||
true_name = "anthropmorphic translocator"
|
||||
cooldown_low = 900
|
||||
cooldown_high = 1800
|
||||
uses = -1
|
||||
human_only = TRUE
|
||||
icon_state = "species"
|
||||
mind_control_uses = 5
|
||||
mind_control_duration = 300
|
||||
|
||||
/obj/item/organ/heart/gland/pop/activate()
|
||||
to_chat(owner, "<span class='notice'>You feel unlike yourself.</span>")
|
||||
randomize_human(owner)
|
||||
var/species = pick(list(/datum/species/human, /datum/species/lizard, /datum/species/insect, /datum/species/fly))
|
||||
owner.set_species(species)
|
||||
|
||||
/obj/item/organ/heart/gland/ventcrawling
|
||||
true_name = "pliant cartilage enabler"
|
||||
cooldown_low = 1800
|
||||
cooldown_high = 2400
|
||||
uses = 1
|
||||
icon_state = "vent"
|
||||
mind_control_uses = 4
|
||||
mind_control_duration = 1800
|
||||
|
||||
/obj/item/organ/heart/gland/ventcrawling/activate()
|
||||
to_chat(owner, "<span class='notice'>You feel very stretchy.</span>")
|
||||
owner.ventcrawler = VENTCRAWLER_ALWAYS
|
||||
|
||||
/obj/item/organ/heart/gland/viral
|
||||
true_name = "contamination incubator"
|
||||
cooldown_low = 1800
|
||||
cooldown_high = 2400
|
||||
uses = 1
|
||||
icon_state = "viral"
|
||||
mind_control_uses = 1
|
||||
mind_control_duration = 1800
|
||||
|
||||
/obj/item/organ/heart/gland/viral/activate()
|
||||
to_chat(owner, "<span class='warning'>You feel sick.</span>")
|
||||
var/datum/disease/advance/A = random_virus(pick(2,6),6)
|
||||
A.carrier = TRUE
|
||||
owner.ForceContractDisease(A, FALSE, TRUE)
|
||||
|
||||
/obj/item/organ/heart/gland/viral/proc/random_virus(max_symptoms, max_level)
|
||||
if(max_symptoms > VIRUS_SYMPTOM_LIMIT)
|
||||
max_symptoms = VIRUS_SYMPTOM_LIMIT
|
||||
var/datum/disease/advance/A = new /datum/disease/advance()
|
||||
var/list/datum/symptom/possible_symptoms = list()
|
||||
for(var/symptom in subtypesof(/datum/symptom))
|
||||
var/datum/symptom/S = symptom
|
||||
if(initial(S.level) > max_level)
|
||||
continue
|
||||
if(initial(S.level) <= 0) //unobtainable symptoms
|
||||
continue
|
||||
possible_symptoms += S
|
||||
for(var/i in 1 to max_symptoms)
|
||||
var/datum/symptom/chosen_symptom = pick_n_take(possible_symptoms)
|
||||
if(chosen_symptom)
|
||||
var/datum/symptom/S = new chosen_symptom
|
||||
A.symptoms += S
|
||||
A.Refresh() //just in case someone already made and named the same disease
|
||||
return A
|
||||
|
||||
/obj/item/organ/heart/gland/trauma
|
||||
true_name = "white matter randomiser"
|
||||
cooldown_low = 800
|
||||
cooldown_high = 1200
|
||||
uses = 5
|
||||
icon_state = "emp"
|
||||
mind_control_uses = 3
|
||||
mind_control_duration = 1800
|
||||
|
||||
/obj/item/organ/heart/gland/trauma/activate()
|
||||
to_chat(owner, "<span class='warning'>You feel a spike of pain in your head.</span>")
|
||||
if(prob(33))
|
||||
owner.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY))
|
||||
else
|
||||
if(prob(20))
|
||||
owner.gain_trauma_type(BRAIN_TRAUMA_SEVERE, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY))
|
||||
else
|
||||
owner.gain_trauma_type(BRAIN_TRAUMA_MILD, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY))
|
||||
|
||||
/obj/item/organ/heart/gland/spiderman
|
||||
true_name = "araneae cloister accelerator"
|
||||
cooldown_low = 450
|
||||
cooldown_high = 900
|
||||
uses = -1
|
||||
icon_state = "spider"
|
||||
mind_control_uses = 2
|
||||
mind_control_duration = 2400
|
||||
|
||||
/obj/item/organ/heart/gland/spiderman/activate()
|
||||
to_chat(owner, "<span class='warning'>You feel something crawling in your skin.</span>")
|
||||
owner.faction |= "spiders"
|
||||
var/obj/structure/spider/spiderling/S = new(owner.drop_location())
|
||||
S.directive = "Protect your nest inside [owner.real_name]."
|
||||
|
||||
/obj/item/organ/heart/gland/egg
|
||||
true_name = "roe/enzymatic synthesizer"
|
||||
cooldown_low = 300
|
||||
cooldown_high = 400
|
||||
uses = -1
|
||||
icon_state = "egg"
|
||||
lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
|
||||
mind_control_uses = 2
|
||||
mind_control_duration = 1800
|
||||
|
||||
/obj/item/organ/heart/gland/egg/activate()
|
||||
owner.visible_message("<span class='alertalien'>[owner] [pick(EGG_LAYING_MESSAGES)]</span>")
|
||||
var/turf/T = owner.drop_location()
|
||||
new /obj/item/reagent_containers/food/snacks/egg/gland(T)
|
||||
|
||||
/obj/item/organ/heart/gland/electric
|
||||
true_name = "electron accumulator/discharger"
|
||||
cooldown_low = 800
|
||||
cooldown_high = 1200
|
||||
uses = -1
|
||||
mind_control_uses = 2
|
||||
mind_control_duration = 900
|
||||
|
||||
/obj/item/organ/heart/gland/electric/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)
|
||||
..()
|
||||
ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, ORGAN_TRAIT)
|
||||
|
||||
/obj/item/organ/heart/gland/electric/Remove(mob/living/carbon/M, special = 0)
|
||||
REMOVE_TRAIT(owner, TRAIT_SHOCKIMMUNE, ORGAN_TRAIT)
|
||||
..()
|
||||
|
||||
/obj/item/organ/heart/gland/electric/activate()
|
||||
owner.visible_message("<span class='danger'>[owner]'s skin starts emitting electric arcs!</span>",\
|
||||
"<span class='warning'>You feel electric energy building up inside you!</span>")
|
||||
playsound(get_turf(owner), "sparks", 100, 1, -1)
|
||||
addtimer(CALLBACK(src, .proc/zap), rand(30, 100))
|
||||
|
||||
/obj/item/organ/heart/gland/electric/proc/zap()
|
||||
tesla_zap(owner, 4, 8000, TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE | TESLA_MOB_STUN)
|
||||
playsound(get_turf(owner), 'sound/magic/lightningshock.ogg', 50, 1)
|
||||
|
||||
/obj/item/organ/heart/gland/chem
|
||||
true_name = "intrinsic pharma-provider"
|
||||
cooldown_low = 50
|
||||
cooldown_high = 50
|
||||
uses = -1
|
||||
mind_control_uses = 3
|
||||
mind_control_duration = 1200
|
||||
var/list/possible_reagents = list()
|
||||
|
||||
/obj/item/organ/heart/gland/chem/Initialize()
|
||||
..()
|
||||
for(var/X in subtypesof(/datum/reagent/drug))
|
||||
var/datum/reagent/R = X
|
||||
possible_reagents += initial(R.id)
|
||||
for(var/X in subtypesof(/datum/reagent/medicine))
|
||||
var/datum/reagent/R = X
|
||||
possible_reagents += initial(R.id)
|
||||
for(var/X in typesof(/datum/reagent/toxin))
|
||||
var/datum/reagent/R = X
|
||||
possible_reagents += initial(R.id)
|
||||
|
||||
/obj/item/organ/heart/gland/chem/activate()
|
||||
var/chem_to_add = pick(possible_reagents)
|
||||
owner.reagents.add_reagent(chem_to_add, 2)
|
||||
owner.adjustToxLoss(-2, TRUE, TRUE)
|
||||
..()
|
||||
|
||||
/obj/item/organ/heart/gland/plasma
|
||||
true_name = "effluvium sanguine-synonym emitter"
|
||||
cooldown_low = 1200
|
||||
cooldown_high = 1800
|
||||
uses = -1
|
||||
mind_control_uses = 1
|
||||
mind_control_duration = 800
|
||||
|
||||
/obj/item/organ/heart/gland/plasma/activate()
|
||||
to_chat(owner, "<span class='warning'>You feel bloated.</span>")
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, owner, "<span class='userdanger'>A massive stomachache overcomes you.</span>"), 150)
|
||||
addtimer(CALLBACK(src, .proc/vomit_plasma), 200)
|
||||
|
||||
/obj/item/organ/heart/gland/plasma/proc/vomit_plasma()
|
||||
if(!owner)
|
||||
return
|
||||
owner.visible_message("<span class='danger'>[owner] vomits a cloud of plasma!</span>")
|
||||
var/turf/open/T = get_turf(owner)
|
||||
if(istype(T))
|
||||
T.atmos_spawn_air("plasma=50;TEMP=[T20C]")
|
||||
owner.vomit()
|
||||
return
|
||||
@@ -0,0 +1,19 @@
|
||||
/obj/item/organ/heart/gland/access
|
||||
true_name = "anagraphic electro-scrambler"
|
||||
cooldown_low = 600
|
||||
cooldown_high = 1200
|
||||
uses = 1
|
||||
icon_state = "mindshock"
|
||||
mind_control_uses = 3
|
||||
mind_control_duration = 900
|
||||
|
||||
/obj/item/organ/heart/gland/access/activate()
|
||||
to_chat(owner, "<span class='notice'>You feel like a VIP for some reason.</span>")
|
||||
RegisterSignal(owner, COMSIG_MOB_ALLOWED, .proc/free_access)
|
||||
|
||||
/obj/item/organ/heart/gland/access/proc/free_access(datum/source, obj/O)
|
||||
return TRUE
|
||||
|
||||
/obj/item/organ/heart/gland/access/Remove(mob/living/carbon/M, special = 0)
|
||||
UnregisterSignal(owner, COMSIG_MOB_ALLOWED)
|
||||
..()
|
||||
@@ -0,0 +1,18 @@
|
||||
/obj/item/organ/heart/gland/blood
|
||||
true_name = "pseudonuclear hemo-destabilizer"
|
||||
cooldown_low = 1200
|
||||
cooldown_high = 1800
|
||||
uses = -1
|
||||
icon_state = "egg"
|
||||
lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
|
||||
mind_control_uses = 3
|
||||
mind_control_duration = 1500
|
||||
|
||||
/obj/item/organ/heart/gland/blood/activate()
|
||||
if(!ishuman(owner) || !owner.dna.species)
|
||||
return
|
||||
var/mob/living/carbon/human/H = owner
|
||||
var/datum/species/species = H.dna.species
|
||||
to_chat(H, "<span class='warning'>You feel your blood heat up for a moment.</span>")
|
||||
species.exotic_blood = get_random_reagent_id()
|
||||
@@ -0,0 +1,20 @@
|
||||
/obj/item/organ/heart/gland/chem
|
||||
true_name = "intrinsic pharma-provider"
|
||||
cooldown_low = 50
|
||||
cooldown_high = 50
|
||||
uses = -1
|
||||
icon_state = "viral"
|
||||
mind_control_uses = 3
|
||||
mind_control_duration = 1200
|
||||
var/list/possible_reagents = list()
|
||||
|
||||
/obj/item/organ/heart/gland/chem/Initialize()
|
||||
. = ..()
|
||||
for(var/R in subtypesof(/datum/reagent/drug) + subtypesof(/datum/reagent/medicine) + typesof(/datum/reagent/toxin))
|
||||
possible_reagents += R
|
||||
|
||||
/obj/item/organ/heart/gland/chem/activate()
|
||||
var/chem_to_add = pick(possible_reagents)
|
||||
owner.reagents.add_reagent(chem_to_add, 2)
|
||||
owner.adjustToxLoss(-5, TRUE, TRUE)
|
||||
..()
|
||||
@@ -0,0 +1,15 @@
|
||||
/obj/item/organ/heart/gland/egg
|
||||
true_name = "roe/enzymatic synthesizer"
|
||||
cooldown_low = 300
|
||||
cooldown_high = 400
|
||||
uses = -1
|
||||
icon_state = "egg"
|
||||
lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
|
||||
mind_control_uses = 2
|
||||
mind_control_duration = 1800
|
||||
|
||||
/obj/item/organ/heart/gland/egg/activate()
|
||||
owner.visible_message("<span class='alertalien'>[owner] [pick(EGG_LAYING_MESSAGES)]</span>")
|
||||
var/turf/T = owner.drop_location()
|
||||
new /obj/item/reagent_containers/food/snacks/egg/gland(T)
|
||||
@@ -0,0 +1,26 @@
|
||||
/obj/item/organ/heart/gland/electric
|
||||
true_name = "electron accumulator/discharger"
|
||||
cooldown_low = 800
|
||||
cooldown_high = 1200
|
||||
icon_state = "species"
|
||||
uses = -1
|
||||
mind_control_uses = 2
|
||||
mind_control_duration = 900
|
||||
|
||||
/obj/item/organ/heart/gland/electric/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)
|
||||
..()
|
||||
ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland")
|
||||
|
||||
/obj/item/organ/heart/gland/electric/Remove(mob/living/carbon/M, special = 0)
|
||||
REMOVE_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland")
|
||||
..()
|
||||
|
||||
/obj/item/organ/heart/gland/electric/activate()
|
||||
owner.visible_message("<span class='danger'>[owner]'s skin starts emitting electric arcs!</span>",\
|
||||
"<span class='warning'>You feel electric energy building up inside you!</span>")
|
||||
playsound(get_turf(owner), "sparks", 100, TRUE, -1)
|
||||
addtimer(CALLBACK(src, .proc/zap), rand(30, 100))
|
||||
|
||||
/obj/item/organ/heart/gland/electric/proc/zap()
|
||||
tesla_zap(owner, 4, 8000, TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE | TESLA_MOB_STUN)
|
||||
playsound(get_turf(owner), 'sound/magic/lightningshock.ogg', 50, TRUE)
|
||||
@@ -0,0 +1,178 @@
|
||||
/obj/item/organ/heart/gland/heal
|
||||
true_name = "organic replicator"
|
||||
cooldown_low = 200
|
||||
cooldown_high = 400
|
||||
uses = -1
|
||||
human_only = TRUE
|
||||
icon_state = "health"
|
||||
mind_control_uses = 3
|
||||
mind_control_duration = 3000
|
||||
|
||||
/obj/item/organ/heart/gland/heal/activate()
|
||||
if(!(owner.mob_biotypes & MOB_ORGANIC))
|
||||
return
|
||||
|
||||
for(var/organ in owner.internal_organs)
|
||||
if(istype(organ, /obj/item/organ/cyberimp))
|
||||
reject_implant(organ)
|
||||
return
|
||||
|
||||
var/obj/item/organ/liver/liver = owner.getorganslot(ORGAN_SLOT_LIVER)
|
||||
if((!liver/* && !HAS_TRAIT(owner, TRAIT_NOMETABOLISM)*/) || (liver && ((liver.damage > (liver.maxHealth / 2)) || (istype(liver, /obj/item/organ/liver/cybernetic)))))
|
||||
replace_liver(liver)
|
||||
return
|
||||
|
||||
var/obj/item/organ/lungs/lungs = owner.getorganslot(ORGAN_SLOT_LUNGS)
|
||||
if((!lungs && !HAS_TRAIT(owner, TRAIT_NOBREATH)) || (lungs && (istype(lungs, /obj/item/organ/lungs/cybernetic))))
|
||||
replace_lungs(lungs)
|
||||
return
|
||||
|
||||
var/obj/item/organ/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES)
|
||||
if(!eyes || (eyes && ((HAS_TRAIT_FROM(owner, TRAIT_NEARSIGHT, EYE_DAMAGE)) || (HAS_TRAIT_FROM(owner, TRAIT_BLIND, EYE_DAMAGE)) || (istype(eyes, /obj/item/organ/eyes/robotic)))))
|
||||
replace_eyes(eyes)
|
||||
return
|
||||
|
||||
var/obj/item/bodypart/limb
|
||||
var/list/limb_list = list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
|
||||
for(var/zone in limb_list)
|
||||
limb = owner.get_bodypart(zone)
|
||||
if(!limb)
|
||||
replace_limb(zone)
|
||||
return
|
||||
if((limb.get_damage() >= (limb.max_damage / 2)) || (limb.status == BODYPART_ROBOTIC))
|
||||
replace_limb(zone, limb)
|
||||
return
|
||||
|
||||
if(owner.getToxLoss() > 40)
|
||||
replace_blood()
|
||||
return
|
||||
var/tox_amount = 0
|
||||
for(var/datum/reagent/toxin/T in owner.reagents.reagent_list)
|
||||
tox_amount += owner.reagents.get_reagent_amount(T.type)
|
||||
if(tox_amount > 10)
|
||||
replace_blood()
|
||||
return
|
||||
if(owner.blood_volume < BLOOD_VOLUME_OKAY)
|
||||
owner.blood_volume = BLOOD_VOLUME_NORMAL
|
||||
to_chat(owner, "<span class='warning'>You feel your blood pulsing within you.</span>")
|
||||
return
|
||||
|
||||
var/obj/item/bodypart/chest/chest = owner.get_bodypart(BODY_ZONE_CHEST)
|
||||
if((chest.get_damage() >= (chest.max_damage / 4)) || (chest.status == BODYPART_ROBOTIC))
|
||||
replace_chest(chest)
|
||||
return
|
||||
|
||||
/obj/item/organ/heart/gland/heal/proc/reject_implant(obj/item/organ/cyberimp/implant)
|
||||
owner.visible_message("<span class='warning'>[owner] vomits up his [implant.name]!</span>", "<span class='userdanger'>You suddenly vomit up your [implant.name]!</span>")
|
||||
owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE)
|
||||
implant.Remove(owner)
|
||||
implant.forceMove(owner.drop_location())
|
||||
|
||||
/obj/item/organ/heart/gland/heal/proc/replace_liver(obj/item/organ/liver/liver)
|
||||
if(liver)
|
||||
owner.visible_message("<span class='warning'>[owner] vomits up his [liver.name]!</span>", "<span class='userdanger'>You suddenly vomit up your [liver.name]!</span>")
|
||||
owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE)
|
||||
liver.Remove(owner)
|
||||
liver.forceMove(owner.drop_location())
|
||||
else
|
||||
to_chat(owner, "<span class='warning'>You feel a weird rumble in your bowels...</span>")
|
||||
|
||||
var/liver_type = /obj/item/organ/liver
|
||||
if(owner?.dna?.species?.mutantliver)
|
||||
liver_type = owner.dna.species.mutantliver
|
||||
var/obj/item/organ/liver/new_liver = new liver_type()
|
||||
new_liver.Insert(owner)
|
||||
|
||||
/obj/item/organ/heart/gland/heal/proc/replace_lungs(obj/item/organ/lungs/lungs)
|
||||
if(lungs)
|
||||
owner.visible_message("<span class='warning'>[owner] vomits up his [lungs.name]!</span>", "<span class='userdanger'>You suddenly vomit up your [lungs.name]!</span>")
|
||||
owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE)
|
||||
lungs.Remove(owner)
|
||||
lungs.forceMove(owner.drop_location())
|
||||
else
|
||||
to_chat(owner, "<span class='warning'>You feel a weird rumble inside your chest...</span>")
|
||||
|
||||
var/lung_type = /obj/item/organ/lungs
|
||||
if(owner.dna.species && owner.dna.species.mutantlungs)
|
||||
lung_type = owner.dna.species.mutantlungs
|
||||
var/obj/item/organ/lungs/new_lungs = new lung_type()
|
||||
new_lungs.Insert(owner)
|
||||
|
||||
/obj/item/organ/heart/gland/heal/proc/replace_eyes(obj/item/organ/eyes/eyes)
|
||||
if(eyes)
|
||||
owner.visible_message("<span class='warning'>[owner]'s [eyes.name] fall out of their sockets!</span>", "<span class='userdanger'>Your [eyes.name] fall out of their sockets!</span>")
|
||||
playsound(owner, 'sound/effects/splat.ogg', 50, TRUE)
|
||||
eyes.Remove(owner)
|
||||
eyes.forceMove(owner.drop_location())
|
||||
else
|
||||
to_chat(owner, "<span class='warning'>You feel a weird rumble behind your eye sockets...</span>")
|
||||
|
||||
addtimer(CALLBACK(src, .proc/finish_replace_eyes), rand(100, 200))
|
||||
|
||||
/obj/item/organ/heart/gland/heal/proc/finish_replace_eyes()
|
||||
var/eye_type = /obj/item/organ/eyes
|
||||
if(owner.dna.species && owner.dna.species.mutanteyes)
|
||||
eye_type = owner.dna.species.mutanteyes
|
||||
var/obj/item/organ/eyes/new_eyes = new eye_type()
|
||||
new_eyes.Insert(owner)
|
||||
owner.visible_message("<span class='warning'>A pair of new eyes suddenly inflates into [owner]'s eye sockets!</span>", "<span class='userdanger'>A pair of new eyes suddenly inflates into your eye sockets!</span>")
|
||||
|
||||
/obj/item/organ/heart/gland/heal/proc/replace_limb(body_zone, obj/item/bodypart/limb)
|
||||
if(limb)
|
||||
owner.visible_message("<span class='warning'>[owner]'s [limb.name] suddenly detaches from [owner.p_their()] body!</span>", "<span class='userdanger'>Your [limb.name] suddenly detaches from your body!</span>")
|
||||
playsound(owner, "desceration", 50, TRUE, -1)
|
||||
limb.drop_limb()
|
||||
else
|
||||
to_chat(owner, "<span class='warning'>You feel a weird tingle in your [parse_zone(body_zone)]... even if you don't have one.</span>")
|
||||
|
||||
addtimer(CALLBACK(src, .proc/finish_replace_limb, body_zone), rand(150, 300))
|
||||
|
||||
/obj/item/organ/heart/gland/heal/proc/finish_replace_limb(body_zone)
|
||||
owner.visible_message("<span class='warning'>With a loud snap, [owner]'s [parse_zone(body_zone)] rapidly grows back from [owner.p_their()] body!</span>",
|
||||
"<span class='userdanger'>With a loud snap, your [parse_zone(body_zone)] rapidly grows back from your body!</span>",
|
||||
"<span class='warning'>Your hear a loud snap.</span>")
|
||||
playsound(owner, 'sound/magic/demon_consume.ogg', 50, TRUE)
|
||||
owner.regenerate_limb(body_zone)
|
||||
|
||||
/obj/item/organ/heart/gland/heal/proc/replace_blood()
|
||||
owner.visible_message("<span class='warning'>[owner] starts vomiting huge amounts of blood!</span>", "<span class='userdanger'>You suddenly start vomiting huge amounts of blood!</span>")
|
||||
keep_replacing_blood()
|
||||
|
||||
/obj/item/organ/heart/gland/heal/proc/keep_replacing_blood()
|
||||
var/keep_going = FALSE
|
||||
owner.vomit(0, TRUE, FALSE, 3, FALSE, FALSE, FALSE, TRUE)
|
||||
owner.Stun(15)
|
||||
owner.adjustToxLoss(-15, TRUE, TRUE)
|
||||
|
||||
owner.blood_volume = min(BLOOD_VOLUME_NORMAL, owner.blood_volume + 20)
|
||||
if(owner.blood_volume < BLOOD_VOLUME_NORMAL)
|
||||
keep_going = TRUE
|
||||
|
||||
if(owner.getToxLoss())
|
||||
keep_going = TRUE
|
||||
for(var/datum/reagent/toxin/R in owner.reagents.reagent_list)
|
||||
owner.reagents.remove_reagent(R.type, 4)
|
||||
if(owner.reagents.has_reagent(R.type))
|
||||
keep_going = TRUE
|
||||
if(keep_going)
|
||||
addtimer(CALLBACK(src, .proc/keep_replacing_blood), 30)
|
||||
|
||||
/obj/item/organ/heart/gland/heal/proc/replace_chest(obj/item/bodypart/chest/chest)
|
||||
if(chest.status == BODYPART_ROBOTIC)
|
||||
owner.visible_message("<span class='warning'>[owner]'s [chest.name] rapidly expels its mechanical components, replacing them with flesh!</span>", "<span class='userdanger'>Your [chest.name] rapidly expels its mechanical components, replacing them with flesh!</span>")
|
||||
playsound(owner, 'sound/magic/clockwork/anima_fragment_attack.ogg', 50, TRUE)
|
||||
var/list/dirs = GLOB.alldirs.Copy()
|
||||
for(var/i in 1 to 3)
|
||||
var/obj/effect/decal/cleanable/robot_debris/debris = new(get_turf(owner))
|
||||
debris.streak(dirs)
|
||||
else
|
||||
owner.visible_message("<span class='warning'>[owner]'s [chest.name] sheds off its damaged flesh, rapidly replacing it!</span>", "<span class='warning'>Your [chest.name] sheds off its damaged flesh, rapidly replacing it!</span>")
|
||||
playsound(owner, 'sound/effects/splat.ogg', 50, TRUE)
|
||||
var/list/dirs = GLOB.alldirs.Copy()
|
||||
for(var/i in 1 to 3)
|
||||
var/obj/effect/decal/cleanable/blood/gibs/gibs = new(get_turf(owner))
|
||||
gibs.streak(dirs)
|
||||
|
||||
var/obj/item/bodypart/chest/new_chest = new(null)
|
||||
new_chest.replace_limb(owner, TRUE)
|
||||
qdel(chest)
|
||||
@@ -0,0 +1,64 @@
|
||||
/obj/item/organ/heart/gland/mindshock
|
||||
true_name = "neural crosstalk uninhibitor"
|
||||
cooldown_low = 400
|
||||
cooldown_high = 700
|
||||
uses = -1
|
||||
icon_state = "mindshock"
|
||||
mind_control_uses = 1
|
||||
mind_control_duration = 6000
|
||||
var/list/mob/living/carbon/human/broadcasted_mobs = list()
|
||||
|
||||
/obj/item/organ/heart/gland/mindshock/activate()
|
||||
to_chat(owner, "<span class='notice'>You get a headache.</span>")
|
||||
|
||||
var/turf/T = get_turf(owner)
|
||||
for(var/mob/living/carbon/H in orange(4,T))
|
||||
if(H == owner)
|
||||
continue
|
||||
switch(pick(1,3))
|
||||
if(1)
|
||||
to_chat(H, "<span class='userdanger'>You hear a loud buzz in your head, silencing your thoughts!</span>")
|
||||
H.Stun(50)
|
||||
if(2)
|
||||
to_chat(H, "<span class='warning'>You hear an annoying buzz in your head.</span>")
|
||||
H.confused += 15
|
||||
H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 160)
|
||||
if(3)
|
||||
H.hallucination += 60
|
||||
|
||||
/obj/item/organ/heart/gland/mindshock/mind_control(command, mob/living/user)
|
||||
if(!ownerCheck() || !mind_control_uses || active_mind_control)
|
||||
return FALSE
|
||||
mind_control_uses--
|
||||
for(var/mob/M in oview(7, owner))
|
||||
if(!ishuman(M))
|
||||
continue
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.stat)
|
||||
continue
|
||||
|
||||
broadcasted_mobs += H
|
||||
to_chat(H, "<span class='userdanger'>You suddenly feel an irresistible compulsion to follow an order...</span>")
|
||||
to_chat(H, "<span class='mind_control'>[command]</span>")
|
||||
|
||||
message_admins("[key_name(user)] broadcasted an abductor mind control message from [key_name(owner)] to [key_name(H)]: [command]")
|
||||
|
||||
var/obj/screen/alert/mind_control/mind_alert = H.throw_alert("mind_control", /obj/screen/alert/mind_control)
|
||||
mind_alert.command = command
|
||||
|
||||
if(LAZYLEN(broadcasted_mobs))
|
||||
active_mind_control = TRUE
|
||||
addtimer(CALLBACK(src, .proc/clear_mind_control), mind_control_duration)
|
||||
|
||||
update_gland_hud()
|
||||
return TRUE
|
||||
|
||||
/obj/item/organ/heart/gland/mindshock/clear_mind_control()
|
||||
if(!active_mind_control || !LAZYLEN(broadcasted_mobs))
|
||||
return FALSE
|
||||
for(var/M in broadcasted_mobs)
|
||||
var/mob/living/carbon/human/H = M
|
||||
to_chat(H, "<span class='userdanger'>You feel the compulsion fade, and you <i>completely forget</i> about your previous orders.</span>")
|
||||
H.clear_alert("mind_control")
|
||||
active_mind_control = FALSE
|
||||
return TRUE
|
||||
@@ -0,0 +1,22 @@
|
||||
/obj/item/organ/heart/gland/plasma
|
||||
true_name = "effluvium sanguine-synonym emitter"
|
||||
cooldown_low = 1200
|
||||
cooldown_high = 1800
|
||||
icon_state = "slime"
|
||||
uses = -1
|
||||
mind_control_uses = 1
|
||||
mind_control_duration = 800
|
||||
|
||||
/obj/item/organ/heart/gland/plasma/activate()
|
||||
to_chat(owner, "<span class='warning'>You feel bloated.</span>")
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, owner, "<span class='userdanger'>A massive stomachache overcomes you.</span>"), 150)
|
||||
addtimer(CALLBACK(src, .proc/vomit_plasma), 200)
|
||||
|
||||
/obj/item/organ/heart/gland/plasma/proc/vomit_plasma()
|
||||
if(!owner)
|
||||
return
|
||||
owner.visible_message("<span class='danger'>[owner] vomits a cloud of plasma!</span>")
|
||||
var/turf/open/T = get_turf(owner)
|
||||
if(istype(T))
|
||||
T.atmos_spawn_air("plasma=50;TEMP=[T20C]")
|
||||
owner.vomit()
|
||||
@@ -0,0 +1,47 @@
|
||||
/obj/item/organ/heart/gland/quantum
|
||||
true_name = "quantic de-observation matrix"
|
||||
cooldown_low = 150
|
||||
cooldown_high = 150
|
||||
uses = -1
|
||||
icon_state = "emp"
|
||||
mind_control_uses = 2
|
||||
mind_control_duration = 1200
|
||||
var/mob/living/carbon/entangled_mob
|
||||
|
||||
/obj/item/organ/heart/gland/quantum/activate()
|
||||
if(entangled_mob)
|
||||
return
|
||||
for(var/mob/M in oview(owner, 7))
|
||||
if(!iscarbon(M))
|
||||
continue
|
||||
entangled_mob = M
|
||||
addtimer(CALLBACK(src, .proc/quantum_swap), rand(600, 2400))
|
||||
return
|
||||
|
||||
/obj/item/organ/heart/gland/quantum/proc/quantum_swap()
|
||||
if(QDELETED(entangled_mob))
|
||||
entangled_mob = null
|
||||
return
|
||||
var/turf/T = get_turf(owner)
|
||||
do_teleport(owner, get_turf(entangled_mob),null,TRUE,channel = TELEPORT_CHANNEL_QUANTUM)
|
||||
do_teleport(entangled_mob, T,null,TRUE,channel = TELEPORT_CHANNEL_QUANTUM)
|
||||
to_chat(owner, "<span class='warning'>You suddenly find yourself somewhere else!</span>")
|
||||
to_chat(entangled_mob, "<span class='warning'>You suddenly find yourself somewhere else!</span>")
|
||||
if(!active_mind_control) //Do not reset entangled mob while mind control is active
|
||||
entangled_mob = null
|
||||
|
||||
/obj/item/organ/heart/gland/quantum/mind_control(command, mob/living/user)
|
||||
if(..())
|
||||
if(entangled_mob && ishuman(entangled_mob) && (entangled_mob.stat < DEAD))
|
||||
to_chat(entangled_mob, "<span class='userdanger'>You suddenly feel an irresistible compulsion to follow an order...</span>")
|
||||
to_chat(entangled_mob, "<span class='mind_control'>[command]</span>")
|
||||
var/obj/screen/alert/mind_control/mind_alert = entangled_mob.throw_alert("mind_control", /obj/screen/alert/mind_control)
|
||||
mind_alert.command = command
|
||||
message_admins("[key_name(owner)] mirrored an abductor mind control message to [key_name(entangled_mob)]: [command]")
|
||||
update_gland_hud()
|
||||
|
||||
/obj/item/organ/heart/gland/quantum/clear_mind_control()
|
||||
if(active_mind_control)
|
||||
to_chat(entangled_mob, "<span class='userdanger'>You feel the compulsion fade, and you completely forget about your previous orders.</span>")
|
||||
entangled_mob.clear_alert("mind_control")
|
||||
..()
|
||||
@@ -0,0 +1,21 @@
|
||||
/obj/item/organ/heart/gland/slime
|
||||
true_name = "gastric animation galvanizer"
|
||||
cooldown_low = 600
|
||||
cooldown_high = 1200
|
||||
uses = -1
|
||||
icon_state = "slime"
|
||||
mind_control_uses = 1
|
||||
mind_control_duration = 2400
|
||||
|
||||
/obj/item/organ/heart/gland/slime/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE)
|
||||
..()
|
||||
owner.faction |= "slime"
|
||||
owner.grant_language(/datum/language/slime)
|
||||
|
||||
/obj/item/organ/heart/gland/slime/activate()
|
||||
to_chat(owner, "<span class='warning'>You feel nauseated!</span>")
|
||||
owner.vomit(20)
|
||||
|
||||
var/mob/living/simple_animal/slime/Slime = new(get_turf(owner), "grey")
|
||||
Slime.Friends = list(owner)
|
||||
Slime.Leader = owner
|
||||
@@ -0,0 +1,14 @@
|
||||
/obj/item/organ/heart/gland/spiderman
|
||||
true_name = "araneae cloister accelerator"
|
||||
cooldown_low = 450
|
||||
cooldown_high = 900
|
||||
uses = -1
|
||||
icon_state = "spider"
|
||||
mind_control_uses = 2
|
||||
mind_control_duration = 2400
|
||||
|
||||
/obj/item/organ/heart/gland/spiderman/activate()
|
||||
to_chat(owner, "<span class='warning'>You feel something crawling in your skin.</span>")
|
||||
owner.faction |= "spiders"
|
||||
var/obj/structure/spider/spiderling/S = new(owner.drop_location())
|
||||
S.directive = "Protect your nest inside [owner.real_name]."
|
||||
@@ -0,0 +1,15 @@
|
||||
/obj/item/organ/heart/gland/transform
|
||||
true_name = "anthropmorphic transmorphosizer"
|
||||
cooldown_low = 900
|
||||
cooldown_high = 1800
|
||||
uses = -1
|
||||
human_only = TRUE
|
||||
icon_state = "species"
|
||||
mind_control_uses = 7
|
||||
mind_control_duration = 300
|
||||
|
||||
/obj/item/organ/heart/gland/transform/activate()
|
||||
to_chat(owner, "<span class='notice'>You feel unlike yourself.</span>")
|
||||
randomize_human(owner)
|
||||
var/species = pick(list(/datum/species/human, /datum/species/lizard, /datum/species/insect, /datum/species/fly))
|
||||
owner.set_species(species)
|
||||
@@ -0,0 +1,18 @@
|
||||
/obj/item/organ/heart/gland/trauma
|
||||
true_name = "white matter randomiser"
|
||||
cooldown_low = 800
|
||||
cooldown_high = 1200
|
||||
uses = 5
|
||||
icon_state = "emp"
|
||||
mind_control_uses = 3
|
||||
mind_control_duration = 1800
|
||||
|
||||
/obj/item/organ/heart/gland/trauma/activate()
|
||||
to_chat(owner, "<span class='warning'>You feel a spike of pain in your head.</span>")
|
||||
if(prob(33))
|
||||
owner.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY))
|
||||
else
|
||||
if(prob(20))
|
||||
owner.gain_trauma_type(BRAIN_TRAUMA_SEVERE, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY))
|
||||
else
|
||||
owner.gain_trauma_type(BRAIN_TRAUMA_MILD, rand(TRAUMA_RESILIENCE_BASIC, TRAUMA_RESILIENCE_LOBOTOMY))
|
||||
@@ -0,0 +1,12 @@
|
||||
/obj/item/organ/heart/gland/ventcrawling
|
||||
true_name = "pliant cartilage enabler"
|
||||
cooldown_low = 1800
|
||||
cooldown_high = 2400
|
||||
uses = 1
|
||||
icon_state = "vent"
|
||||
mind_control_uses = 4
|
||||
mind_control_duration = 1800
|
||||
|
||||
/obj/item/organ/heart/gland/ventcrawling/activate()
|
||||
to_chat(owner, "<span class='notice'>You feel very stretchy.</span>")
|
||||
owner.ventcrawler = VENTCRAWLER_ALWAYS
|
||||
@@ -0,0 +1,34 @@
|
||||
/obj/item/organ/heart/gland/viral
|
||||
true_name = "contamination incubator"
|
||||
cooldown_low = 1800
|
||||
cooldown_high = 2400
|
||||
uses = 1
|
||||
icon_state = "viral"
|
||||
mind_control_uses = 1
|
||||
mind_control_duration = 1800
|
||||
|
||||
/obj/item/organ/heart/gland/viral/activate()
|
||||
to_chat(owner, "<span class='warning'>You feel sick.</span>")
|
||||
var/datum/disease/advance/A = random_virus(pick(2,6),6)
|
||||
A.carrier = TRUE
|
||||
owner.ForceContractDisease(A, FALSE, TRUE)
|
||||
|
||||
/obj/item/organ/heart/gland/viral/proc/random_virus(max_symptoms, max_level)
|
||||
if(max_symptoms > VIRUS_SYMPTOM_LIMIT)
|
||||
max_symptoms = VIRUS_SYMPTOM_LIMIT
|
||||
var/datum/disease/advance/A = new /datum/disease/advance()
|
||||
var/list/datum/symptom/possible_symptoms = list()
|
||||
for(var/symptom in subtypesof(/datum/symptom))
|
||||
var/datum/symptom/S = symptom
|
||||
if(initial(S.level) > max_level)
|
||||
continue
|
||||
if(initial(S.level) <= 0) //unobtainable symptoms
|
||||
continue
|
||||
possible_symptoms += S
|
||||
for(var/i in 1 to max_symptoms)
|
||||
var/datum/symptom/chosen_symptom = pick_n_take(possible_symptoms)
|
||||
if(chosen_symptom)
|
||||
var/datum/symptom/S = new chosen_symptom
|
||||
A.symptoms += S
|
||||
A.Refresh() //just in case someone already made and named the same disease
|
||||
return A
|
||||
@@ -43,12 +43,15 @@
|
||||
dat += "Collected Samples : [points] <br>"
|
||||
dat += "Gear Credits: [credits] <br>"
|
||||
dat += "<b>Transfer data in exchange for supplies:</b><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=baton'>Advanced Baton</A><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=helmet'>Agent Helmet</A><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=vest'>Agent Vest</A><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=silencer'>Radio Silencer</A><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=tool'>Science Tool</A><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=mind_device'>Mental Interface Device</A><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=baton'>Advanced Baton (2 Credits)</A><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=mind_device'>Mental Interface Device (2 Credits)</A><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=chem_dispenser'>Reagent Synthesizer (2 Credits)</A><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=shrink_ray'>Shrink Ray Blaster (2 Credits)</a><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=helmet'>Agent Helmet (1 Credit)</A><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=vest'>Agent Vest (1 Credit)</A><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=silencer'>Radio Silencer (1 Credit)</A><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=tool'>Science Tool (1 Credit)</A><br>"
|
||||
dat += "<a href='?src=[REF(src)];dispense=tongue'>Superlingual Matrix (1 Credit)</a><br>"
|
||||
else
|
||||
dat += "<span class='bad'>NO EXPERIMENT MACHINE DETECTED</span> <br>"
|
||||
|
||||
@@ -101,7 +104,7 @@
|
||||
else if(href_list["dispense"])
|
||||
switch(href_list["dispense"])
|
||||
if("baton")
|
||||
Dispense(/obj/item/abductor_baton,cost=2)
|
||||
Dispense(/obj/item/abductor/baton,cost=2)
|
||||
if("helmet")
|
||||
Dispense(/obj/item/clothing/head/helmet/abductor)
|
||||
if("silencer")
|
||||
@@ -112,6 +115,12 @@
|
||||
Dispense(/obj/item/clothing/suit/armor/abductor/vest)
|
||||
if("mind_device")
|
||||
Dispense(/obj/item/abductor/mind_device,cost=2)
|
||||
if("chem_dispenser")
|
||||
Dispense(/obj/item/abductor_machine_beacon/chem_dispenser,cost=2)
|
||||
if("tongue")
|
||||
Dispense(/obj/item/organ/tongue/abductor)
|
||||
if("shrink_ray")
|
||||
Dispense(/obj/item/gun/energy/shrink_ray,cost=2)
|
||||
updateUsrDialog()
|
||||
|
||||
/obj/machinery/abductor/console/proc/TeleporterRetrieve()
|
||||
@@ -136,9 +145,9 @@
|
||||
|
||||
var/entry_name
|
||||
if(remote)
|
||||
entry_name = show_radial_menu(usr, camera.eyeobj, disguises2)
|
||||
entry_name = show_radial_menu(usr, camera.eyeobj, disguises2, tooltips = TRUE)
|
||||
else
|
||||
entry_name = show_radial_menu(usr, src, disguises2)
|
||||
entry_name = show_radial_menu(usr, src, disguises2, require_near = TRUE, tooltips = TRUE)
|
||||
|
||||
var/datum/icon_snapshot/chosen = disguises[entry_name]
|
||||
if(chosen && vest && (remote || in_range(usr,src)))
|
||||
@@ -236,4 +245,4 @@
|
||||
new item(drop_location)
|
||||
|
||||
else
|
||||
say("Insufficent data!")
|
||||
say("Insufficent data!")
|
||||
@@ -3,6 +3,7 @@
|
||||
icon = 'icons/mob/blob.dmi'
|
||||
icon_state = "blob_shield"
|
||||
desc = "A solid wall of slightly twitching tendrils."
|
||||
var/damaged_desc = "A wall of twitching tendrils."
|
||||
max_integrity = 150
|
||||
brute_resist = 0.25
|
||||
explosion_block = 3
|
||||
@@ -21,10 +22,10 @@
|
||||
|
||||
/obj/structure/blob/shield/update_icon()
|
||||
..()
|
||||
if(obj_integrity <= 70)
|
||||
icon_state = "blob_shield_damaged"
|
||||
name = "weakened strong blob"
|
||||
desc = "A wall of twitching tendrils."
|
||||
if(obj_integrity < max_integrity * 0.5)
|
||||
icon_state = "[initial(icon_state)]_damaged"
|
||||
name = "weakened [initial(name)]"
|
||||
desc = "[damaged_desc]"
|
||||
atmosblock = FALSE
|
||||
if(!weakened)
|
||||
armor = armor.setRating("melee" = 15, "bullet" = 15, "laser" = 5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
|
||||
@@ -37,4 +38,27 @@
|
||||
if(weakened)
|
||||
armor = armor.setRating("melee" = 25, "bullet" = 25, "laser" = 15, "energy" = 10, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90)
|
||||
weakened = FALSE
|
||||
air_update_turf(1)
|
||||
air_update_turf(1)
|
||||
|
||||
/obj/structure/blob/shield/reflective
|
||||
name = "reflective blob"
|
||||
desc = "A solid wall of slightly twitching tendrils with a reflective glow."
|
||||
damaged_desc = "A wall of twitching tendrils with a reflective glow."
|
||||
icon_state = "blob_glow"
|
||||
flags_1 = CHECK_RICOCHET_1
|
||||
point_return = 8
|
||||
max_integrity = 50
|
||||
brute_resist = 1
|
||||
explosion_block = 2
|
||||
|
||||
/obj/structure/blob/shield/reflective/handle_ricochet(obj/item/projectile/P)
|
||||
var/turf/p_turf = get_turf(P)
|
||||
var/face_direction = get_dir(src, p_turf)
|
||||
var/face_angle = dir2angle(face_direction)
|
||||
var/incidence_s = GET_ANGLE_OF_INCIDENCE(face_angle, (P.Angle + 180))
|
||||
if(abs(incidence_s) > 90 && abs(incidence_s) < 270)
|
||||
return FALSE
|
||||
var/new_angle_s = SIMPLIFY_DEGREES(face_angle + incidence_s)
|
||||
P.setAngle(new_angle_s)
|
||||
visible_message("<span class='warning'>[P] reflects off [src]!</span>")
|
||||
return TRUE
|
||||
@@ -113,12 +113,22 @@
|
||||
|
||||
/mob/camera/blob/verb/create_shield_power()
|
||||
set category = "Blob"
|
||||
set name = "Create Shield Blob (15)"
|
||||
set desc = "Create a shield blob, which will block fire and is hard to kill."
|
||||
set name = "Create/Upgrade Shield Blob (15)"
|
||||
set desc = "Create a shield blob, which will block fire and is hard to kill. Using this on an existing shield blob turns it into a reflective blob, capable of reflecting most projectiles but making it much weaker than usual to brute attacks."
|
||||
create_shield()
|
||||
|
||||
/mob/camera/blob/proc/create_shield(turf/T)
|
||||
createSpecial(15, /obj/structure/blob/shield, 0, 0, T)
|
||||
var/obj/structure/blob/shield/S = locate(/obj/structure/blob/shield) in T
|
||||
if(S)
|
||||
if(!can_buy(15))
|
||||
return
|
||||
if(S.obj_integrity < S.max_integrity * 0.5)
|
||||
to_chat(src, "<span class='warning'>This shield blob is too damaged to be modified properly!</span>")
|
||||
return
|
||||
to_chat(src, "<span class='warning'>You secrete a reflective ooze over the shield blob, allowing it to reflect projectiles at the cost of reduced intregrity.</span>")
|
||||
S.change_to(/obj/structure/blob/shield/reflective, src)
|
||||
else
|
||||
createSpecial(15, /obj/structure/blob/shield, 0, 0, T)
|
||||
|
||||
/mob/camera/blob/verb/create_resource()
|
||||
set category = "Blob"
|
||||
@@ -359,7 +369,7 @@
|
||||
to_chat(src, "<b>You can expand, which will attack people, damage objects, or place a Normal Blob if the tile is clear.</b>")
|
||||
to_chat(src, "<i>Normal Blobs</i> will expand your reach and can be upgraded into special blobs that perform certain functions.")
|
||||
to_chat(src, "<b>You can upgrade normal blobs into the following types of blob:</b>")
|
||||
to_chat(src, "<i>Shield Blobs</i> are strong and expensive blobs which take more damage. In additon, they are fireproof and can block air, use these to protect yourself from station fires.")
|
||||
to_chat(src, "<i>Shield Blobs</i> are strong and expensive blobs which take more damage. In additon, they are fireproof and can block air, use these to protect yourself from station fires. Upgrading them again will result in a reflective blob, capable of reflecting most projectiles at the cost of the strong blob's extra health.")
|
||||
to_chat(src, "<i>Resource Blobs</i> are blobs which produce more resources for you, build as many of these as possible to consume the station. This type of blob must be placed near node blobs or your core to work.")
|
||||
to_chat(src, "<i>Factory Blobs</i> are blobs that spawn blob spores which will attack nearby enemies. This type of blob must be placed near node blobs or your core to work.")
|
||||
to_chat(src, "<i>Blobbernauts</i> can be produced from factories for a cost, and are hard to kill, powerful, and moderately smart. The factory used to create one will become fragile and briefly unable to produce spores.")
|
||||
|
||||
@@ -128,7 +128,7 @@
|
||||
|
||||
/mob/living/carbon/human/ShowAsPaleExamine()
|
||||
// Check for albino, as per human/examine.dm's check.
|
||||
if(skin_tone == "albino")
|
||||
if(dna.species.use_skintones && skin_tone == "albino")
|
||||
return TRUE
|
||||
|
||||
return ..() // Return vamp check
|
||||
|
||||
@@ -183,7 +183,7 @@
|
||||
BuyPower(new /datum/action/bloodsucker/masquerade)
|
||||
BuyPower(new /datum/action/bloodsucker/veil)
|
||||
// Traits
|
||||
for (var/T in defaultTraits)
|
||||
for(var/T in defaultTraits)
|
||||
ADD_TRAIT(owner.current, T, "bloodsucker")
|
||||
if(HAS_TRAIT(owner.current, TRAIT_TOXINLOVER)) //No slime bonuses here, no thank you
|
||||
had_toxlover = TRUE
|
||||
@@ -200,10 +200,10 @@
|
||||
var/mob/living/carbon/human/H = owner.current
|
||||
var/datum/species/S = H.dna.species
|
||||
// Make Changes
|
||||
S.brutemod *= 0.5 // <-------------------- Start small, but burn mod increases based on rank!
|
||||
S.coldmod = 0
|
||||
S.stunmod *= 0.25
|
||||
S.siemens_coeff *= 0.75 //base electrocution coefficient 1
|
||||
H.physiology.brute_mod *= 0.8 // <-------------------- Start small, but burn mod increases based on rank!
|
||||
H.physiology.cold_mod = 0
|
||||
H.physiology.stun_mod *= 0.35
|
||||
H.physiology.siemens_coeff *= 0.75 //base electrocution coefficient 1
|
||||
//S.heatmod += 0.5 // Heat shouldn't affect. Only Fire.
|
||||
//S.punchstunthreshold = 8 //damage at which punches from this race will stun 9
|
||||
S.punchdamagelow += 1 //lowest possible punch damage 0
|
||||
@@ -319,12 +319,10 @@ datum/antagonist/bloodsucker/proc/SpendRank()
|
||||
if(ishuman(owner.current))
|
||||
var/mob/living/carbon/human/H = owner.current
|
||||
var/datum/species/S = H.dna.species
|
||||
S.burnmod *= 0.025 // Slightly more burn damage
|
||||
S.stunmod *= 0.95 // Slightly less stun time.
|
||||
S.punchdamagelow += 0.5
|
||||
S.punchdamagehigh += 0.5 // NOTE: This affects the hitting power of Brawn.
|
||||
// More Health
|
||||
owner.current.setMaxHealth(owner.current.maxHealth + 5)
|
||||
owner.current.setMaxHealth(owner.current.maxHealth + 10)
|
||||
// Vamp Stats
|
||||
regenRate += 0.05 // Points of brute healed (starts at 0.3)
|
||||
feedAmount += 2 // Increase how quickly I munch down vics (15)
|
||||
|
||||
@@ -275,7 +275,7 @@
|
||||
// All done!
|
||||
if(convert_progress <= 0)
|
||||
// FAIL: Can't be Vassal
|
||||
if(!SSticker.mode.can_make_vassal(target, user, display_warning=FALSE) && HAS_TRAIT(target, TRAIT_MINDSHIELD)) // If I'm an unconvertable Antag ONLY
|
||||
if(!SSticker.mode.can_make_vassal(target, user, display_warning=FALSE) || HAS_TRAIT(target, TRAIT_MINDSHIELD)) // If I'm an unconvertable Antag ONLY
|
||||
to_chat(user, "<span class='danger'>[target] doesn't respond to your persuasion. It doesn't appear they can be converted to follow you, they either have a mindshield or their external loyalties are too difficult for you to break.<i>\[ALT+click to release\]</span>")
|
||||
convert_progress ++ // Pop it back up some. Avoids wasting Blood on a lost cause.
|
||||
// SUCCESS: All done!
|
||||
|
||||
@@ -77,13 +77,16 @@
|
||||
for(var/mob/living/M in viewers(5, src))
|
||||
if(!is_servant_of_ratvar(M) && M != L)
|
||||
M.flash_act()
|
||||
if(iscultist(L))
|
||||
if(iscultist(L)) //No longer stuns cultists, instead sets them on fire and burns them
|
||||
to_chat(L, "<span class='heavy_brass'>\"Watch your step, wretch.\"</span>")
|
||||
L.adjustBruteLoss(10)
|
||||
L.Knockdown(80, FALSE)
|
||||
L.adjustFireLoss(10)
|
||||
L.Knockdown(20, FALSE)
|
||||
L.adjust_fire_stacks(5) //Burn!
|
||||
L.IgniteMob()
|
||||
else
|
||||
L.Stun(40)
|
||||
L.visible_message("<span class='warning'>[src] appears around [L] in a burst of light!</span>", \
|
||||
"<span class='userdanger'>[target_flashed ? "An unseen force":"The glowing sigil around you"] holds you in place!</span>")
|
||||
L.Stun(40)
|
||||
"<span class='userdanger'>[target_flashed ? "An unseen force":"The glowing sigil around you"] [iscultist(L) ? "painfully bursts into flames!" : "holds you in place!"]</span>")
|
||||
L.apply_status_effect(STATUS_EFFECT_BELLIGERENT)
|
||||
new /obj/effect/temp_visual/ratvar/sigil/transgression(get_turf(src))
|
||||
qdel(src)
|
||||
|
||||
@@ -345,3 +345,8 @@
|
||||
if(!power_amount)
|
||||
power_amount = -(CLOCKCULT_POWER_UNIT*0.02)
|
||||
return ..()
|
||||
|
||||
|
||||
// Winter coat
|
||||
/obj/item/clothing/suit/hooded/wintercoat/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) //four sheets of metal
|
||||
return list("operation_time" = 30, "new_obj_type" = /obj/item/clothing/suit/hooded/wintercoat/ratvar, "power_cost" = POWER_METAL * 4, "spawn_dir" = SOUTH)
|
||||
|
||||
@@ -193,15 +193,26 @@
|
||||
L.visible_message("<span class='warning'>[L]'s eyes flare with dim light!</span>")
|
||||
playsound(L, 'sound/weapons/sear.ogg', 50, TRUE)
|
||||
else
|
||||
L.visible_message("<span class='warning'>[L]'s eyes blaze with brilliant light!</span>", \
|
||||
"<span class='userdanger'>Your vision suddenly screams with white-hot light!</span>")
|
||||
L.Knockdown(15, TRUE, FALSE, 15)
|
||||
L.apply_status_effect(STATUS_EFFECT_KINDLE)
|
||||
L.flash_act(1, 1)
|
||||
if(issilicon(target))
|
||||
var/mob/living/silicon/S = L
|
||||
S.emp_act(EMP_HEAVY)
|
||||
if(iscultist(L))
|
||||
if(!iscultist(L))
|
||||
L.visible_message("<span class='warning'>[L]'s eyes blaze with brilliant light!</span>", \
|
||||
"<span class='userdanger'>Your vision suddenly screams with white-hot light!</span>")
|
||||
L.Knockdown(15, TRUE, FALSE, 15)
|
||||
L.apply_status_effect(STATUS_EFFECT_KINDLE)
|
||||
L.flash_act(1, 1)
|
||||
if(issilicon(target))
|
||||
var/mob/living/silicon/S = L
|
||||
S.emp_act(EMP_HEAVY)
|
||||
else //for Nar'sian weaklings
|
||||
to_chat(L, "<span class='heavy_brass'>\"How does it feel to see the light, dog?\"</span>")
|
||||
L.visible_message("<span class='warning'>[L]'s eyes flare with burning light!</span>", \
|
||||
"<span class='userdanger'>Your vision suddenly screams with a flash of burning hot light!</span>") //Debuffs Narsian cultists hard + deals some burn instead of just hardstunning them; Only the confusion part can stack
|
||||
L.flash_act(1,1)
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/C = L
|
||||
C.stuttering = max(8, C.stuttering)
|
||||
C.drowsyness = max(8, C.drowsyness)
|
||||
C.confused += CLAMP(16 - C.confused, 0, 8)
|
||||
C.apply_status_effect(STATUS_EFFECT_BELLIGERENT)
|
||||
L.adjustFireLoss(15)
|
||||
..()
|
||||
|
||||
|
||||
@@ -56,8 +56,14 @@
|
||||
L.visible_message("<span class='warning'>[src] bounces off of [L], as if repelled by an unseen force!</span>")
|
||||
else if(!..())
|
||||
if(!L.anti_magic_check())
|
||||
if(issilicon(L) || iscultist(L))
|
||||
if(issilicon(L))
|
||||
L.Knockdown(100)
|
||||
else if(iscultist(L))
|
||||
L.confused += CLAMP(10 - L.confused, 0, 5) // Spearthrow now confuses enemy cultists + just deals extra damage / sets on fire instead of hardstunning + damage
|
||||
to_chat(L, "<span class ='userdanger'>[src] crashes into you with burning force, sending you reeling!</span>")
|
||||
L.adjust_fire_stacks(2)
|
||||
L.Knockdown(1)
|
||||
L.IgniteMob()
|
||||
else
|
||||
L.Knockdown(40)
|
||||
GLOB.clockwork_vitality += L.adjustFireLoss(bonus_burn * 3) //normally a total of 40 damage, 70 with ratvar
|
||||
|
||||
@@ -139,7 +139,7 @@
|
||||
var/new_thing_type = fabrication_values["new_obj_type"]
|
||||
if(isturf(target)) //if our target is a turf, we're just going to ChangeTurf it and assume it'll work out.
|
||||
var/turf/T = target
|
||||
T.ChangeTurf(new_thing_type)
|
||||
T.ChangeTurf(new_thing_type, flags = CHANGETURF_INHERIT_AIR)
|
||||
else
|
||||
if(new_thing_type)
|
||||
if(fabrication_values["dir_in_new"])
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
#define MARAUDER_SLOWDOWN_PERCENTAGE 0.40 //Below this percentage of health, marauders will become slower
|
||||
#define MARAUDER_SHIELD_REGEN_TIME 200 //In deciseconds, how long it takes for shields to regenerate after breaking
|
||||
#define MARAUDER_SPACE_FULL_DAMAGE 6 //amount of damage per life tick while inside space
|
||||
#define MARAUDER_SPACE_NEAR_DAMAGE 4 //amount of damage taking per Life() tick from being next to space.
|
||||
|
||||
//Clockwork marauder: A well-rounded frontline construct. Only one can exist for every two human servants.
|
||||
/mob/living/simple_animal/hostile/clockwork/marauder
|
||||
@@ -20,12 +22,14 @@
|
||||
movement_type = FLYING
|
||||
a_intent = INTENT_HARM
|
||||
loot = list(/obj/item/clockwork/component/geis_capacitor/fallen_armor)
|
||||
light_range = 2
|
||||
light_power = 1.1
|
||||
light_range = 3
|
||||
light_power = 1.7
|
||||
playstyle_string = "<span class='big bold'><span class='neovgre'>You are a clockwork marauder,</span></span><b> a well-rounded frontline construct of Ratvar. Although you have no \
|
||||
unique abilities, you're a fearsome fighter in one-on-one combat, and your shield protects from projectiles!<br><br>Obey the Servants and do as they \
|
||||
tell you. Your primary goal is to defend the Ark from destruction; they are your allies in this, and should be protected from harm.</b>"
|
||||
tell you. Your primary goal is to defend the Ark from destruction; they are your allies in this, and should be protected from harm.</b> \
|
||||
<span class='danger big'>Be warned, however, that you will rapidly decay near the void of space.</span>"
|
||||
empower_string = "<span class='neovgre'>The Anima Bulwark's power flows through you! Your weapon will strike harder, your armor is sturdier, and your shield is more durable.</span>"
|
||||
var/default_speed = 0
|
||||
var/max_shield_health = 3
|
||||
var/shield_health = 3 //Amount of projectiles that can be deflected within
|
||||
var/shield_health_regen = 0 //When world.time equals this, shield health will regenerate
|
||||
@@ -36,10 +40,21 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/clockwork/marauder/Life()
|
||||
..()
|
||||
var/turf/T = get_turf(src)
|
||||
var/turf/open/space/S = isspaceturf(T)? T : null
|
||||
var/less_space_damage
|
||||
if(!istype(S))
|
||||
var/turf/open/space/nearS = locate() in oview(1)
|
||||
if(nearS)
|
||||
S = nearS
|
||||
less_space_damage = TRUE
|
||||
if(S)
|
||||
to_chat(src, "<span class='userdanger'>The void of space drains Ratvar's Light from you! You feel yourself rapidly decaying. It would be wise to get back inside!</span>")
|
||||
adjustBruteLoss(less_space_damage? MARAUDER_SPACE_NEAR_DAMAGE : MARAUDER_SPACE_FULL_DAMAGE)
|
||||
if(!GLOB.ratvar_awakens && health / maxHealth <= MARAUDER_SLOWDOWN_PERCENTAGE)
|
||||
speed = initial(speed) + 1 //Yes, this slows them down
|
||||
speed = default_speed + 1 //Yes, this slows them down
|
||||
else
|
||||
speed = initial(speed)
|
||||
speed = default_speed
|
||||
if(shield_health < max_shield_health && world.time >= shield_health_regen)
|
||||
shield_health_regen = world.time + MARAUDER_SHIELD_REGEN_TIME
|
||||
to_chat(src, "<span class='neovgre'>Your shield has recovered, <b>[shield_health]</b> blocks remaining!</span>")
|
||||
|
||||
@@ -87,9 +87,22 @@
|
||||
object_path = /obj/item/clockwork/construct_chassis/clockwork_marauder
|
||||
construct_type = /mob/living/simple_animal/hostile/clockwork/marauder
|
||||
combat_construct = TRUE
|
||||
var/static/recent_marauders = 0
|
||||
var/static/time_since_last_marauder = 0
|
||||
var/static/scaled_recital_time = 0
|
||||
var/static/last_marauder = 0
|
||||
|
||||
/datum/clockwork_scripture/create_object/construct/clockwork_marauder/post_recital()
|
||||
last_marauder = world.time
|
||||
return ..()
|
||||
|
||||
/datum/clockwork_scripture/create_object/construct/clockwork_marauder/pre_recital()
|
||||
if(!is_reebe(invoker.z))
|
||||
if(!CONFIG_GET(flag/allow_clockwork_marauder_on_station))
|
||||
to_chat(invoker, "<span class='brass'>This particular station is too far from the influence of the Hierophant Network. You can not summon a marauder here.</span>")
|
||||
return FALSE
|
||||
if(world.time < (last_marauder + CONFIG_GET(number/marauder_delay_non_reebe)))
|
||||
to_chat(invoker, "<span class='brass'>The hierophant network is still strained from the last summoning of a marauder on a plane without the strong energy connection of Reebe to support it. \
|
||||
You must wait another [DisplayTimeText((last_marauder + CONFIG_GET(number/marauder_delay_non_reebe)) - world.time, TRUE)]!</span>")
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/datum/clockwork_scripture/create_object/construct/clockwork_marauder/update_construct_limit()
|
||||
var/human_servants = 0
|
||||
@@ -98,27 +111,7 @@
|
||||
var/mob/living/L = M.current
|
||||
if(ishuman(L) && L.stat != DEAD)
|
||||
human_servants++
|
||||
construct_limit = round(CLAMP((human_servants / 4), 1, 3)) - recent_marauders //1 per 4 human servants, maximum of 3, reduced by recent marauder creation
|
||||
if(recent_marauders)
|
||||
to_chat(invoker, "<span class='warning'>The Hierophant Network is depleted by a summoning in the last [DisplayTimeText(MARAUDER_SCRIPTURE_SCALING_THRESHOLD, TRUE)] - limiting the number of available marauders by [recent_marauders]!</span>")
|
||||
|
||||
/datum/clockwork_scripture/create_object/construct/clockwork_marauder/pre_recital()
|
||||
channel_time = initial(channel_time)
|
||||
if(recent_marauders)
|
||||
scaled_recital_time = min(recent_marauders * MARAUDER_SCRIPTURE_SCALING_TIME, MARAUDER_SCRIPTURE_SCALING_MAX)
|
||||
to_chat(invoker, "<span class='warning'>The Hierophant Network is under strain from repeated summoning, making this scripture [DisplayTimeText(scaled_recital_time)] slower!</span>")
|
||||
channel_time += scaled_recital_time
|
||||
return TRUE
|
||||
|
||||
/datum/clockwork_scripture/create_object/construct/clockwork_marauder/scripture_effects()
|
||||
. = ..()
|
||||
recent_marauders++
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/marauder_reset),MARAUDER_SCRIPTURE_SCALING_THRESHOLD)
|
||||
|
||||
/proc/marauder_reset()
|
||||
var/datum/clockwork_scripture/create_object/construct/clockwork_marauder/CM = new()
|
||||
CM.recent_marauders--
|
||||
qdel(CM)
|
||||
construct_limit = round(CLAMP((human_servants / 4), 1, 3)) //1 per 4 human servants, maximum of 3
|
||||
|
||||
//Summon Neovgre: Summon a very powerful combat mech that explodes when destroyed for massive damage.
|
||||
/datum/clockwork_scripture/create_object/summon_arbiter
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
if(anchored)
|
||||
T.PlaceOnTop(/turf/closed/wall/clockwork)
|
||||
else
|
||||
T.PlaceOnTop(/turf/open/floor/clockwork)
|
||||
T.PlaceOnTop(/turf/open/floor/clockwork, flags = CHANGETURF_INHERIT_AIR)
|
||||
new /obj/structure/falsewall/brass(T)
|
||||
qdel(src)
|
||||
else
|
||||
|
||||
@@ -438,21 +438,27 @@
|
||||
target.visible_message("<span class='warning'>[L] starts to glow in a halo of light!</span>", \
|
||||
"<span class='userdanger'>A feeling of warmth washes over you, rays of holy light surround your body and protect you from the flash of light!</span>")
|
||||
else
|
||||
to_chat(user, "<span class='cultitalic'>In an brilliant flash of red, [L] falls to the ground!</span>")
|
||||
L.Knockdown(160)
|
||||
L.adjustStaminaLoss(140) //Ensures hard stamcrit
|
||||
L.flash_act(1,1)
|
||||
if(issilicon(target))
|
||||
var/mob/living/silicon/S = L
|
||||
S.emp_act(EMP_HEAVY)
|
||||
else if(iscarbon(target))
|
||||
var/mob/living/carbon/C = L
|
||||
C.silent += 6
|
||||
C.stuttering += 15
|
||||
C.cultslurring += 15
|
||||
C.Jitter(15)
|
||||
if(is_servant_of_ratvar(L))
|
||||
if(!iscultist(L))
|
||||
L.Knockdown(160)
|
||||
L.adjustStaminaLoss(140) //Ensures hard stamcrit
|
||||
L.flash_act(1,1)
|
||||
if(issilicon(target))
|
||||
var/mob/living/silicon/S = L
|
||||
S.emp_act(EMP_HEAVY)
|
||||
else if(iscarbon(target))
|
||||
var/mob/living/carbon/C = L
|
||||
C.silent += CLAMP(12 - C.silent, 0, 6)
|
||||
C.stuttering += CLAMP(30 - C.stuttering, 0, 15)
|
||||
C.cultslurring += CLAMP(30 - C.cultslurring, 0, 15)
|
||||
C.Jitter(15)
|
||||
else // cultstun no longer hardstuns + damages hostile cultists, instead debuffs them hard + deals some damage; debuffs for a bit longer since they don't add the clockie belligerent debuff
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/C = L
|
||||
C.stuttering = max(10, C.stuttering)
|
||||
C.drowsyness = max(10, C.drowsyness)
|
||||
C.confused += CLAMP(20 - C.confused, 0, 10)
|
||||
L.adjustBruteLoss(15)
|
||||
to_chat(user, "<span class='cultitalic'>In an brilliant flash of red, [L] [iscultist(L) ? "writhes in pain" : "falls to the ground!"]</span>")
|
||||
uses--
|
||||
..()
|
||||
|
||||
@@ -579,6 +585,12 @@
|
||||
new /obj/item/stack/sheet/runed_metal(T,quantity)
|
||||
to_chat(user, "<span class='warning'>A dark cloud emanates from you hand and swirls around the plasteel, transforming it into runed metal!</span>")
|
||||
SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25))
|
||||
if(istype(target, /obj/item/clothing/suit/hooded/wintercoat) && target.type != /obj/item/clothing/suit/hooded/wintercoat/narsie)
|
||||
if (do_after(user,30,target=target))
|
||||
new /obj/item/clothing/suit/hooded/wintercoat/narsie(T)
|
||||
qdel(target)
|
||||
to_chat(user, "<span class='warning'>A dark cloud emanates from you hand and swirls around [target], transforming it into a narsian winter coat!</span>")
|
||||
SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25))
|
||||
else if(istype(target,/mob/living/silicon/robot))
|
||||
var/mob/living/silicon/robot/candidate = target
|
||||
if(candidate.mmi)
|
||||
|
||||
@@ -703,7 +703,10 @@
|
||||
else if(!..())
|
||||
if(!L.anti_magic_check())
|
||||
if(is_servant_of_ratvar(L))
|
||||
L.Knockdown(100)
|
||||
to_chat(L, "<span class='cultlarge'>\"Kneel for me, scum\"</span>")
|
||||
L.confused += CLAMP(10 - L.confused, 0, 5) //confuses and lightly knockdowns + damages hostile cultists instead of hardstunning like before
|
||||
L.Knockdown(15)
|
||||
L.adjustBruteLoss(10)
|
||||
else
|
||||
L.Knockdown(50)
|
||||
break_spear(T)
|
||||
|
||||
@@ -239,9 +239,9 @@
|
||||
var/turf/T = safepick(validturfs)
|
||||
if(T)
|
||||
if(istype(T, /turf/open/floor/plating))
|
||||
T.PlaceOnTop(/turf/open/floor/engine/cult)
|
||||
T.PlaceOnTop(/turf/open/floor/engine/cult, flags = CHANGETURF_INHERIT_AIR)
|
||||
else
|
||||
T.ChangeTurf(/turf/open/floor/engine/cult)
|
||||
T.ChangeTurf(/turf/open/floor/engine/cult, flags = CHANGETURF_INHERIT_AIR)
|
||||
else
|
||||
var/turf/open/floor/engine/cult/F = safepick(cultturfs)
|
||||
if(F)
|
||||
|
||||
@@ -34,6 +34,12 @@
|
||||
. = ..()
|
||||
name_source = GLOB.commando_names
|
||||
|
||||
/datum/antagonist/ert/deathsquad/apply_innate_effects(mob/living/mob_override)
|
||||
ADD_TRAIT(owner, TRAIT_DISK_VERIFIER, DEATHSQUAD_TRAIT)
|
||||
|
||||
/datum/antagonist/ert/deathsquad/remove_innate_effects(mob/living/mob_override)
|
||||
REMOVE_TRAIT(owner, TRAIT_DISK_VERIFIER, DEATHSQUAD_TRAIT)
|
||||
|
||||
/datum/antagonist/ert/security // kinda handled by the base template but here for completion
|
||||
|
||||
/datum/antagonist/ert/security/amber
|
||||
|
||||
@@ -5,6 +5,14 @@
|
||||
antagpanel_category = "ClownOp"
|
||||
nukeop_outfit = /datum/outfit/syndicate/clownop
|
||||
|
||||
/datum/antagonist/nukeop/clownop/on_gain()
|
||||
. = ..()
|
||||
ADD_TRAIT(owner, TRAIT_CLOWN_MENTALITY, NUKEOP_ANTAGONIST)
|
||||
|
||||
/datum/antagonist/nukeop/clownop/on_removal()
|
||||
REMOVE_TRAIT(owner, TRAIT_CLOWN_MENTALITY, NUKEOP_ANTAGONIST)
|
||||
return ..()
|
||||
|
||||
/datum/antagonist/nukeop/leader/clownop
|
||||
name = "Clown Operative Leader"
|
||||
roundend_category = "clown operatives"
|
||||
|
||||
@@ -76,9 +76,10 @@ GLOBAL_VAR_INIT(war_declared, FALSE)
|
||||
CONFIG_SET(number/shuttle_refuel_delay, max(CONFIG_GET(number/shuttle_refuel_delay), CHALLENGE_SHUTTLE_DELAY))
|
||||
if(istype(SSticker.mode, /datum/game_mode/dynamic))
|
||||
var/datum/game_mode/dynamic/mode = SSticker.mode
|
||||
var/threat_spent = CONFIG_GET(number/dynamic_warops_cost)
|
||||
mode.spend_threat(threat_spent)
|
||||
mode.log_threat("Nuke ops spent [threat_spent] on war ops.")
|
||||
if(!(mode.storyteller.flags & WAROPS_ALWAYS_ALLOWED))
|
||||
var/threat_spent = CONFIG_GET(number/dynamic_warops_cost)
|
||||
mode.spend_threat(threat_spent)
|
||||
mode.log_threat("Nuke ops spent [threat_spent] on war ops.")
|
||||
SSblackbox.record_feedback("amount", "nuclear_challenge_mode", 1)
|
||||
|
||||
qdel(src)
|
||||
@@ -101,12 +102,13 @@ GLOBAL_VAR_INIT(war_declared, FALSE)
|
||||
return FALSE
|
||||
if(istype(SSticker.mode, /datum/game_mode/dynamic))
|
||||
var/datum/game_mode/dynamic/mode = SSticker.mode
|
||||
if(mode.threat_level < CONFIG_GET(number/dynamic_warops_requirement))
|
||||
to_chat(user, "Due to the dynamic space in which the station resides, you are too deep into Nanotrasen territory to reasonably go loud.")
|
||||
return FALSE
|
||||
else if(mode.threat < CONFIG_GET(number/dynamic_warops_cost))
|
||||
to_chat(user, "Due to recent threats on the station, Nanotrasen is looking too closely for a war declaration to be wise.")
|
||||
return FALSE
|
||||
if(!(mode.storyteller.flags & WAROPS_ALWAYS_ALLOWED))
|
||||
if(mode.threat_level < CONFIG_GET(number/dynamic_warops_requirement))
|
||||
to_chat(user, "Due to the dynamic space in which the station resides, you are too deep into Nanotrasen territory to reasonably go loud.")
|
||||
return FALSE
|
||||
else if(mode.threat < CONFIG_GET(number/dynamic_warops_cost))
|
||||
to_chat(user, "Due to recent threats on the station, Nanotrasen is looking too closely for a war declaration to be wise.")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/item/nuclear_challenge/clownops
|
||||
|
||||
@@ -611,10 +611,7 @@ This is here to make the tiles around the station mininuke change when it's arme
|
||||
if(!fake)
|
||||
return
|
||||
|
||||
var/ghost = isobserver(user)
|
||||
var/captain = user.mind && user.mind.assigned_role == "Captain"
|
||||
var/nukie = user.mind && user.mind.has_antag_datum(/datum/antagonist/nukeop)
|
||||
if(ghost || captain || nukie)
|
||||
if(isobserver(user) || HAS_TRAIT(user, TRAIT_DISK_VERIFIER) || (user.mind && HAS_TRAIT(user.mind, TRAIT_DISK_VERIFIER)))
|
||||
. += "<span class='warning'>The serial numbers on [src] are incorrect.</span>"
|
||||
|
||||
/obj/item/disk/nuclear/attackby(obj/item/I, mob/living/user, params)
|
||||
@@ -653,3 +650,7 @@ This is here to make the tiles around the station mininuke change when it's arme
|
||||
|
||||
/obj/item/disk/nuclear/fake
|
||||
fake = TRUE
|
||||
|
||||
/obj/item/disk/nuclear/fake/obvious
|
||||
name = "cheap plastic imitation of the nuclear authentication disk"
|
||||
desc = "How anyone could mistake this for the real thing is beyond you."
|
||||
|
||||
@@ -23,10 +23,12 @@
|
||||
/datum/antagonist/nukeop/apply_innate_effects(mob/living/mob_override)
|
||||
var/mob/living/M = mob_override || owner.current
|
||||
update_synd_icons_added(M)
|
||||
ADD_TRAIT(owner, TRAIT_DISK_VERIFIER, NUKEOP_TRAIT)
|
||||
|
||||
/datum/antagonist/nukeop/remove_innate_effects(mob/living/mob_override)
|
||||
var/mob/living/M = mob_override || owner.current
|
||||
update_synd_icons_removed(M)
|
||||
REMOVE_TRAIT(owner, TRAIT_DISK_VERIFIER, NUKEOP_TRAIT)
|
||||
|
||||
/datum/antagonist/nukeop/proc/equip_op()
|
||||
if(!ishuman(owner.current))
|
||||
@@ -42,7 +44,6 @@
|
||||
owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ops.ogg',100,0)
|
||||
to_chat(owner, "<span class='notice'>You are a [nuke_team ? nuke_team.syndicate_name : "syndicate"] agent!</span>")
|
||||
owner.announce_objectives()
|
||||
return
|
||||
|
||||
/datum/antagonist/nukeop/on_gain()
|
||||
give_alias()
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/datum/round_event_control/spawn_swarmer
|
||||
name = "Spawn Swarmer Shell"
|
||||
typepath = /datum/round_event/spawn_swarmer
|
||||
weight = 7
|
||||
max_occurrences = 1 //Only once okay fam
|
||||
weight = 0
|
||||
max_occurrences = 0
|
||||
earliest_start = 30 MINUTES
|
||||
min_players = 15
|
||||
|
||||
|
||||
@@ -80,6 +80,8 @@
|
||||
if(istype(SSticker.mode,/datum/game_mode/dynamic))
|
||||
mode = SSticker.mode
|
||||
is_dynamic = TRUE
|
||||
if(mode.storyteller.flags & NO_ASSASSIN)
|
||||
is_hijacker = FALSE
|
||||
if(GLOB.joined_player_list.len>=GLOB.dynamic_high_pop_limit)
|
||||
is_hijacker = (prob(10) && mode.threat_level > CONFIG_GET(number/dynamic_hijack_high_population_requirement))
|
||||
else
|
||||
@@ -180,7 +182,7 @@
|
||||
destroy_objective.owner = owner
|
||||
destroy_objective.find_target()
|
||||
add_objective(destroy_objective)
|
||||
else if(prob(30))
|
||||
else if(prob(30) || (mode.storyteller.flags & NO_ASSASSIN))
|
||||
var/datum/objective/maroon/maroon_objective = new
|
||||
maroon_objective.owner = owner
|
||||
maroon_objective.find_target()
|
||||
|
||||
@@ -505,6 +505,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
|
||||
if(!is_station_level(F.z))
|
||||
continue
|
||||
F.obj_flags |= EMAGGED
|
||||
F.update_icon()
|
||||
to_chat(owner, "<span class='notice'>All thermal sensors on the station have been disabled. Fire alerts will no longer be recognized.</span>")
|
||||
owner.playsound_local(owner, 'sound/machines/terminal_off.ogg', 50, 0)
|
||||
|
||||
|
||||
@@ -177,6 +177,10 @@
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/mind_transfer(null))
|
||||
to_chat(owner, "<B>Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap.")
|
||||
if(APPRENTICE_MARTIAL)
|
||||
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/nuclear_fist(null))
|
||||
H.put_in_hands(new /obj/item/book/granter/martial/plasma_fist(H))
|
||||
to_chat(owner, "<B>Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned mystical martial abilities. You are also able to use the Nuclear Fist at will.")
|
||||
|
||||
/datum/antagonist/wizard/apprentice/create_objectives()
|
||||
var/datum/objective/protect/new_objective = new /datum/objective/protect
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
if(flash)
|
||||
add_overlay(flashing_overlay)
|
||||
attached_overlays += flashing_overlay
|
||||
addtimer(CALLBACK(src, .proc/update_icon), 5)
|
||||
addtimer(CALLBACK(src, /atom/.proc/update_icon), 5)
|
||||
if(holder)
|
||||
holder.update_icon()
|
||||
|
||||
@@ -308,7 +308,7 @@
|
||||
else if(flash)
|
||||
icon_state = "flashshield_flash"
|
||||
item_state = "flashshield_flash"
|
||||
addtimer(CALLBACK(src, .proc/update_icon), 5)
|
||||
addtimer(CALLBACK(src, /atom/.proc/update_icon), 5)
|
||||
|
||||
if(holder)
|
||||
holder.update_icon()
|
||||
|
||||
@@ -57,10 +57,10 @@
|
||||
if(item.parent)
|
||||
var/static/pipenetwarnings = 10
|
||||
if(pipenetwarnings > 0)
|
||||
warning("build_pipeline(): [item.type] added to a pipenet while still having one. (pipes leading to the same spot stacking in one turf) Nearby: ([item.x], [item.y], [item.z])")
|
||||
log_mapping("build_pipeline(): [item.type] added to a pipenet while still having one. (pipes leading to the same spot stacking in one turf) Nearby: ([item.x], [item.y], [item.z]).")
|
||||
pipenetwarnings -= 1
|
||||
if(pipenetwarnings == 0)
|
||||
warning("build_pipeline(): further messages about pipenets will be suppressed")
|
||||
log_mapping("build_pipeline(): further messages about pipenets will be suppressed")
|
||||
members += item
|
||||
possible_expansions += item
|
||||
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
pixel_y = (new_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_Y
|
||||
|
||||
/obj/machinery/meter/process_atmos()
|
||||
if(!target)
|
||||
if(!(target?.flags_1 & INITIALIZED_1))
|
||||
icon_state = "meterX"
|
||||
return 0
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
var/show_flavour = TRUE
|
||||
var/banType = "lavaland"
|
||||
var/ghost_usable = TRUE
|
||||
var/skip_reentry_check = FALSE //Skips the ghost role blacklist time for people who ghost/suicide/cryo
|
||||
|
||||
//ATTACK GHOST IGNORING PARENT RETURN VALUE
|
||||
/obj/effect/mob_spawn/attack_ghost(mob/user, latejoinercalling)
|
||||
@@ -44,7 +45,7 @@
|
||||
return
|
||||
if(isobserver(user))
|
||||
var/mob/dead/observer/O = user
|
||||
if(!O.can_reenter_round())
|
||||
if(!O.can_reenter_round() && !skip_reentry_check)
|
||||
return FALSE
|
||||
var/ghost_role = alert(latejoinercalling ? "Latejoin as [mob_name]? (This is a ghost role, and as such, it's very likely to be off-station.)" : "Become [mob_name]? (Warning, You can no longer be cloned!)",,"Yes","No")
|
||||
if(ghost_role == "No" || !loc)
|
||||
|
||||
@@ -22,9 +22,9 @@
|
||||
if(istype(object,/turf) && left_click && !alt_click && !ctrl_click)
|
||||
var/turf/T = object
|
||||
if(isspaceturf(object))
|
||||
T.PlaceOnTop(/turf/open/floor/plating)
|
||||
T.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR)
|
||||
else if(isplatingturf(object))
|
||||
T.PlaceOnTop(/turf/open/floor/plasteel)
|
||||
T.PlaceOnTop(/turf/open/floor/plasteel, flags = CHANGETURF_INHERIT_AIR)
|
||||
else if(isfloorturf(object))
|
||||
T.PlaceOnTop(/turf/closed/wall)
|
||||
else if(iswallturf(object))
|
||||
@@ -35,7 +35,7 @@
|
||||
log_admin("Build Mode: [key_name(c)] deleted [object] at [AREACOORD(object)]")
|
||||
if(isturf(object))
|
||||
var/turf/T = object
|
||||
T.ScrapeAway()
|
||||
T.ScrapeAway(flags = CHANGETURF_INHERIT_AIR)
|
||||
else if(isobj(object))
|
||||
qdel(object)
|
||||
return
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
name = linked_pod.name
|
||||
. = ..()
|
||||
|
||||
/mob/living/simple_animal/pet/gondola/gondolapod/proc/update_icon()
|
||||
/mob/living/simple_animal/pet/gondola/gondolapod/update_icon_state()
|
||||
if(opened)
|
||||
icon_state = "gondolapod_open"
|
||||
else
|
||||
|
||||
@@ -13,17 +13,16 @@
|
||||
//////////////////// Paperwork and Writing Supplies //////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/* I did it Kevin
|
||||
/datum/supply_pack/misc/abandonedcrate
|
||||
name = "Abandoned Crate"
|
||||
desc = "Someone keeps finding these locked crates out in the boonies. How about you take a crack at it, we've had our fill. WARNING: EXPLOSIVE"
|
||||
name = "Loot Box"
|
||||
desc = "Try your luck with these highly secure loot boxes! Solve the lock, win great prizes! WARNING: EXPLOSIVE FAILURE."
|
||||
contraband = TRUE
|
||||
cost = 12800
|
||||
cost = 15000
|
||||
contains = list(/obj/structure/closet/crate/secure/loot)
|
||||
crate_name = "abandoned crate"
|
||||
crate_type = /obj/structure/closet/crate/large
|
||||
dangerous = TRUE
|
||||
*/
|
||||
|
||||
/datum/supply_pack/misc/artsupply
|
||||
name = "Art Supplies"
|
||||
desc = "Make some happy little accidents with six canvasses, two easels, two boxes of crayons, and a rainbow crayon!"
|
||||
|
||||
@@ -176,6 +176,23 @@
|
||||
/obj/item/storage/bag/tray)
|
||||
crate_name = "fruit crate"
|
||||
|
||||
/datum/supply_pack/organic/grill
|
||||
name = "Grilling Starter Kit"
|
||||
desc = "Hey dad I'm Hungry. Hi Hungry I'm THE NEW GRILLING STARTER KIT ONLY 5000 BUX GET NOW! Contains a cooking grill and five fuel coal sheets."
|
||||
cost = 3000
|
||||
crate_type = /obj/structure/closet/crate
|
||||
contains = list(/obj/item/stack/sheet/mineral/coal/five,
|
||||
/obj/machinery/grill/unwrenched)
|
||||
crate_name = "grilling starter kit crate"
|
||||
|
||||
/datum/supply_pack/organic/grillfuel
|
||||
name = "Grilling Fuel Kit"
|
||||
desc = "Contains coal and coal accessories. (Note: only ten coal sheets.)"
|
||||
cost = 1000
|
||||
crate_type = /obj/structure/closet/crate
|
||||
contains = list(/obj/item/stack/sheet/mineral/coal/ten)
|
||||
crate_name = "grilling fuel kit crate"
|
||||
|
||||
/datum/supply_pack/organic/cream_piee
|
||||
name = "High-yield Clown-grade Cream Pie Crate"
|
||||
desc = "Designed by Aussec's Advanced Warfare Research Division, these high-yield, Clown-grade cream pies are powered by a synergy of performance and efficiency. Guaranteed to provide maximum results."
|
||||
|
||||
@@ -79,4 +79,8 @@
|
||||
var/client_keysend_amount = 0
|
||||
var/next_keysend_reset = 0
|
||||
var/next_keysend_trip_reset = 0
|
||||
var/keysend_tripped = FALSE
|
||||
var/keysend_tripped = FALSE
|
||||
|
||||
// stops players from coming back through ghost/midround roles after suicide/cryo
|
||||
// for a duration set by CONFIG_GET(number/suicide_reenter_round_timer) and CONFIG_GET(number/roundstart_suicide_time_limit)
|
||||
var/reenter_round_timeout = 0
|
||||
|
||||
@@ -14,13 +14,17 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
//doohickeys for savefiles
|
||||
var/path
|
||||
var/default_slot = 1 //Holder so it doesn't default to slot 1, rather the last one used
|
||||
var/max_save_slots = 8
|
||||
var/max_save_slots = 16
|
||||
|
||||
//non-preference stuff
|
||||
var/muted = 0
|
||||
var/last_ip
|
||||
var/last_id
|
||||
|
||||
var/icon/custom_holoform_icon
|
||||
var/list/cached_holoform_icons
|
||||
var/last_custom_holoform = 0
|
||||
|
||||
//Cooldowns for saving/loading. These are four are all separate due to loading code calling these one after another
|
||||
var/saveprefcooldown
|
||||
var/loadprefcooldown
|
||||
@@ -103,6 +107,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
"legs" = "Plantigrade",
|
||||
"insect_wings" = "Plain",
|
||||
"insect_fluff" = "None",
|
||||
"insect_markings" = "None",
|
||||
"mcolor2" = "FFF",
|
||||
"mcolor3" = "FFF",
|
||||
"mam_body_markings" = "Plain",
|
||||
@@ -194,6 +199,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
var/auto_fit_viewport = TRUE
|
||||
|
||||
var/uplink_spawn_loc = UPLINK_PDA
|
||||
|
||||
var/sprint_spacebar = FALSE
|
||||
var/sprint_toggle = FALSE
|
||||
|
||||
var/list/exp = list()
|
||||
var/list/menuoptions
|
||||
@@ -217,7 +225,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
load_path(C.ckey)
|
||||
unlock_content = C.IsByondMember()
|
||||
if(unlock_content)
|
||||
max_save_slots = 16
|
||||
max_save_slots = 24
|
||||
var/loaded_preferences_successfully = load_preferences()
|
||||
if(loaded_preferences_successfully)
|
||||
if(load_character())
|
||||
@@ -244,6 +252,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<a href='?_src_=prefs;preference=tab;tab=2' [current_tab == 2 ? "class='linkOn'" : ""]>Character Appearance</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=tab;tab=3' [current_tab == 3 ? "class='linkOn'" : ""]>Loadout</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=tab;tab=1' [current_tab == 1 ? "class='linkOn'" : ""]>Game Preferences</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=tab;tab=4' [current_tab == 4 ? "class='linkOn'" : ""]>Content Preferences</a>"
|
||||
|
||||
if(!path)
|
||||
dat += "<div class='notice'>Please create an account to save your preferences</div>"
|
||||
@@ -620,6 +629,19 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
|
||||
dat += "<a style='display:block;width:100px' href='?_src_=prefs;preference=taur;task=input'>[features["taur"]]</a>"
|
||||
|
||||
if("insect_markings" in pref_species.default_features)
|
||||
if(!mutant_category)
|
||||
dat += APPEARANCE_CATEGORY_COLUMN
|
||||
|
||||
dat += "<h3>Insect markings</h3>"
|
||||
|
||||
dat += "<a href='?_src_=prefs;preference=insect_markings;task=input'>[features["insect_markings"]]</a><BR>"
|
||||
|
||||
mutant_category++
|
||||
if(mutant_category >= MAX_MUTANT_ROWS)
|
||||
dat += "</td>"
|
||||
mutant_category = 0
|
||||
|
||||
mutant_category++
|
||||
if(mutant_category >= MAX_MUTANT_ROWS)
|
||||
dat += "</td>"
|
||||
@@ -707,13 +729,13 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<table><tr><td width='340px' height='300px' valign='top'>"
|
||||
dat += "<h2>Clothing & Equipment</h2>"
|
||||
dat += "<b>Underwear:</b><a style='display:block;width:100px' href ='?_src_=prefs;preference=underwear;task=input'>[underwear]</a>"
|
||||
if(UNDIE_COLORABLE(GLOB.underwear_list[underwear]))
|
||||
if(GLOB.underwear_list[underwear]?.has_color)
|
||||
dat += "<b>Underwear Color:</b> <span style='border:1px solid #161616; background-color: #[undie_color];'> </span> <a href='?_src_=prefs;preference=undie_color;task=input'>Change</a><BR>"
|
||||
dat += "<b>Undershirt:</b><a style='display:block;width:100px' href ='?_src_=prefs;preference=undershirt;task=input'>[undershirt]</a>"
|
||||
if(UNDIE_COLORABLE(GLOB.undershirt_list[undershirt]))
|
||||
if(GLOB.undershirt_list[undershirt]?.has_color)
|
||||
dat += "<b>Undershirt Color:</b> <span style='border:1px solid #161616; background-color: #[shirt_color];'> </span> <a href='?_src_=prefs;preference=shirt_color;task=input'>Change</a><BR>"
|
||||
dat += "<b>Socks:</b><a style='display:block;width:100px' href ='?_src_=prefs;preference=socks;task=input'>[socks]</a>"
|
||||
if(UNDIE_COLORABLE(GLOB.socks_list[socks]))
|
||||
if(GLOB.socks_list[socks]?.has_color)
|
||||
dat += "<b>Socks Color:</b> <span style='border:1px solid #161616; background-color: #[socks_color];'> </span> <a href='?_src_=prefs;preference=socks_color;task=input'>Change</a><BR>"
|
||||
dat += "<b>Backpack:</b><a style='display:block;width:100px' href ='?_src_=prefs;preference=bag;task=input'>[backbag]</a>"
|
||||
dat += "<b>Jumpsuit:</b><BR><a href ='?_src_=prefs;preference=suit;task=input'>[jumpsuit_style]</a><BR>"
|
||||
@@ -820,13 +842,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
|
||||
dat +="<td width='300px' height='300px' valign='top'>"
|
||||
dat += "<h2>Citadel Preferences</h2>" //Because fuck me if preferences can't be fucking modularized and expected to update in a reasonable timeframe.
|
||||
dat += "<b>Arousal:</b><a href='?_src_=prefs;preference=arousable'>[arousable == TRUE ? "Enabled" : "Disabled"]</a><BR>"
|
||||
dat += "<b>Voracious MediHound sleepers:</b> <a href='?_src_=prefs;preference=hound_sleeper'>[(cit_toggles & MEDIHOUND_SLEEPER) ? "Yes" : "No"]</a><br>"
|
||||
dat += "<b>Hear Vore Sounds:</b> <a href='?_src_=prefs;preference=toggleeatingnoise'>[(cit_toggles & EATING_NOISES) ? "Yes" : "No"]</a><br>"
|
||||
dat += "<b>Hear Vore Digestion Sounds:</b> <a href='?_src_=prefs;preference=toggledigestionnoise'>[(cit_toggles & DIGESTION_NOISES) ? "Yes" : "No"]</a><br>"
|
||||
dat += "<b>Lewdchem:</b><a href='?_src_=prefs;preference=lewdchem'>[lewdchem == TRUE ? "Enabled" : "Disabled"]</a><BR>"
|
||||
dat += "<b>Widescreen:</b> <a href='?_src_=prefs;preference=widescreenpref'>[widescreenpref ? "Enabled ([CONFIG_GET(string/default_view)])" : "Disabled (15x15)"]</a><br>"
|
||||
dat += "<b>Auto stand:</b> <a href='?_src_=prefs;preference=autostand'>[autostand ? "Enabled" : "Disabled"]</a><br>"
|
||||
dat += "<b>Auto OOC:</b> <a href='?_src_=prefs;preference=auto_ooc'>[auto_ooc ? "Enabled" : "Disabled"]</a><br>"
|
||||
dat += "<b>Screen Shake:</b> <a href='?_src_=prefs;preference=screenshake'>[(screenshake==100) ? "Full" : ((screenshake==0) ? "None" : "[screenshake]")]</a><br>"
|
||||
if (user && user.client && !user.client.prefs.screenshake==0)
|
||||
dat += "<b>Damage Screen Shake:</b> <a href='?_src_=prefs;preference=damagescreenshake'>[(damagescreenshake==1) ? "On" : ((damagescreenshake==0) ? "Off" : "Only when down")]</a><br>"
|
||||
@@ -878,6 +896,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "</a><br>"
|
||||
dat += "<b>Ambient Occlusion:</b> <a href='?_src_=prefs;preference=ambientocclusion'>[ambientocclusion ? "Enabled" : "Disabled"]</a><br>"
|
||||
dat += "<b>Fit Viewport:</b> <a href='?_src_=prefs;preference=auto_fit_viewport'>[auto_fit_viewport ? "Auto" : "Manual"]</a><br>"
|
||||
dat += "<b>Sprint Key:</b> <a href='?_src_=prefs;preference=sprint_key'>[sprint_spacebar ? "Space" : "Shift"]</a><br>"
|
||||
dat += "<b>Toggle Sprint:</b> <a href='?_src_=prefs;preference=sprint_toggle'>[sprint_toggle ? "Enabled" : "Disabled"]</a><br>"
|
||||
|
||||
if (CONFIG_GET(flag/maprotation) && CONFIG_GET(flag/tgstyle_maprotation))
|
||||
var/p_map = preferred_map
|
||||
@@ -977,6 +997,26 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "</font>"
|
||||
dat += "</td><td><font size=2><i>[gear.description]</i></font></td></tr>"
|
||||
dat += "</table>"
|
||||
if(4) // Content preferences
|
||||
dat += "<table><tr><td width='340px' height='300px' valign='top'>"
|
||||
dat += "<h2>Fetish content prefs</h2>"
|
||||
dat += "<b>Arousal:</b><a href='?_src_=prefs;preference=arousable'>[arousable == TRUE ? "Enabled" : "Disabled"]</a><BR>"
|
||||
dat += "<b>Voracious MediHound sleepers:</b> <a href='?_src_=prefs;preference=hound_sleeper'>[(cit_toggles & MEDIHOUND_SLEEPER) ? "Yes" : "No"]</a><br>"
|
||||
dat += "<b>Hear Vore Sounds:</b> <a href='?_src_=prefs;preference=toggleeatingnoise'>[(cit_toggles & EATING_NOISES) ? "Yes" : "No"]</a><br>"
|
||||
dat += "<b>Hear Vore Digestion Sounds:</b> <a href='?_src_=prefs;preference=toggledigestionnoise'>[(cit_toggles & DIGESTION_NOISES) ? "Yes" : "No"]</a><br>"
|
||||
dat += "<b>Forced Feminization:</b> <a href='?_src_=prefs;preference=feminization'>[(cit_toggles & FORCED_FEM) ? "Allowed" : "Disallowed"]</a><br>"
|
||||
dat += "<b>Forced Masculinization:</b> <a href='?_src_=prefs;preference=masculinization'>[(cit_toggles & FORCED_MASC) ? "Allowed" : "Disallowed"]</a><br>"
|
||||
dat += "<b>Lewd Hypno:</b> <a href='?_src_=prefs;preference=hypno'>[(cit_toggles & HYPNO) ? "Allowed" : "Disallowed"]</a><br>"
|
||||
dat += "</td>"
|
||||
dat +="<td width='300px' height='300px' valign='top'>"
|
||||
dat += "<h2>Other content prefs</h2>"
|
||||
dat += "<b>Breast Enlargement:</b> <a href='?_src_=prefs;preference=breast_enlargement'>[(cit_toggles & BREAST_ENLARGEMENT) ? "Allowed" : "Disallowed"]</a><br>"
|
||||
dat += "<b>Penis Enlargement:</b> <a href='?_src_=prefs;preference=penis_enlargement'>[(cit_toggles & PENIS_ENLARGEMENT) ? "Allowed" : "Disallowed"]</a><br>"
|
||||
dat += "<b>Hypno:</b> <a href='?_src_=prefs;preference=never_hypno'>[(cit_toggles & NEVER_HYPNO) ? "Disallowed" : "Allowed"]</a><br>"
|
||||
dat += "<b>Aphrodisiacs:</b> <a href='?_src_=prefs;preference=aphro'>[(cit_toggles & NO_APHRO) ? "Disallowed" : "Allowed"]</a><br>"
|
||||
dat += "<b>Ass Slapping:</b> <a href='?_src_=prefs;preference=ass_slap'>[(cit_toggles & NO_ASS_SLAP) ? "Disallowed" : "Allowed"]</a><br>"
|
||||
dat += "<br>"
|
||||
|
||||
|
||||
dat += "<hr><center>"
|
||||
|
||||
@@ -1743,6 +1783,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if(new_insect_fluff)
|
||||
features["insect_fluff"] = new_insect_fluff
|
||||
|
||||
if("insect_markings")
|
||||
var/new_insect_markings
|
||||
new_insect_markings = input(user, "Choose your character's markings:", "Character Preference") as null|anything in GLOB.insect_markings_list
|
||||
if(new_insect_markings)
|
||||
features["insect_markings"] = new_insect_markings
|
||||
|
||||
if("s_tone")
|
||||
var/new_s_tone = input(user, "Choose your character's skin-tone:", "Character Preference") as null|anything in GLOB.skin_tones
|
||||
if(new_s_tone)
|
||||
@@ -2016,8 +2062,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
features["genitals_use_skintone"] = !features["genitals_use_skintone"]
|
||||
if("arousable")
|
||||
arousable = !arousable
|
||||
if("lewdchem")
|
||||
lewdchem = !lewdchem
|
||||
if("has_cock")
|
||||
features["has_cock"] = !features["has_cock"]
|
||||
if(features["has_cock"] == FALSE)
|
||||
@@ -2049,6 +2093,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
user.client.change_view(CONFIG_GET(string/default_view))
|
||||
if("autostand")
|
||||
autostand = !autostand
|
||||
if("auto_ooc")
|
||||
auto_ooc = !auto_ooc
|
||||
if ("screenshake")
|
||||
var/desiredshake = input(user, "Set the amount of screenshake you want. \n(0 = disabled, 100 = full, 200 = maximum.)", "Character Preference", screenshake) as null|num
|
||||
if (!isnull(desiredshake))
|
||||
@@ -2164,6 +2210,31 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
|
||||
if("toggledigestionnoise")
|
||||
cit_toggles ^= DIGESTION_NOISES
|
||||
|
||||
if("breast_enlargement")
|
||||
cit_toggles ^= BREAST_ENLARGEMENT
|
||||
|
||||
if("penis_enlargement")
|
||||
cit_toggles ^= PENIS_ENLARGEMENT
|
||||
|
||||
if("feminization")
|
||||
cit_toggles ^= FORCED_FEM
|
||||
|
||||
if("masculinization")
|
||||
cit_toggles ^= FORCED_MASC
|
||||
|
||||
if("hypno")
|
||||
cit_toggles ^= HYPNO
|
||||
|
||||
if("never_hypno")
|
||||
cit_toggles ^= NEVER_HYPNO
|
||||
|
||||
if("aphro")
|
||||
cit_toggles ^= NO_APHRO
|
||||
|
||||
if("ass_slap")
|
||||
cit_toggles ^= NO_ASS_SLAP
|
||||
|
||||
//END CITADEL EDIT
|
||||
|
||||
if("ambientocclusion")
|
||||
@@ -2177,6 +2248,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
if(auto_fit_viewport && parent)
|
||||
parent.fit_viewport()
|
||||
|
||||
if("sprint_key")
|
||||
sprint_spacebar = !sprint_spacebar
|
||||
|
||||
if("sprint_toggle")
|
||||
sprint_toggle = !sprint_toggle
|
||||
|
||||
if("save")
|
||||
save_preferences()
|
||||
save_character()
|
||||
@@ -2349,3 +2426,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
return
|
||||
else
|
||||
custom_names[name_id] = sanitized_name
|
||||
|
||||
/datum/preferences/proc/get_filtered_holoform(filter_type)
|
||||
if(!custom_holoform_icon)
|
||||
return
|
||||
LAZYINITLIST(cached_holoform_icons)
|
||||
if(!cached_holoform_icons[filter_type])
|
||||
cached_holoform_icons[filter_type] = process_holoform_icon_filter(custom_holoform_icon, filter_type)
|
||||
return cached_holoform_icons[filter_type]
|
||||
|
||||
@@ -167,6 +167,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["parallax"] >> parallax
|
||||
S["ambientocclusion"] >> ambientocclusion
|
||||
S["auto_fit_viewport"] >> auto_fit_viewport
|
||||
S["sprint_spacebar"] >> sprint_spacebar
|
||||
S["sprint_toggle"] >> sprint_toggle
|
||||
S["menuoptions"] >> menuoptions
|
||||
S["enable_tips"] >> enable_tips
|
||||
S["tip_delay"] >> tip_delay
|
||||
@@ -181,8 +183,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["widescreenpref"] >> widescreenpref
|
||||
S["autostand"] >> autostand
|
||||
S["cit_toggles"] >> cit_toggles
|
||||
S["lewdchem"] >> lewdchem
|
||||
S["preferred_chaos"] >> preferred_chaos
|
||||
S["auto_ooc"] >> auto_ooc
|
||||
|
||||
|
||||
//try to fix any outdated data if necessary
|
||||
@@ -204,6 +206,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
parallax = sanitize_integer(parallax, PARALLAX_INSANE, PARALLAX_DISABLE, null)
|
||||
ambientocclusion = sanitize_integer(ambientocclusion, 0, 1, initial(ambientocclusion))
|
||||
auto_fit_viewport = sanitize_integer(auto_fit_viewport, 0, 1, initial(auto_fit_viewport))
|
||||
sprint_spacebar = sanitize_integer(sprint_spacebar, 0, 1, initial(sprint_spacebar))
|
||||
sprint_toggle = sanitize_integer(sprint_toggle, 0, 1, initial(sprint_toggle))
|
||||
ghost_form = sanitize_inlist(ghost_form, GLOB.ghost_forms, initial(ghost_form))
|
||||
ghost_orbit = sanitize_inlist(ghost_orbit, GLOB.ghost_orbits, initial(ghost_orbit))
|
||||
ghost_accs = sanitize_inlist(ghost_accs, GLOB.ghost_accs_options, GHOST_ACCS_DEFAULT_OPTION)
|
||||
@@ -219,7 +223,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
widescreenpref = sanitize_integer(widescreenpref, 0, 1, initial(widescreenpref))
|
||||
autostand = sanitize_integer(autostand, 0, 1, initial(autostand))
|
||||
cit_toggles = sanitize_integer(cit_toggles, 0, 65535, initial(cit_toggles))
|
||||
|
||||
auto_ooc = sanitize_integer(auto_ooc, 0, 1, initial(auto_ooc))
|
||||
|
||||
return 1
|
||||
|
||||
@@ -264,6 +268,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
WRITE_FILE(S["parallax"], parallax)
|
||||
WRITE_FILE(S["ambientocclusion"], ambientocclusion)
|
||||
WRITE_FILE(S["auto_fit_viewport"], auto_fit_viewport)
|
||||
WRITE_FILE(S["sprint_spacebar"], sprint_spacebar)
|
||||
WRITE_FILE(S["sprint_toggle"], sprint_toggle)
|
||||
WRITE_FILE(S["menuoptions"], menuoptions)
|
||||
WRITE_FILE(S["enable_tips"], enable_tips)
|
||||
WRITE_FILE(S["tip_delay"], tip_delay)
|
||||
@@ -278,8 +284,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
WRITE_FILE(S["widescreenpref"], widescreenpref)
|
||||
WRITE_FILE(S["autostand"], autostand)
|
||||
WRITE_FILE(S["cit_toggles"], cit_toggles)
|
||||
WRITE_FILE(S["lewdchem"], lewdchem)
|
||||
WRITE_FILE(S["preferred_chaos"], preferred_chaos)
|
||||
WRITE_FILE(S["auto_ooc"], auto_ooc)
|
||||
|
||||
return 1
|
||||
|
||||
@@ -366,9 +372,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["feature_lizard_legs"] >> features["legs"]
|
||||
S["feature_human_tail"] >> features["tail_human"]
|
||||
S["feature_human_ears"] >> features["ears"]
|
||||
S["feature_deco_wings"] >> features["deco_wings"]
|
||||
S["feature_insect_wings"] >> features["insect_wings"]
|
||||
S["feature_deco_wings"] >> features["deco_wings"]
|
||||
S["feature_insect_fluff"] >> features["insect_fluff"]
|
||||
S["feature_insect_markings"] >> features["insect_markings"]
|
||||
|
||||
//Custom names
|
||||
for(var/custom_name_id in GLOB.preferences_custom_names)
|
||||
@@ -503,9 +510,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
features["spines"] = sanitize_inlist(features["spines"], GLOB.spines_list)
|
||||
features["body_markings"] = sanitize_inlist(features["body_markings"], GLOB.body_markings_list)
|
||||
features["feature_lizard_legs"] = sanitize_inlist(features["legs"], GLOB.legs_list)
|
||||
features["insect_wings"] = sanitize_inlist(features["insect_wings"], GLOB.insect_wings_list)
|
||||
features["deco_wings"] = sanitize_inlist(features["deco_wings"], GLOB.deco_wings_list, "None")
|
||||
features["insect_fluff"] = sanitize_inlist(features["insect_fluff"], GLOB.insect_fluffs_list)
|
||||
features["insect_markings"] = sanitize_inlist(features["insect_markings"], GLOB.insect_markings_list, "None")
|
||||
features["insect_wings"] = sanitize_inlist(features["insect_wings"], GLOB.insect_wings_list)
|
||||
|
||||
joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole))
|
||||
//Validate job prefs
|
||||
@@ -515,6 +523,21 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
|
||||
all_quirks = SANITIZE_LIST(all_quirks)
|
||||
|
||||
for(var/V in all_quirks) // quirk migration
|
||||
switch(V)
|
||||
if("Acute hepatic pharmacokinesis")
|
||||
DISABLE_BITFIELD(cit_toggles, PENIS_ENLARGEMENT)
|
||||
DISABLE_BITFIELD(cit_toggles, BREAST_ENLARGEMENT)
|
||||
ENABLE_BITFIELD(cit_toggles,FORCED_FEM)
|
||||
ENABLE_BITFIELD(cit_toggles,FORCED_MASC)
|
||||
all_quirks -= V
|
||||
if("Crocin Immunity")
|
||||
ENABLE_BITFIELD(cit_toggles,NO_APHRO)
|
||||
all_quirks -= V
|
||||
if("Buns of Steel")
|
||||
ENABLE_BITFIELD(cit_toggles,NO_ASS_SLAP)
|
||||
all_quirks -= V
|
||||
|
||||
cit_character_pref_load(S)
|
||||
|
||||
return 1
|
||||
@@ -570,11 +593,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
WRITE_FILE(S["feature_lizard_spines"] , features["spines"])
|
||||
WRITE_FILE(S["feature_lizard_body_markings"] , features["body_markings"])
|
||||
WRITE_FILE(S["feature_lizard_legs"] , features["legs"])
|
||||
WRITE_FILE(S["feature_insect_wings"] , features["insect_wings"])
|
||||
WRITE_FILE(S["feature_deco_wings"] , features["deco_wings"])
|
||||
WRITE_FILE(S["feature_insect_wings"] , features["insect_wings"])
|
||||
WRITE_FILE(S["feature_insect_fluff"] , features["insect_fluff"])
|
||||
WRITE_FILE(S["feature_insect_markings"] , features["insect_markings"])
|
||||
WRITE_FILE(S["feature_meat"] , features["meat_type"])
|
||||
|
||||
|
||||
//Custom names
|
||||
for(var/custom_name_id in GLOB.preferences_custom_names)
|
||||
var/savefile_slot_name = custom_name_id + "_name" //TODO remove this
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
var/cooldown = 0
|
||||
var/obj/item/flashlight/F = null
|
||||
var/can_flashlight = 0
|
||||
var/scan_reagents = 0 //Can the wearer see reagents while it's equipped?
|
||||
|
||||
var/blocks_shove_knockdown = FALSE //Whether wearing the clothing item blocks the ability for shove to knock down.
|
||||
|
||||
@@ -47,6 +46,16 @@
|
||||
//Add a "exclude" string to do the opposite, making it only only species listed that can't wear it.
|
||||
//You append this to clothing objects.
|
||||
|
||||
//Polychrome stuff:
|
||||
var/hasprimary = FALSE //These vars allow you to choose which overlays a clothing has
|
||||
var/hassecondary = FALSE
|
||||
var/hastertiary = FALSE
|
||||
var/primary_color = "#FFFFFF" //RGB in hexcode
|
||||
var/secondary_color = "#FFFFFF"
|
||||
var/tertiary_color = "#808080"
|
||||
|
||||
//No idea what this is but eh -tori
|
||||
var/force_alternate_icon = FALSE
|
||||
|
||||
/obj/item/clothing/Initialize()
|
||||
. = ..()
|
||||
@@ -54,6 +63,8 @@
|
||||
actions_types += /datum/action/item_action/toggle_voice_box
|
||||
if(ispath(pocket_storage_component_path))
|
||||
LoadComponent(pocket_storage_component_path)
|
||||
if(hasprimary | hassecondary | hastertiary) //Checks if polychrome is enabled
|
||||
update_icon() //Applies the overlays and default colors onto the clothes on spawn.
|
||||
|
||||
/obj/item/clothing/MouseDrop(atom/over_object)
|
||||
. = ..()
|
||||
@@ -138,6 +149,8 @@
|
||||
how_cool_are_your_threads += "Adding or removing items from [src] makes no noise.\n"
|
||||
how_cool_are_your_threads += "</span>"
|
||||
. += how_cool_are_your_threads.Join()
|
||||
if(hasprimary | hassecondary | hastertiary) //Checks if polychrome is enabled
|
||||
. += "<span class='notice'>Alt-click to recolor it.</span>"
|
||||
|
||||
/obj/item/clothing/obj_break(damage_flag)
|
||||
if(!damaged_clothes)
|
||||
@@ -260,6 +273,56 @@ BLIND // can't see anything
|
||||
remove_accessory(user)
|
||||
else
|
||||
rolldown()
|
||||
// Polychrome stuff:
|
||||
if(hasprimary | hassecondary | hastertiary)
|
||||
var/choice = input(user,"polychromic thread options", "Clothing Recolor") as null|anything in list("[hasprimary ? "Primary Color" : ""]", "[hassecondary ? "Secondary Color" : ""]", "[hastertiary ? "Tertiary Color" : ""]") //generates a list depending on the enabled overlays
|
||||
switch(choice) //Lets the list's options actually lead to something
|
||||
if("Primary Color")
|
||||
var/primary_color_input = input(usr,"","Choose Primary Color",primary_color) as color|null //color input menu, the "|null" adds a cancel button to it.
|
||||
if(primary_color_input) //Checks if the color selected is NULL, rejects it if it is NULL.
|
||||
primary_color = sanitize_hexcolor(primary_color_input, desired_format=6, include_crunch=1) //formats the selected color properly
|
||||
update_icon() //updates the item icon
|
||||
user.regenerate_icons() //updates the worn icon. Probably a bad idea, but it works.
|
||||
if("Secondary Color")
|
||||
var/secondary_color_input = input(usr,"","Choose Secondary Color",secondary_color) as color|null
|
||||
if(secondary_color_input)
|
||||
secondary_color = sanitize_hexcolor(secondary_color_input, desired_format=6, include_crunch=1)
|
||||
update_icon()
|
||||
user.regenerate_icons()
|
||||
if("Tertiary Color")
|
||||
var/tertiary_color_input = input(usr,"","Choose Tertiary Color",tertiary_color) as color|null
|
||||
if(tertiary_color_input)
|
||||
tertiary_color = sanitize_hexcolor(tertiary_color_input, desired_format=6, include_crunch=1)
|
||||
update_icon()
|
||||
user.regenerate_icons()
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/neck/AltClick(mob/user)
|
||||
. = ..()
|
||||
if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
|
||||
return
|
||||
// Polychrome stuff:
|
||||
if(hasprimary | hassecondary | hastertiary)
|
||||
var/choice = input(user,"polychromic thread options", "Clothing Recolor") as null|anything in list("[hasprimary ? "Primary Color" : ""]", "[hassecondary ? "Secondary Color" : ""]", "[hastertiary ? "Tertiary Color" : ""]") //generates a list depending on the enabled overlays
|
||||
switch(choice) //Lets the list's options actually lead to something
|
||||
if("Primary Color")
|
||||
var/primary_color_input = input(usr,"","Choose Primary Color",primary_color) as color|null //color input menu, the "|null" adds a cancel button to it.
|
||||
if(primary_color_input) //Checks if the color selected is NULL, rejects it if it is NULL.
|
||||
primary_color = sanitize_hexcolor(primary_color_input, desired_format=6, include_crunch=1) //formats the selected color properly
|
||||
update_icon() //updates the item icon
|
||||
user.regenerate_icons() //updates the worn icon. Probably a bad idea, but it works.
|
||||
if("Secondary Color")
|
||||
var/secondary_color_input = input(usr,"","Choose Secondary Color",secondary_color) as color|null
|
||||
if(secondary_color_input)
|
||||
secondary_color = sanitize_hexcolor(secondary_color_input, desired_format=6, include_crunch=1)
|
||||
update_icon()
|
||||
user.regenerate_icons()
|
||||
if("Tertiary Color")
|
||||
var/tertiary_color_input = input(usr,"","Choose Tertiary Color",tertiary_color) as color|null
|
||||
if(tertiary_color_input)
|
||||
tertiary_color = sanitize_hexcolor(tertiary_color_input, desired_format=6, include_crunch=1)
|
||||
update_icon()
|
||||
user.regenerate_icons()
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/under/verb/jumpsuit_adjust()
|
||||
@@ -377,3 +440,18 @@ BLIND // can't see anything
|
||||
return FALSE
|
||||
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/update_icon() // Polychrome stuff
|
||||
..()
|
||||
if(hasprimary) //Checks if the overlay is enabled
|
||||
var/mutable_appearance/primary_overlay = mutable_appearance(icon, "[item_color]-primary") //Automagically picks overlays
|
||||
primary_overlay.color = primary_color //Colors the greyscaled overlay
|
||||
add_overlay(primary_overlay) //Applies the coloured overlay onto the item sprite. but NOT the mob sprite.
|
||||
if(hassecondary)
|
||||
var/mutable_appearance/secondary_overlay = mutable_appearance(icon, "[item_color]-secondary")
|
||||
secondary_overlay.color = secondary_color
|
||||
add_overlay(secondary_overlay)
|
||||
if(hastertiary)
|
||||
var/mutable_appearance/tertiary_overlay = mutable_appearance(icon, "[item_color]-tertiary")
|
||||
tertiary_overlay.color = tertiary_color
|
||||
add_overlay(tertiary_overlay)
|
||||
@@ -54,6 +54,9 @@
|
||||
H.blur_eyes(5)
|
||||
eyes.applyOrganDamage(5)
|
||||
|
||||
/obj/item/clothing/glasses/proc/ranged_attack(mob/living/carbon/human/user,atom/A, params)
|
||||
return FALSE
|
||||
|
||||
/obj/item/clothing/glasses/meson
|
||||
name = "optical meson scanner"
|
||||
desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting conditions."
|
||||
@@ -99,7 +102,7 @@
|
||||
desc = "A pair of snazzy goggles used to protect against chemical spills. Fitted with an analyzer for scanning items and reagents."
|
||||
icon_state = "purple"
|
||||
item_state = "glasses"
|
||||
scan_reagents = TRUE //You can see reagents while wearing science goggles
|
||||
clothing_flags = SCAN_REAGENTS //You can see reagents while wearing science goggles
|
||||
actions_types = list(/datum/action/item_action/toggle_research_scanner)
|
||||
glass_colour_type = /datum/client_colour/glass_colour/purple
|
||||
resistance_flags = ACID_PROOF
|
||||
@@ -203,7 +206,7 @@
|
||||
/obj/item/clothing/glasses/sunglasses/reagent
|
||||
name = "beer goggles"
|
||||
desc = "A pair of sunglasses outfitted with apparatus to scan reagents."
|
||||
scan_reagents = TRUE
|
||||
clothing_flags = SCAN_REAGENTS
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/garb
|
||||
name = "black gar glasses"
|
||||
@@ -405,7 +408,7 @@
|
||||
item_state = "godeye"
|
||||
vision_flags = SEE_TURFS|SEE_MOBS|SEE_OBJS
|
||||
darkness_view = 8
|
||||
scan_reagents = TRUE
|
||||
clothing_flags = SCAN_REAGENTS
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF
|
||||
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
/obj/item/clothing/glasses/hud/security/sunglasses/disablers
|
||||
name = "true stunglasses"
|
||||
desc = "Made for only the best of shitsec. Wear 'em like you're gonna robust all of those fuckers."
|
||||
var/beamtype = /obj/item/projectile/beam/disabler //change for adminbus
|
||||
|
||||
/obj/item/clothing/glasses/hud/security/sunglasses/disablers/ranged_attack(mob/living/carbon/human/user,atom/A, params)
|
||||
user.changeNext_move(CLICK_CD_RANGE)
|
||||
var/obj/item/projectile/beam/disabler/LE = new beamtype( loc )
|
||||
playsound(usr.loc, 'sound/weapons/taser2.ogg', 75, 1)
|
||||
LE.firer = src
|
||||
LE.def_zone = user.get_organ_target()
|
||||
LE.preparePixelProjectile(A, src, params)
|
||||
LE.fire()
|
||||
return TRUE
|
||||
//shamelessly copied
|
||||
@@ -90,7 +90,7 @@
|
||||
|
||||
for(var/i in rad_places)
|
||||
var/turf/place = i
|
||||
if(get_dist(user, place) >= range*2) //Rads are easier to see than wires under the floor
|
||||
if(get_dist(user, place) >= range*8) //Rads are easier to see than wires under the floor
|
||||
continue
|
||||
var/strength = round(rad_places[i] / 1000, 0.1)
|
||||
var/image/pic = new(loc = place)
|
||||
@@ -139,7 +139,6 @@
|
||||
item_state = "trayson-t-ray"
|
||||
desc = "Used by engineering staff to see underfloor objects such as cables and pipes."
|
||||
range = 2
|
||||
|
||||
modes = list(MODE_NONE = MODE_TRAY, MODE_TRAY = MODE_NONE)
|
||||
|
||||
/obj/item/clothing/glasses/meson/engine/tray/prescription
|
||||
@@ -152,7 +151,6 @@
|
||||
icon_state = "trayson-shuttle"
|
||||
item_state = "trayson-shuttle"
|
||||
desc = "Used to see the boundaries of shuttle regions."
|
||||
|
||||
modes = list(MODE_NONE = MODE_SHUTTLE, MODE_SHUTTLE = MODE_NONE)
|
||||
|
||||
#undef MODE_NONE
|
||||
|
||||
@@ -309,4 +309,4 @@
|
||||
//The "pocket" for the M1 helmet so you can tuck things into the elastic band
|
||||
|
||||
/datum/component/storage/concrete/pockets/tiny/spacenam
|
||||
attack_hand_interact = TRUE //So you can actually see what you stuff in there
|
||||
attack_hand_interact = TRUE //So you can actually see what you stuff in there
|
||||
|
||||
@@ -89,12 +89,12 @@
|
||||
|
||||
/obj/item/clothing/shoes/clown_shoes/equipped(mob/user, slot)
|
||||
. = ..()
|
||||
if(user.mind && user.mind.assigned_role == "Clown")
|
||||
if(user.mind && HAS_TRAIT(user.mind, TRAIT_CLOWN_MENTALITY))
|
||||
SEND_SIGNAL(user, COMSIG_CLEAR_MOOD_EVENT, "noshoes")
|
||||
|
||||
/obj/item/clothing/shoes/clown_shoes/dropped(mob/user)
|
||||
. = ..()
|
||||
if(user.mind && user.mind.assigned_role == "Clown")
|
||||
if(user.mind && HAS_TRAIT(user.mind, TRAIT_CLOWN_MENTALITY))
|
||||
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "noshoes", /datum/mood_event/noshoes)
|
||||
|
||||
/obj/item/clothing/shoes/clown_shoes/jester
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
if(!ishuman(user))
|
||||
return
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(!(HAS_TRAIT(H, TRAIT_CLUMSY)) && !(H.mind && H.mind.assigned_role == "Clown"))
|
||||
if(!(HAS_TRAIT(H, TRAIT_CLUMSY)) && !(H.mind && HAS_TRAIT(H.mind, TRAIT_CLOWN_MENTALITY)))
|
||||
return
|
||||
if(slot == SLOT_SHOES)
|
||||
spells = new
|
||||
|
||||
@@ -212,7 +212,7 @@
|
||||
icon_state = "hardsuit0-white"
|
||||
item_state = "ce_helm"
|
||||
item_color = "white"
|
||||
armor = list("melee" = 40, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 90, "fire" = 100, "acid" = 90)
|
||||
armor = list("melee" = 40, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 90)
|
||||
heat_protection = HEAD
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
|
||||
@@ -221,7 +221,7 @@
|
||||
name = "advanced hardsuit"
|
||||
desc = "An advanced suit that protects against hazardous, low pressure environments. Shines with a high polish."
|
||||
item_state = "ce_hardsuit"
|
||||
armor = list("melee" = 40, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 90, "fire" = 100, "acid" = 90)
|
||||
armor = list("melee" = 40, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 50, "bio" = 100, "rad" = 95, "fire" = 100, "acid" = 90)
|
||||
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/elite
|
||||
@@ -445,7 +445,7 @@
|
||||
flash_protect = 0
|
||||
armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 10, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 75)
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
|
||||
scan_reagents = TRUE
|
||||
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS | SCAN_REAGENTS
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/medical
|
||||
icon_state = "hardsuit-medical"
|
||||
@@ -467,7 +467,7 @@
|
||||
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
|
||||
armor = list("melee" = 30, "bullet" = 5, "laser" = 10, "energy" = 5, "bomb" = 100, "bio" = 100, "rad" = 60, "fire" = 60, "acid" = 80)
|
||||
var/obj/machinery/doppler_array/integrated/bomb_radar
|
||||
scan_reagents = TRUE
|
||||
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS | SCAN_REAGENTS
|
||||
actions_types = list(/datum/action/item_action/toggle_helmet_light, /datum/action/item_action/toggle_research_scanner)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/rd/Initialize()
|
||||
@@ -590,8 +590,7 @@
|
||||
/obj/item/clothing/suit/space/hardsuit/clown/mob_can_equip(mob/M, slot)
|
||||
if(!..() || !ishuman(M))
|
||||
return FALSE
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.mind.assigned_role == "Clown")
|
||||
if(M.mind && HAS_TRAIT(M.mind, TRAIT_CLOWN_MENTALITY))
|
||||
return TRUE
|
||||
else
|
||||
return FALSE
|
||||
@@ -638,7 +637,7 @@
|
||||
armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
|
||||
item_color = "ancient"
|
||||
brightness_on = 16
|
||||
scan_reagents = TRUE
|
||||
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS | SCAN_REAGENTS
|
||||
flash_protect = 5 //We will not be flash by bombs
|
||||
tint = 1
|
||||
var/obj/machinery/doppler_array/integrated/bomb_radar
|
||||
|
||||
@@ -742,6 +742,7 @@
|
||||
name = "assistant's formal winter coat"
|
||||
icon_state = "coataformal"
|
||||
item_state = "coataformal"
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter,/obj/item/clothing/gloves/color/yellow)
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/aformal
|
||||
|
||||
/obj/item/clothing/head/hooded/winterhood/aformal
|
||||
@@ -762,7 +763,10 @@
|
||||
name = "ratvarian winter coat"
|
||||
icon_state = "coatratvar"
|
||||
item_state = "coatratvar"
|
||||
armor = list("melee" = 30, "bullet" = 45, "laser" = -10, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60)
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/clockwork/replica_fabricator, /obj/item/clockwork/integration_cog, /obj/item/clockwork/slab, /obj/item/clockwork/weapon/ratvarian_spear)
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/ratvar
|
||||
var/real = TRUE
|
||||
|
||||
/obj/item/clothing/head/hooded/winterhood/ratvar
|
||||
icon_state = "winterhood_ratvar"
|
||||
@@ -770,15 +774,59 @@
|
||||
light_power = 1
|
||||
light_color = "#B18B25" //clockwork slab background top color
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/ratvar/equipped(mob/living/user,slot)
|
||||
..()
|
||||
if (slot != SLOT_WEAR_SUIT || !real)
|
||||
return
|
||||
if (is_servant_of_ratvar(user))
|
||||
return
|
||||
else
|
||||
user.dropItemToGround(src)
|
||||
to_chat(user,"<span class='large_brass'>\"Amusing that you think you are fit to wear this.\"</span>")
|
||||
to_chat(user,"<span class='userdanger'>Your skin burns where the coat touched your skin!</span>")
|
||||
user.adjustFireLoss(rand(10,16))
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/narsie
|
||||
name = "narsian winter coat"
|
||||
icon_state = "coatnarsie"
|
||||
item_state = "coatnarsie"
|
||||
armor = list("melee" = 30, "bullet" = 20, "laser" = 30,"energy" = 10, "bomb" = 30, "bio" = 10, "rad" = 10, "fire" = 30, "acid" = 30)
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/restraints/legcuffs/bola/cult,/obj/item/melee/cultblade,/obj/item/melee/cultblade/dagger,/obj/item/reagent_containers/glass/beaker/unholywater,/obj/item/cult_shift,/obj/item/flashlight/flare/culttorch,/obj/item/twohanded/cult_spear)
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/narsie
|
||||
var/real = TRUE
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/narsie/equipped(mob/living/user,slot)
|
||||
..()
|
||||
if (slot != SLOT_WEAR_SUIT || !real)
|
||||
return
|
||||
if (iscultist(user))
|
||||
return
|
||||
else
|
||||
user.dropItemToGround(src)
|
||||
to_chat(user,"<span class='cultlarge'>\"You are not fit to wear my follower's coat!\"</span>")
|
||||
to_chat(user,"<span class='userdanger'>Sharp spines jab you from within the coat!</span>")
|
||||
user.adjustBruteLoss(rand(10,16))
|
||||
|
||||
/obj/item/clothing/head/hooded/winterhood/narsie
|
||||
icon_state = "winterhood_narsie"
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/ratvar/fake
|
||||
name = "brass winter coat"
|
||||
icon_state = "coatratvar"
|
||||
item_state = "coatratvar"
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
real = FALSE
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/narsie/fake
|
||||
name = "runed winter coat"
|
||||
icon_state = "coatnarsie"
|
||||
item_state = "coatnarsie"
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
|
||||
real = FALSE
|
||||
|
||||
|
||||
/obj/item/clothing/suit/spookyghost
|
||||
name = "spooky ghost"
|
||||
desc = "This is obviously just a bedsheet, but maybe try it on?"
|
||||
|
||||
@@ -50,7 +50,8 @@
|
||||
icon_state = "reactiveoff"
|
||||
item_state = "reactiveoff"
|
||||
add_fingerprint(user)
|
||||
return
|
||||
if(user.get_item_by_slot(SLOT_WEAR_SUIT) == src)
|
||||
user.update_inv_wear_suit()
|
||||
|
||||
/obj/item/clothing/suit/armor/reactive/emp_act(severity)
|
||||
. = ..()
|
||||
@@ -71,8 +72,9 @@
|
||||
reactivearmor_cooldown_duration = 100
|
||||
|
||||
/obj/item/clothing/suit/armor/reactive/teleport/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
|
||||
. = FALSE
|
||||
if(!active)
|
||||
return 0
|
||||
return
|
||||
if(prob(hit_reaction_chance))
|
||||
var/mob/living/carbon/human/H = owner
|
||||
if(world.time < reactivearmor_cooldown)
|
||||
@@ -95,12 +97,11 @@
|
||||
var/turf/picked = pick(turfs)
|
||||
if(!isturf(picked))
|
||||
return
|
||||
H.forceMove(picked)
|
||||
do_teleport(H, picked, no_effects = TRUE, channel = TELEPORT_CHANNEL_WORMHOLE)
|
||||
radiation_pulse(old, rad_amount_before)
|
||||
radiation_pulse(src, rad_amount)
|
||||
reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration
|
||||
return 1
|
||||
return 0
|
||||
return TRUE
|
||||
|
||||
//Fire
|
||||
|
||||
|
||||
@@ -467,6 +467,33 @@
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/sundresswhite
|
||||
name = "white sundress"
|
||||
desc = "Makes you want to frolic in a field of lillies."
|
||||
icon_state = "sundress_white"
|
||||
item_color = "sundress_white"
|
||||
body_parts_covered = CHEST|GROIN
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/greendress
|
||||
name = "green dress"
|
||||
desc = "A tight green dress"
|
||||
icon_state = "dress_green"
|
||||
item_color = "dress_green"
|
||||
body_parts_covered = CHEST|GROIN
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/pinkdress
|
||||
name = "pink dress"
|
||||
desc = "A tight pink dress"
|
||||
icon_state = "dress_pink"
|
||||
item_color = "dress_pink"
|
||||
body_parts_covered = CHEST|GROIN
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/captainparade
|
||||
name = "captain's parade uniform"
|
||||
desc = "A captain's luxury-wear, for special occasions."
|
||||
@@ -509,6 +536,24 @@
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/westernbustle
|
||||
name = "western bustle dress"
|
||||
desc = "Filled with Western fire."
|
||||
icon_state = "western_bustle"
|
||||
item_state = "wcoat"
|
||||
item_color = "western_bustle"
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/flamenco
|
||||
name = "flamenco dress"
|
||||
desc = "Filled with Latin fire."
|
||||
icon_state = "flamenco"
|
||||
item_state = "wcoat"
|
||||
item_color = "flamenco"
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/stripeddress
|
||||
name = "striped dress"
|
||||
desc = "Fashion in space."
|
||||
@@ -529,6 +574,44 @@
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/flowerdress
|
||||
name = "flower dress"
|
||||
desc = "Lovely dress"
|
||||
icon_state = "flower_dress"
|
||||
item_state = "sailordress"
|
||||
item_color = "flower_dress"
|
||||
body_parts_covered = CHEST|GROIN
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/sweptskirt
|
||||
name = "swept skirt"
|
||||
desc = "Formal skirt"
|
||||
icon_state = "skirt_swept"
|
||||
item_color = "skirt_swept"
|
||||
body_parts_covered = GROIN
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/corset
|
||||
name = "black corset"
|
||||
desc = "Nanotrasen is not resposible for any organ damage"
|
||||
icon_state = "corset"
|
||||
item_color = "corset"
|
||||
body_parts_covered = CHEST|GROIN
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/croptop
|
||||
name = "crop top"
|
||||
desc = "We've saved money by giving you half a shirt!"
|
||||
icon_state = "sailor_dress"
|
||||
item_state = "sailordress"
|
||||
item_color = "sailor_dress"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
fitted = FEMALE_UNIFORM_TOP
|
||||
can_adjust = FALSE
|
||||
|
||||
/obj/item/clothing/under/redeveninggown
|
||||
name = "red evening gown"
|
||||
desc = "Fancy dress for space bar singers."
|
||||
|
||||
@@ -75,3 +75,34 @@
|
||||
desc = "A pair of woodland camouflage pants. Probably not the best choice for a space station."
|
||||
icon_state = "camopants"
|
||||
item_color = "camopants"
|
||||
|
||||
/obj/item/clothing/under/pants/jeanripped
|
||||
name = "ripped jeans"
|
||||
desc = "If you're wearing this you're poor or a rebel"
|
||||
icon_state = "jean_ripped"
|
||||
item_color = "jean_ripped"
|
||||
|
||||
/obj/item/clothing/under/pants/jeanshort
|
||||
name = "jean shorts"
|
||||
desc = "These are really just jeans cut in half"
|
||||
icon_state = "jean_shorts"
|
||||
item_color = "jean_shorts"
|
||||
|
||||
/obj/item/clothing/under/pants/denimskirt
|
||||
name = "denim skirt"
|
||||
desc = "These are really just a jean leg hole cut from a pair"
|
||||
icon_state = "denim_skirt"
|
||||
item_color = "denim_skirt"
|
||||
|
||||
/obj/item/clothing/under/pants/chaps
|
||||
name = "black chaps"
|
||||
body_parts_covered = LEGS
|
||||
desc = "Yeehaw"
|
||||
icon_state = "chaps"
|
||||
item_color = "chaps"
|
||||
|
||||
/obj/item/clothing/under/pants/yoga
|
||||
name = "yoga pants"
|
||||
desc = "Comfy!"
|
||||
icon_state = "yoga_pants"
|
||||
item_color = "yoga_pants"
|
||||
|
||||
@@ -0,0 +1,166 @@
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Polychromic Uniforms: //
|
||||
// //
|
||||
// Polychromic clothes simply consist of 4 sprites: A base, unrecoloured sprite, and up to 3 greyscaled sprites. //
|
||||
// In order to add more polychromic clothes, simply create a base sprite, and up to 3 recolourable overlays for it, //
|
||||
// and then name them as follows: [name], [name]-primary, [name]-secondary, [name]-tertiary. The sprites should //
|
||||
// ideally be in 'icons/obj/clothing/uniform.dmi' and 'icons/mob/uniform.dmi' for the //
|
||||
// worn sprites. After that, copy paste the code from any of the example clothes and //
|
||||
// change the names around. [name] should go in BOTH icon_state and item_color. You can preset colors and disable //
|
||||
// any overlays using the self-explainatory vars. //
|
||||
// //
|
||||
// -Tori //
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/obj/item/clothing/under/polychromic //enables all three overlays to reduce copypasta and defines basic stuff
|
||||
name = "polychromic suit"
|
||||
desc = "For when you want to show off your horrible colour coordination skills."
|
||||
icon_state = "polysuit"
|
||||
item_color = "polysuit"
|
||||
item_state = "sl_suit"
|
||||
hasprimary = TRUE
|
||||
hassecondary = TRUE
|
||||
hastertiary = TRUE
|
||||
primary_color = "#FFFFFF" //RGB in hexcode
|
||||
secondary_color = "#FFFFFF"
|
||||
tertiary_color = "#808080"
|
||||
can_adjust = FALSE
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION //Not all clothes are currently digi-compatible (only the shorts are as of time of writing)
|
||||
|
||||
/obj/item/clothing/under/polychromic/worn_overlays(isinhands, icon_file) //this is where the main magic happens.
|
||||
. = ..()
|
||||
if(hasprimary | hassecondary | hastertiary)
|
||||
if(!isinhands) //prevents the worn sprites from showing up if you're just holding them
|
||||
if(hasprimary) //checks if overlays are enabled
|
||||
var/mutable_appearance/primary_worn = mutable_appearance(icon_file, "[item_color]-primary") //automagical sprite selection
|
||||
primary_worn.color = primary_color //colors the overlay
|
||||
. += primary_worn //adds the overlay onto the buffer list to draw on the mob sprite.
|
||||
if(hassecondary)
|
||||
var/mutable_appearance/secondary_worn = mutable_appearance(icon_file, "[item_color]-secondary")
|
||||
secondary_worn.color = secondary_color
|
||||
. += secondary_worn
|
||||
if(hastertiary)
|
||||
var/mutable_appearance/tertiary_worn = mutable_appearance(icon_file, "[item_color]-tertiary")
|
||||
tertiary_worn.color = tertiary_color
|
||||
. += tertiary_worn
|
||||
|
||||
/obj/item/clothing/under/polychromic/shirt //COPY PASTE THIS TO MAKE A NEW THING
|
||||
name = "polychromic button-up shirt"
|
||||
desc = "A fancy button-up shirt made with polychromic threads."
|
||||
icon_state = "polysuit"
|
||||
item_color = "polysuit"
|
||||
item_state = "sl_suit"
|
||||
primary_color = "#FFFFFF" //RGB in hexcode
|
||||
secondary_color = "#353535"
|
||||
tertiary_color = "#353535"
|
||||
|
||||
/obj/item/clothing/under/polychromic/kilt
|
||||
name = "polychromic kilt"
|
||||
desc = "It's not a skirt!"
|
||||
icon_state = "polykilt"
|
||||
item_color = "polykilt"
|
||||
item_state = "kilt"
|
||||
primary_color = "#FFFFFF" //RGB in hexcode
|
||||
secondary_color = "#F08080"
|
||||
hastertiary = FALSE // so it doesn't futz with digilegs
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
|
||||
/obj/item/clothing/under/polychromic/skirt
|
||||
name = "polychromic skirt"
|
||||
desc = "A fancy skirt made with polychromic threads."
|
||||
icon_state = "polyskirt"
|
||||
item_color = "polyskirt"
|
||||
item_state = "rainbow"
|
||||
primary_color = "#FFFFFF" //RGB in hexcode
|
||||
secondary_color = "#F08080"
|
||||
tertiary_color = "#808080"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
|
||||
/obj/item/clothing/under/polychromic/shorts
|
||||
name = "polychromic shorts"
|
||||
desc = "For ease of movement and style."
|
||||
icon_state = "polyshorts"
|
||||
item_color = "polyshorts"
|
||||
item_state = "rainbow"
|
||||
primary_color = "#353535" //RGB in hexcode
|
||||
secondary_color = "#808080"
|
||||
tertiary_color = "#808080"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
mutantrace_variation = MUTANTRACE_VARIATION //to enable digitigrade wearing
|
||||
|
||||
/obj/item/clothing/under/polychromic/jumpsuit
|
||||
name = "polychromic tri-tone jumpsuit"
|
||||
desc = "A fancy jumpsuit made with polychromic threads."
|
||||
icon_state = "polyjump"
|
||||
item_color = "polyjump"
|
||||
item_state = "rainbow"
|
||||
primary_color = "#FFFFFF" //RGB in hexcode
|
||||
secondary_color = "#808080"
|
||||
tertiary_color = "#FF3535"
|
||||
|
||||
/obj/item/clothing/under/polychromic/shortpants
|
||||
name = "polychromic athletic shorts"
|
||||
desc = "95% Polychrome, 5% Spandex!"
|
||||
icon_state = "polyshortpants"
|
||||
item_color = "polyshortpants"
|
||||
item_state = "rainbow"
|
||||
hastertiary = FALSE
|
||||
primary_color = "#FFFFFF" //RGB in hexcode
|
||||
secondary_color = "#F08080"
|
||||
gender = PLURAL //Because shortS
|
||||
body_parts_covered = GROIN //Because there's no shirt included
|
||||
|
||||
/obj/item/clothing/under/polychromic/pleat
|
||||
name = "polychromic pleated skirt"
|
||||
desc = "A magnificent pleated skirt complements the woolen polychromatic sweater."
|
||||
icon_state = "polypleat"
|
||||
item_color = "polypleat"
|
||||
item_state = "rainbow"
|
||||
primary_color = "#8CC6FF" //RGB in hexcode
|
||||
secondary_color = "#808080"
|
||||
tertiary_color = "#FF3535"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
|
||||
/obj/item/clothing/under/polychromic/femtank
|
||||
name = "polychromic feminine tank top"
|
||||
desc = "Great for showing off your chest in style. Not recommended for males."
|
||||
icon_state = "polyfemtankpantsu"
|
||||
item_color = "polyfemtankpantsu"
|
||||
item_state = "rainbow"
|
||||
hastertiary = FALSE
|
||||
primary_color = "#808080" //RGB in hexcode
|
||||
secondary_color = "#FF3535"
|
||||
body_parts_covered = CHEST|GROIN|ARMS
|
||||
|
||||
/obj/item/clothing/under/polychromic/shortpants/pantsu
|
||||
name = "polychromic panties"
|
||||
desc = "Topless striped panties. Now with 120% more polychrome!"
|
||||
icon_state = "polypantsu"
|
||||
item_color = "polypantsu"
|
||||
item_state = "rainbow"
|
||||
hastertiary = FALSE
|
||||
primary_color = "#FFFFFF" //RGB in hexcode
|
||||
secondary_color = "#8CC6FF"
|
||||
body_parts_covered = GROIN
|
||||
|
||||
/obj/item/clothing/under/polychromic/bottomless
|
||||
name = "polychromic bottomless shirt"
|
||||
desc = "Great for showing off your junk in dubious style."
|
||||
icon_state = "polybottomless"
|
||||
item_color = "polybottomless"
|
||||
item_state = "rainbow"
|
||||
hastertiary = FALSE
|
||||
primary_color = "#808080" //RGB in hexcode
|
||||
secondary_color = "#FF3535"
|
||||
body_parts_covered = CHEST|ARMS //Because there's no bottom included
|
||||
|
||||
/obj/item/clothing/under/polychromic/shimatank
|
||||
name = "polychromic tank top"
|
||||
desc = "For those lazy summer days."
|
||||
icon_state = "polyshimatank"
|
||||
item_color = "polyshimatank"
|
||||
item_state = "rainbow"
|
||||
primary_color = "#808080" //RGB in hexcode
|
||||
secondary_color = "#FFFFFF"
|
||||
tertiary_color = "#8CC6FF"
|
||||
body_parts_covered = CHEST|GROIN
|
||||
@@ -163,26 +163,7 @@
|
||||
name = "Cosmic Winter Coat"
|
||||
result = /obj/item/clothing/suit/hooded/wintercoat/cosmic
|
||||
reqs = list(/obj/item/clothing/suit/hooded/wintercoat = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/captain = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/hop = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/hos = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/rd = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/ce = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/cmo = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/qm = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/robotics = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/engineering/atmos = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/engineering = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/science = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/genetics = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/chemistry = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/medical = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/viro = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/janitor = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/security = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/cargo = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/hydro = 1,
|
||||
/obj/item/clothing/suit/hooded/wintercoat/miner = 1)
|
||||
/obj/item/bedsheet/cosmos = 1)
|
||||
time = 60
|
||||
always_availible = TRUE
|
||||
category = CAT_CLOTHING
|
||||
|
||||
@@ -358,3 +358,11 @@
|
||||
time = 100
|
||||
category = CAT_MISC
|
||||
always_availible = FALSE // Disabled til learned
|
||||
|
||||
/datum/crafting_recipe/coconut_bong
|
||||
name = "Coconut Bong"
|
||||
result = /obj/item/bong/coconut
|
||||
reqs = list(/obj/item/stack/sheet/mineral/bamboo = 2,
|
||||
/obj/item/reagent_containers/food/snacks/grown/coconut = 1)
|
||||
time = 70
|
||||
category = CAT_MISC
|
||||
@@ -37,6 +37,8 @@
|
||||
continue
|
||||
if(!H.client)
|
||||
continue
|
||||
if(HAS_TRAIT(H,TRAIT_EXEMPT_HEALTH_EVENTS))
|
||||
continue
|
||||
if(H.stat == DEAD)
|
||||
continue
|
||||
if(HAS_TRAIT(H, TRAIT_VIRUSIMMUNE)) //Don't pick someone who's virus immune, only for it to not do anything.
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
/datum/round_event/heart_attack/start()
|
||||
var/list/heart_attack_contestants = list()
|
||||
for(var/mob/living/carbon/human/H in shuffle(GLOB.player_list))
|
||||
if(!H.client || H.stat == DEAD || H.InCritical() || !H.can_heartattack() || H.has_status_effect(STATUS_EFFECT_EXERCISED) || (/datum/disease/heart_failure in H.diseases) || H.undergoing_cardiac_arrest())
|
||||
if(!H.client || H.stat == DEAD || H.InCritical() || !H.can_heartattack() || H.has_status_effect(STATUS_EFFECT_EXERCISED) || (/datum/disease/heart_failure in H.diseases) || H.undergoing_cardiac_arrest() || HAS_TRAIT(H,TRAIT_EXEMPT_HEALTH_EVENTS))
|
||||
continue
|
||||
if(H.satiety <= -60) //Multiple junk food items recently
|
||||
heart_attack_contestants[H] = 3
|
||||
|
||||
@@ -35,4 +35,6 @@
|
||||
/datum/hallucination/delusion,
|
||||
/datum/hallucination/oh_yeah)
|
||||
for(var/mob/living/carbon/C in GLOB.alive_mob_list)
|
||||
if (HAS_TRAIT(C,TRAIT_EXEMPT_HEALTH_EVENTS))
|
||||
continue
|
||||
new picked_hallucination(C, TRUE)
|
||||
@@ -15,6 +15,8 @@
|
||||
continue
|
||||
if(H.stat == DEAD)
|
||||
continue
|
||||
if (HAS_TRAIT(H,TRAIT_EXEMPT_HEALTH_EVENTS))
|
||||
continue
|
||||
if(!H.getorgan(/obj/item/organ/appendix)) //Don't give the disease to some who lacks it, only for it to be auto-cured
|
||||
continue
|
||||
if(!(MOB_ORGANIC in H.mob_biotypes)) //biotype sleeper bugs strike again, once again making appendicitis pick a target that can't take it
|
||||
|
||||
@@ -132,14 +132,10 @@
|
||||
transfer_fingerprints_to(B)
|
||||
qdel(src)
|
||||
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// Drinks. END
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/trophy
|
||||
name = "pewter cup"
|
||||
desc = "Everyone gets a trophy."
|
||||
@@ -178,7 +174,6 @@
|
||||
materials = list(MAT_SILVER=800)
|
||||
volume = 100
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/trophy/bronze_cup
|
||||
name = "bronze cup"
|
||||
desc = "At least you ranked!"
|
||||
@@ -190,7 +185,7 @@
|
||||
materials = list(MAT_METAL=400)
|
||||
volume = 25
|
||||
|
||||
///////////////////////////////////////////////Drinks
|
||||
///////////////////////////////////////////////Drinks/////////////////////////////////////////
|
||||
//Notes by Darem: Drinks are simply containers that start preloaded. Unlike condiments, the contents can be ingested directly
|
||||
// rather then having to add it to something else first. They should only contain liquids. They have a default container size of 50.
|
||||
// Formatting is the same as food.
|
||||
@@ -203,6 +198,7 @@
|
||||
spillable = TRUE
|
||||
resistance_flags = FREEZE_PROOF
|
||||
isGlass = FALSE
|
||||
foodtype = BREAKFAST
|
||||
|
||||
//Used by MREs
|
||||
/obj/item/reagent_containers/food/drinks/coffee/type2
|
||||
@@ -211,7 +207,6 @@
|
||||
icon = 'icons/obj/food/containers.dmi'
|
||||
icon_state = "condi_cornoil"
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/ice
|
||||
name = "ice cup"
|
||||
desc = "Careful, cold ice, do not chew."
|
||||
@@ -243,10 +238,8 @@
|
||||
desc = "Made in Space South America."
|
||||
list_reagents = list("hot_coco" = 30, "sugar" = 5)
|
||||
foodtype = SUGAR
|
||||
|
||||
resistance_flags = FREEZE_PROOF
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/dry_ramen
|
||||
name = "cup ramen"
|
||||
desc = "Just add 10ml of water, self heats! A taste that reminds you of your school years."
|
||||
@@ -325,27 +318,27 @@
|
||||
icon_state = "orangebox"
|
||||
name = "orange juice box"
|
||||
desc = "A great source of vitamins. Stay healthy!"
|
||||
foodtype = FRUIT
|
||||
foodtype = FRUIT | BREAKFAST
|
||||
if("milk")
|
||||
icon_state = "milkbox"
|
||||
name = "carton of milk"
|
||||
desc = "An excellent source of calcium for growing space explorers."
|
||||
foodtype = DAIRY
|
||||
foodtype = DAIRY | BREAKFAST
|
||||
if("applejuice")
|
||||
icon_state = "juicebox"
|
||||
name = "apple juice box"
|
||||
desc = "Sweet apple juice. Don't be late for school!"
|
||||
foodtype = FRUIT
|
||||
foodtype = FRUIT | BREAKFAST
|
||||
if("grapejuice")
|
||||
icon_state = "grapebox"
|
||||
name = "grape juice box"
|
||||
desc = "Tasty grape juice in a fun little container. Non-alcoholic!"
|
||||
foodtype = FRUIT
|
||||
foodtype = FRUIT | BREAKFAST
|
||||
if("chocolate_milk")
|
||||
icon_state = "chocolatebox"
|
||||
name = "carton of chocolate milk"
|
||||
desc = "Milk for cool kids!"
|
||||
foodtype = SUGAR
|
||||
foodtype = SUGAR | BREAKFAST
|
||||
if("eggnog")
|
||||
icon_state = "nog2"
|
||||
name = "carton of eggnog"
|
||||
@@ -357,8 +350,7 @@
|
||||
desc = "A small carton, intended for holding drinks."
|
||||
|
||||
|
||||
|
||||
//////////////////////////drinkingglass and shaker//
|
||||
//////////////////////////drinkingglass and shaker/////////////////////////////////////////////////////////////////////////////////////
|
||||
//Note by Darem: This code handles the mixing of drinks. New drinks go in three places: In Chemistry-Reagents.dm (for the drink
|
||||
// itself), in Chemistry-Recipes.dm (for the reaction that changes the components into the drink), and here (for the drinking glass
|
||||
// icon states.
|
||||
@@ -399,8 +391,8 @@
|
||||
volume = 30
|
||||
spillable = TRUE
|
||||
|
||||
//////////////////////////soda_cans//
|
||||
//These are in their own group to be used as IED's in /obj/item/grenade/ghettobomb.dm
|
||||
//////////////////////////soda_cans////////////////////////////////////////////////////
|
||||
//These are in their own group to be used as IED's in /obj/item/grenade/ghettobomb.dm//
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans
|
||||
name = "soda can"
|
||||
@@ -426,7 +418,6 @@
|
||||
qdel(src)
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/attack_self(mob/user)
|
||||
if(!is_drainable())
|
||||
to_chat(user, "You pull back the tab of \the [src] with a satisfying pop.") //Ahhhhhhhh
|
||||
@@ -514,6 +505,13 @@
|
||||
list_reagents = list("shamblers" = 30)
|
||||
foodtype = SUGAR | JUNKFOOD
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/buzz_fuzz
|
||||
name = "Buzz Fuzz"
|
||||
desc = "The sister drink of Shambler's Juice! Uses real honey, making it a sweet tooth's dream drink. The slogan reads ''A Hive of Flavour'', there's also a label about how it is adddicting."
|
||||
icon_state = "honeysoda_can"
|
||||
list_reagents = list("buzz_fuzz" = 25, "honey" = 5)
|
||||
foodtype = SUGAR | JUNKFOOD
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/grey_bull
|
||||
name = "Grey Bull"
|
||||
desc = "Grey Bull, it gives you gloves!"
|
||||
@@ -526,3 +524,10 @@
|
||||
desc = "There is no air shortage. Do not drink."
|
||||
icon_state = "air"
|
||||
list_reagents = list("nitrogen" = 24, "oxygen" = 6)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy
|
||||
name = "Monkey Energy"
|
||||
desc = "Unleash the ape!"
|
||||
icon_state = "monkey_energy"
|
||||
list_reagents = list("monkey_energy" = 50)
|
||||
foodtype = SUGAR | JUNKFOOD
|
||||
|
||||
@@ -429,7 +429,7 @@
|
||||
righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
|
||||
isGlass = FALSE
|
||||
list_reagents = list("orangejuice" = 100)
|
||||
foodtype = FRUIT
|
||||
foodtype = FRUIT| BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/cream
|
||||
name = "milk cream"
|
||||
|
||||
@@ -5,6 +5,9 @@
|
||||
/// the parent to the exclusion list in code/__HELPERS/unsorted.dm's
|
||||
/// get_random_food proc.
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define STOP_SERVING_BREAKFAST (15 MINUTES)
|
||||
|
||||
/obj/item/reagent_containers/food
|
||||
possible_transfer_amounts = list()
|
||||
volume = 50 //Sets the default container amount for all food items.
|
||||
@@ -40,4 +43,8 @@
|
||||
if(foodtype & H.dna.species.toxic_food)
|
||||
to_chat(H, "<span class='warning'>You don't feel so good...</span>")
|
||||
H.adjust_disgust(25 + 30 * fraction)
|
||||
if((foodtype & BREAKFAST) && world.time - SSticker.round_start_time < STOP_SERVING_BREAKFAST)
|
||||
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "breakfast", /datum/mood_event/breakfast)
|
||||
last_check_time = world.time
|
||||
|
||||
#undef STOP_SERVING_BREAKFAST
|
||||
@@ -26,6 +26,7 @@
|
||||
"cornoil" = list("oliveoil", "corn oil bottle", "A delicious oil used in cooking. Made from corn"),
|
||||
"sugar" = list("emptycondiment", "sugar bottle", "Tasty spacey sugar!"),
|
||||
"mayonnaise" = list("mayonnaise", "mayonnaise jar", "An oily condiment made from egg yolks."),
|
||||
"bbqsauce" = list("condi_bbq", "BBQ sauce", "Hand wipes not included."),
|
||||
"peanut_butter" = list("peanutbutter", "peanut butter jar", "A deliciously and sticky spread made from peanuts."))
|
||||
var/originalname = "condiment" //Can't use initial(name) for this. This stores the name set by condimasters.
|
||||
|
||||
@@ -299,3 +300,8 @@
|
||||
name = "astrotame pack"
|
||||
originalname = "astrotame"
|
||||
list_reagents = list("astrotame" = 5)
|
||||
|
||||
/obj/item/reagent_containers/food/condiment/pack/bbqsauce
|
||||
name = "bbq sauce pack"
|
||||
originalname = "bbq sauce"
|
||||
list_reagents = list("bbqsauce" = 10)
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
mix_filling_color(S)
|
||||
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.
|
||||
foodtype |= S.foodtype
|
||||
update_overlays(S)
|
||||
update_snack_overlays(S)
|
||||
to_chat(user, "<span class='notice'>You add the [I.name] to the [name].</span>")
|
||||
update_name(S)
|
||||
else
|
||||
@@ -103,7 +103,7 @@
|
||||
rgbcolor[4] = (customcolor[4]+ingcolor[4])/2
|
||||
filling_color = rgb(rgbcolor[1], rgbcolor[2], rgbcolor[3], rgbcolor[4])
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/customizable/update_overlays(obj/item/reagent_containers/food/snacks/S)
|
||||
/obj/item/reagent_containers/food/snacks/customizable/update_snack_overlays(obj/item/reagent_containers/food/snacks/S)
|
||||
var/mutable_appearance/filling = mutable_appearance(icon, "[initial(icon_state)]_filling")
|
||||
if(S.filling_color == "#FFFFFF")
|
||||
filling.color = pick("#FF0000","#0000FF","#008000","#FFFF00")
|
||||
@@ -139,7 +139,7 @@
|
||||
/obj/item/reagent_containers/food/snacks/customizable/initialize_slice(obj/item/reagent_containers/food/snacks/slice, reagents_per_slice)
|
||||
..()
|
||||
slice.filling_color = filling_color
|
||||
slice.update_overlays(src)
|
||||
slice.update_snack_overlays(src)
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/customizable/Destroy()
|
||||
|
||||
@@ -52,6 +52,8 @@ All foods are distributed among various categories. Use common sense.
|
||||
var/list/bonus_reagents //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
|
||||
var/list/tastes // for example list("crisps" = 2, "salt" = 1)
|
||||
var/dunkable = FALSE // for dunkable food, make true
|
||||
var/dunk_amount = 10 // how much reagent is transferred per dunk
|
||||
|
||||
//Placeholder for effect that trigger on eating that aren't tied to reagents.
|
||||
|
||||
@@ -267,7 +269,7 @@ All foods are distributed among various categories. Use common sense.
|
||||
trash = null
|
||||
return
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/proc/update_overlays(obj/item/reagent_containers/food/snacks/S)
|
||||
/obj/item/reagent_containers/food/snacks/proc/update_snack_overlays(obj/item/reagent_containers/food/snacks/S)
|
||||
cut_overlays()
|
||||
var/mutable_appearance/filling = mutable_appearance(icon, "[initial(icon_state)]_filling")
|
||||
if(S.filling_color == "#FFFFFF")
|
||||
@@ -328,6 +330,24 @@ All foods are distributed among various categories. Use common sense.
|
||||
M.emote("me", EMOTE_VISIBLE, "[sattisfaction_text]")
|
||||
qdel(src)
|
||||
|
||||
//////////////////////////////////////////Dunking///////////////////////////////////////////
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/afterattack(obj/item/reagent_containers/M, mob/user, proximity)
|
||||
. = ..()
|
||||
if(!dunkable || !proximity)
|
||||
return
|
||||
if(istype(M, /obj/item/reagent_containers/glass) || istype(M, /obj/item/reagent_containers/food/drinks)) //you can dunk dunkable snacks into beakers or drinks
|
||||
if(!M.is_drainable())
|
||||
to_chat(user, "<span class='warning'>[M] is unable to be dunked in!</span>")
|
||||
return
|
||||
if(M.reagents.trans_to(src, dunk_amount)) //if reagents were transfered, show the message
|
||||
to_chat(user, "<span class='notice'>You dunk the [M].</span>")
|
||||
return
|
||||
if(!M.reagents.total_volume)
|
||||
to_chat(user, "<span class='warning'>[M] is empty!</span>")
|
||||
else
|
||||
to_chat(user, "<span class='warning'>[src] is full!</span>")
|
||||
|
||||
// //////////////////////////////////////////////Store////////////////////////////////////////
|
||||
/// All the food items that can store an item inside itself, like bread or cake.
|
||||
/obj/item/reagent_containers/food/snacks/store
|
||||
|
||||
@@ -57,6 +57,33 @@
|
||||
else if(subjectjob)
|
||||
S.name = "[subjectjob] meatsteak"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/rawcrab
|
||||
name = "raw crab meat"
|
||||
desc = "A pile of raw crab meat."
|
||||
icon_state = "crabmeatraw"
|
||||
cooked_type = /obj/item/reagent_containers/food/snacks/meat/crab
|
||||
bitesize = 3
|
||||
list_reagents = list("nutriment" = 1, "cooking_oil" = 3)
|
||||
filling_color = "#EAD079"
|
||||
tastes = list("raw crab" = 1)
|
||||
foodtype = RAW | MEAT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/crab
|
||||
name = "crab meat"
|
||||
desc = "Some deliciously cooked crab meat."
|
||||
icon_state = "crabmeat"
|
||||
list_reagents = list("nutriment" = 2)
|
||||
bonus_reagents = list("nutriment" = 3, "vitamin" = 2, "cooking_oil" = 2)
|
||||
filling_color = "#DFB73A"
|
||||
tastes = list("crab" = 1)
|
||||
foodtype = MEAT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/chicken
|
||||
name = "chicken meat"
|
||||
desc = "A slab of raw chicken. Remember to wash your hands!"
|
||||
cooked_type = /obj/item/reagent_containers/food/snacks/meat/steak/chicken
|
||||
slice_path = /obj/item/reagent_containers/food/snacks/meat/rawcutlet/chicken
|
||||
tastes = list("chicken" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/slime
|
||||
icon_state = "slimemeat"
|
||||
@@ -132,6 +159,28 @@
|
||||
tastes = list("brains" = 1, "meat" = 1)
|
||||
foodtype = RAW | MEAT | TOXIC
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/carpmeat/aquatic
|
||||
name = "fillet"
|
||||
desc = "A fillet of one of the local water dwelling species."
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/ipc
|
||||
icon_state = "ipcmeat"
|
||||
desc = "Gross robot meat."
|
||||
filling_color = "#000000"
|
||||
tastes = list("metal" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/avian
|
||||
desc = "Tastes like chicken, that's because it is!"
|
||||
icon_state = "birdmeat"
|
||||
filling_color = "#BF896B"
|
||||
tastes = list("chicken" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/mammal
|
||||
desc = "Tastes sweet... reminds you vaguely of chicken."
|
||||
filling_color = "#6B8E23"
|
||||
tastes = list("brains" = 1, "meat" = 1)
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////// OTHER MEATS ////////////////////////////////////////////////////////
|
||||
|
||||
@@ -183,7 +232,6 @@
|
||||
tastes = list("meat" = 1, "salmon" = 1)
|
||||
foodtype = RAW | MEAT
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/xeno
|
||||
name = "xeno meat"
|
||||
desc = "A slab of meat."
|
||||
@@ -207,7 +255,6 @@
|
||||
tastes = list("cobwebs" = 1)
|
||||
foodtype = RAW | MEAT | TOXIC
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/goliath
|
||||
name = "goliath meat"
|
||||
desc = "A slab of goliath meat. It's not very edible now, but it cooks great in lava."
|
||||
@@ -255,7 +302,7 @@
|
||||
bonus_reagents = list("nutriment" = 1, "vitamin" = 1, "cooking_oil" = 2)
|
||||
filling_color = "#854817"
|
||||
tastes = list("bacon" = 1)
|
||||
foodtype = MEAT
|
||||
foodtype = MEAT | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/slab/gondola
|
||||
name = "gondola meat"
|
||||
@@ -281,6 +328,10 @@
|
||||
foodtype = MEAT
|
||||
tastes = list("meat" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/steak/chicken
|
||||
name = "chicken steak" //Can you have chicken steaks? Maybe this should be renamed once it gets new sprites.
|
||||
tastes = list("chicken" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/steak/plain
|
||||
foodtype = MEAT
|
||||
|
||||
@@ -288,6 +339,10 @@
|
||||
tastes = list("tender meat" = 1)
|
||||
foodtype = MEAT | GROSS
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/steak/penguin
|
||||
name = "penguin steak"
|
||||
tastes = list("beef" = 1, "cod fish" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/steak/killertomato
|
||||
name = "killer tomato steak"
|
||||
tastes = list("tomato" = 1)
|
||||
@@ -354,6 +409,11 @@
|
||||
else if(subjectjob)
|
||||
S.name = "[subjectjob] [initial(S.name)]"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/rawcutlet/chicken
|
||||
name = "raw chicken cutlet"
|
||||
cooked_type = /obj/item/reagent_containers/food/snacks/meat/cutlet/chicken
|
||||
tastes = list("chicken" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/rawcutlet/killertomato
|
||||
name = "raw killer tomato cutlet"
|
||||
cooked_type = /obj/item/reagent_containers/food/snacks/meat/cutlet/killertomato
|
||||
@@ -419,3 +479,11 @@
|
||||
/obj/item/reagent_containers/food/snacks/meat/cutlet/gondola
|
||||
name = "gondola cutlet"
|
||||
tastes = list("meat" = 1, "tranquility" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/cutlet/penguin
|
||||
name = "penguin cutlet"
|
||||
tastes = list("beef" = 1, "cod fish" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/meat/cutlet/chicken
|
||||
name = "chicken cutlet"
|
||||
tastes = list("chicken" = 1)
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
slices_num = 5
|
||||
tastes = list("bread" = 10)
|
||||
foodtype = GRAIN
|
||||
|
||||
dunkable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/breadslice
|
||||
icon = 'icons/obj/food/burgerbread.dmi'
|
||||
@@ -16,6 +16,7 @@
|
||||
slot_flags = ITEM_SLOT_HEAD
|
||||
customfoodfilling = 0 //to avoid infinite bread-ception
|
||||
foodtype = GRAIN
|
||||
dunkable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/store/bread/plain
|
||||
name = "bread"
|
||||
@@ -270,6 +271,7 @@ GLOBAL_LIST_INIT(frying_bad_chems, list(
|
||||
list_reagents = list("nutriment" = 4)
|
||||
bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
|
||||
tastes = list("butter" = 1, "toast" = 1)
|
||||
foodtype = GRAIN | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/butterbiscuit
|
||||
name = "butter biscuit"
|
||||
@@ -280,6 +282,7 @@ GLOBAL_LIST_INIT(frying_bad_chems, list(
|
||||
list_reagents = list("nutriment" = 5)
|
||||
bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
|
||||
tastes = list("butter" = 1, "biscuit" = 1)
|
||||
foodtype = GRAIN | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/butterdog
|
||||
name = "butterdog"
|
||||
|
||||
@@ -134,13 +134,54 @@
|
||||
tastes = list("bun" = 4, "brains" = 2)
|
||||
foodtype = GRAIN | MEAT | GROSS
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/obj/item/reagent_containers/food/snacks/burger/ghost
|
||||
name = "ghost burger"
|
||||
desc = "Too Spooky!"
|
||||
alpha = 125
|
||||
icon_state = "ghostburger"
|
||||
bonus_reagents = list("nutriment" = 5, "vitamin" = 12)
|
||||
tastes = list("bun" = 4, "ectoplasm" = 2)
|
||||
foodtype = GRAIN
|
||||
alpha = 170
|
||||
verb_say = "moans"
|
||||
verb_yell = "wails"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/burger/ghost/Initialize()
|
||||
. = ..()
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/burger/ghost/process()
|
||||
if(!isturf(loc)) //no floating out of bags
|
||||
return
|
||||
var/paranormal_activity = rand(100)
|
||||
switch(paranormal_activity)
|
||||
if(97 to 100)
|
||||
audible_message("[src] rattles a length of chain.")
|
||||
playsound(loc,'sound/spookoween/chain_rattling.ogg', 300, TRUE)
|
||||
if(91 to 96)
|
||||
say(pick("OoOoOoo.", "OoooOOooOoo!!"))
|
||||
if(84 to 90)
|
||||
dir = pick(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)
|
||||
step(src, dir)
|
||||
if(71 to 83)
|
||||
step(src, dir)
|
||||
if(65 to 70)
|
||||
var/obj/machinery/light/L = locate(/obj/machinery/light) in view(4, src)
|
||||
if(L)
|
||||
L.flicker()
|
||||
if(62 to 64)
|
||||
playsound(loc,pick('sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg'), 50, TRUE, ignore_walls = FALSE)
|
||||
if(61)
|
||||
visible_message("[src] spews out a glob of ectoplasm!")
|
||||
new /obj/effect/decal/cleanable/greenglow/ecto(loc)
|
||||
playsound(loc,'sound/effects/splat.ogg', 200, TRUE)
|
||||
|
||||
//If i was less lazy i would make the burger forcefeed itself to a nearby mob here.
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/burger/ghost/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
. = ..()
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/burger/red
|
||||
name = "red burger"
|
||||
@@ -281,3 +322,49 @@
|
||||
bonus_reagents = list("nutriment" = 8, "vitamin" = 1)
|
||||
tastes = list("bun" = 4, "bacon" = 2)
|
||||
foodtype = GRAIN | MEAT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/burger/soylent
|
||||
name = "soylent burger"
|
||||
desc = "A eco-friendly burger made using upcycled low value biomass."
|
||||
icon_state = "soylentburger"
|
||||
bonus_reagents = list("nutriment" = 5, "vitamin" = 3)
|
||||
tastes = list("bun" = 2, "assistant" = 4)
|
||||
foodtype = GRAIN | MEAT | DAIRY
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/burger/rib
|
||||
name = "mcrib"
|
||||
desc = "An elusive rib shaped burger with limited availablity across the galaxy. Not as good as you remember it."
|
||||
icon_state = "mcrib"
|
||||
bonus_reagents = list("bbqsauce" = 5, "vitamin" = 3)
|
||||
tastes = list("bun" = 2, "pork patty" = 4)
|
||||
foodtype = GRAIN | MEAT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/burger/mcguffin
|
||||
name = "mcguffin"
|
||||
desc = "A cheap and greasy imitation of an eggs benedict."
|
||||
icon_state = "mcguffin"
|
||||
tastes = list("muffin" = 2, "bacon" = 3)
|
||||
bonus_reagents = list("eggyolk" = 3, "nutriment" = 1)
|
||||
foodtype = GRAIN | MEAT | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/burger/chicken
|
||||
name = "chicken sandwich" //Apparently the proud people of Americlapstan object to this thing being called a burger. Apparently McDonald's just calls it a burger in Europe as to not scare and confuse us.
|
||||
desc = "A delicious chicken sandwich, it is said the proceeds from this treat helps criminalize homosexuality on the space frontier."
|
||||
icon_state = "chickenburger"
|
||||
tastes = list("bun" = 2, "chicken" = 4, "God's covenant" = 1)
|
||||
bonus_reagents = list("mayonnaise" = 3, "cooking_oil" = 2, "nutriment" = 2)
|
||||
foodtype = GRAIN | MEAT | FRIED
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/burger/cheese
|
||||
name = "cheese burger"
|
||||
desc = "This noble burger stands proudly clad in golden cheese."
|
||||
icon_state = "cheeseburger"
|
||||
tastes = list("bun" = 2, "beef patty" = 4, "cheese" = 3)
|
||||
bonus_reagents = list("nutriment" = 1)
|
||||
foodtype = GRAIN | MEAT | DAIRY
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/burger/cheese/Initialize()
|
||||
. = ..()
|
||||
if(prob(33))
|
||||
icon_state = "cheeseburgeralt"
|
||||
|
||||
|
||||
@@ -379,3 +379,21 @@ obj/item/reagent_containers/food/snacks/store/cake/pound_cake
|
||||
filling_color = "#00FFFF"
|
||||
tastes = list("cake" = 1, "sugar" = 1, "peachjuice" = 10)
|
||||
foodtype = GRAIN | SUGAR | DAIRY
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/store/cake/trumpet
|
||||
name = "spaceman's cake"
|
||||
desc = "A spaceman's trumpet frosted cake."
|
||||
icon_state = "trumpetcake"
|
||||
slice_path = /obj/item/reagent_containers/food/snacks/cakeslice/trumpet
|
||||
bonus_reagents = list("polypyr" = 15, "cream" = 5, "vitamin" = 5, "berryjuice" = 5)
|
||||
filling_color = "#7A3D80"
|
||||
tastes = list("cake" = 4, "violets" = 2, "jam" = 2)
|
||||
foodtype = GRAIN | DAIRY | FRUIT | SUGAR
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/cakeslice/trumpet
|
||||
name = "spaceman's cake"
|
||||
desc = "A spaceman's trumpet frosted cake."
|
||||
icon_state = "trumpetcakeslice"
|
||||
filling_color = "#7A3D80"
|
||||
tastes = list("cake" = 4, "violets" = 2, "jam" = 2)
|
||||
foodtype = GRAIN | DAIRY | FRUIT | SUGAR
|
||||
@@ -94,7 +94,7 @@
|
||||
filling_color = "#FFFFF0"
|
||||
list_reagents = list("nutriment" = 3)
|
||||
tastes = list("egg" = 4, "salt" = 1, "pepper" = 1)
|
||||
foodtype = MEAT | FRIED
|
||||
foodtype = MEAT | FRIED | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/boiledegg
|
||||
name = "boiled egg"
|
||||
@@ -104,7 +104,7 @@
|
||||
filling_color = "#FFFFF0"
|
||||
list_reagents = list("nutriment" = 2, "vitamin" = 1)
|
||||
tastes = list("egg" = 1)
|
||||
foodtype = MEAT
|
||||
foodtype = MEAT | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/omelette //FUCK THIS
|
||||
name = "omelette du fromage"
|
||||
@@ -116,7 +116,7 @@
|
||||
bitesize = 1
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
tastes = list("egg" = 1, "cheese" = 1)
|
||||
foodtype = MEAT
|
||||
foodtype = MEAT | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/omelette/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/kitchen/fork))
|
||||
@@ -145,5 +145,4 @@
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
list_reagents = list("nutriment" = 6, "vitamin" = 4)
|
||||
tastes = list("egg" = 1, "bacon" = 1, "bun" = 1)
|
||||
|
||||
foodtype = MEAT
|
||||
foodtype = MEAT | BREAKFAST
|
||||
|
||||
@@ -81,16 +81,15 @@
|
||||
filling_color = "#87CEFA"
|
||||
tastes = list("blue cherries" = 2, "ice cream" = 2)
|
||||
foodtype = FRUIT | DAIRY
|
||||
|
||||
/////////////
|
||||
//SNOWCONES//
|
||||
/////////////
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones //We use this as a base for all other snowcones
|
||||
name = "flaverless snowcone"
|
||||
desc = "Its just harden water slivers. Still fun to chew on."
|
||||
name = "flavorless snowcone"
|
||||
desc = "It's just shaved ice. Still fun to chew on."
|
||||
icon = 'icons/obj/food/snowcones.dmi'
|
||||
icon_state = "flaverless_sc"
|
||||
icon_state = "flavorless_sc"
|
||||
trash = /obj/item/reagent_containers/food/drinks/sillycup //We dont eat paper cups
|
||||
bonus_reagents = list("water" = 10) //Base line will allways give water
|
||||
list_reagents = list("water" = 1) // We dont get food for water/juices
|
||||
@@ -99,106 +98,106 @@
|
||||
foodtype = SUGAR //We use SUGAR as a base line to act in as junkfood, other wise we use fruit
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/lime
|
||||
name = "lime flavored snowcone"
|
||||
desc = "A lime flavord snowball in a paper cup."
|
||||
name = "lime snowcone"
|
||||
desc = "Lime syrup drizzled over a snowball in a paper cup."
|
||||
icon_state = "lime_sc"
|
||||
list_reagents = list("nutriment" = 1, "limejuice" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "limes" = 5)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/lemon
|
||||
name = "lemon flavored snowcone"
|
||||
desc = "A lemon flavord snowball in a paper cup."
|
||||
name = "lemon snowcone"
|
||||
desc = "Lemon syrup drizzled over a snowball in a paper cup."
|
||||
icon_state = "lemon_sc"
|
||||
list_reagents = list("nutriment" = 1, "lemonjuice" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "lemons" = 5)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/apple
|
||||
name = "apple flavored snowcone"
|
||||
desc = "A apple flavord snowball in a paper cup."
|
||||
icon_state = "blue_sc"
|
||||
name = "apple snowcone"
|
||||
desc = "Apple syrup drizzled over a snowball in a paper cup."
|
||||
icon_state = "amber_sc"
|
||||
list_reagents = list("nutriment" = 1, "applejuice" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "apples" = 5)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/grape
|
||||
name = "grape flavored snowcone"
|
||||
desc = "A grape flavord snowball in a paper cup."
|
||||
name = "grape snowcone"
|
||||
desc = "Grape syrup drizzled over a snowball in a paper cup."
|
||||
icon_state = "grape_sc"
|
||||
list_reagents = list("nutriment" = 1, "berryjuice" = 5)
|
||||
list_reagents = list("nutriment" = 1, "grapejuice" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "grape" = 5)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/orange
|
||||
name = "orange flavored snowcone"
|
||||
desc = "A orange flavor dizzled on a snowball in a paper cup."
|
||||
name = "orange snowcone"
|
||||
desc = "Orange syrup drizzled over a snowball in a paper cup."
|
||||
icon_state = "orange_sc"
|
||||
list_reagents = list("nutriment" = 1, "orangejuice" = 10)
|
||||
tastes = list("ice" = 1, "water" = 1, "berries" = 5)
|
||||
list_reagents = list("nutriment" = 1, "orangejuice" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "orange" = 5)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/blue
|
||||
name = "bluecherry flavored snowcone"
|
||||
desc = "A bluecharry flavord snowball in a paper cup, how rare!"
|
||||
icon_state = "red_sc"
|
||||
name = "bluecherry snowcone"
|
||||
desc = "Bluecherry syrup drizzled over a snowball in a paper cup, how rare!"
|
||||
icon_state = "blue_sc"
|
||||
list_reagents = list("nutriment" = 1, "bluecherryjelly" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "blue" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "blue" = 5, "cherries" = 5)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/red
|
||||
name = "cherry flavored snowcone"
|
||||
desc = "A cherry flavord snowball in a paper cup."
|
||||
icon_state = "blue_sc"
|
||||
name = "cherry snowcone"
|
||||
desc = "Cherry syrup drizzled over a snowball in a paper cup."
|
||||
icon_state = "red_sc"
|
||||
list_reagents = list("nutriment" = 1, "cherryjelly" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "red" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "red" = 5, "cherries" = 5)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/kiwi
|
||||
name = "kiwi flavored snowcone"
|
||||
desc = "A kiwi flavord snowball in a paper cup."
|
||||
name = "kiwi snowcone"
|
||||
desc = "A kiwi snowball in a paper cup."
|
||||
icon_state = "kiwi_sc"
|
||||
list_reagents = list("nutriment" = 3, "vitamin" = 6)
|
||||
tastes = list("ice" = 1, "space" = 3, "kiwi" = 5)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/mix
|
||||
name = "mixed berry flavored snowcone"
|
||||
desc = "A mix of different flavors dizzled on a snowball in a paper cup."
|
||||
icon_state = "berry_sc"
|
||||
list_reagents = list("nutriment" = 1, "berryjuice" = 10)
|
||||
tastes = list("ice" = 1, "water" = 1, "berries" = 5)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/peach
|
||||
name = "peach flavored snowcone"
|
||||
desc = "A peach flavord snowball in a paper cup."
|
||||
name = "peach snowcone"
|
||||
desc = "A peach snowball in a paper cup."
|
||||
icon_state = "peach_sc"
|
||||
list_reagents = list("nutriment" = 1, "peachjuice" = 10)
|
||||
tastes = list("ice" = 1, "water" = 1, " peach" = 5)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/strawberry
|
||||
name = "strawberry flavored snowcone"
|
||||
desc = "A strawberry flavord snowball in a paper cup."
|
||||
name = "strawberry snowcone"
|
||||
desc = "A strawberry snowball in a paper cup."
|
||||
icon_state = "blue_sc"
|
||||
list_reagents = list("nutriment" = 1, "berryjuice" = 10)
|
||||
tastes = list("ice" = 1, "water" = 1, " strawberry" = 5)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/berry
|
||||
name = "berry snowcone"
|
||||
desc = "Berry syrup drizzled over a snowball in a paper cup."
|
||||
icon_state = "berry_sc"
|
||||
list_reagents = list("nutriment" = 1, "berryjuice" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "berries" = 5)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/fruitsalad
|
||||
name = "mixed fruit flavored snowcone"
|
||||
desc = "A mix of different flavors dizzled on a snowball in a paper cup."
|
||||
name = "fruit salad snowcone"
|
||||
desc = "A delightful mix of citrus syrups drizzled over a snowball in a paper cup."
|
||||
icon_state = "fruitsalad_sc"
|
||||
list_reagents = list("nutriment" = 1, "limejuice" = 5, "lemonjuice" = 5, "orangejuice" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "fruits" = 25)
|
||||
list_reagents = list("nutriment" = 1, "lemonjuice" = 5, "limejuice" = 5, "orangejuice" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "oranges" = 5, "limes" = 5, "lemons" = 5, "citrus" = 5, "salad" = 5)
|
||||
foodtype = FRUIT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/pineapple
|
||||
name = "pineapple flavored snowcone"
|
||||
desc = "A pineapple flavord snowball in a paper cup."
|
||||
name = "pineapple snowcone"
|
||||
desc = "Pineapple syrup drizzled over a snowball in a paper cup."
|
||||
icon_state = "pineapple_sc"
|
||||
list_reagents = list("nutriment" = 1, "water" = 1)
|
||||
list_reagents = list("nutriment" = 1, "water" = 10)
|
||||
tastes = list("ice" = 1, "water" = 1, "pineapples" = 5)
|
||||
foodtype = PINEAPPLE //Pineapple to allow all that like pineapple to enjoy
|
||||
|
||||
@@ -207,41 +206,46 @@
|
||||
desc = "..."
|
||||
icon_state = "mime_sc"
|
||||
list_reagents = list("nutriment" = 1, "nothing" = 5)
|
||||
tastes = list("nothing" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "nothing" = 5)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/clown
|
||||
name = "joke flavored snowcone"
|
||||
desc = "A waterd down jokeful flavord snowball in a paper cup."
|
||||
name = "clown snowcone"
|
||||
desc = "Laughter drizzled over a snowball in a paper cup."
|
||||
icon_state = "clown_sc"
|
||||
list_reagents = list("nutriment" = 1, "laughter" = 5)
|
||||
tastes = list("jokes" = 5, "brainfreeze" = 5, "joy" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "jokes" = 5, "brainfreeze" = 5, "joy" = 5)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/soda
|
||||
name = "sodawater flavored snowcone"
|
||||
desc = "A waterd down sodawater flavored snowcone snowball in a paper cup."
|
||||
name = "space cola snowcone"
|
||||
desc = "Space Cola drizzled over a snowball in a paper cup."
|
||||
icon_state = "soda_sc"
|
||||
list_reagents = list("nutriment" = 1, "sodawater" = 5)
|
||||
tastes = list("surgar" = 1, "water" = 5, "soda" = 5)
|
||||
foodtype = JUNKFOOD | SUGAR
|
||||
list_reagents = list("nutriment" = 1, "cola" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "cola" = 5)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/pwgrmer
|
||||
name = "pwergamer flavored snowcone"
|
||||
desc = "A waterd down pwergamer soda flavord snowball in a paper cup."
|
||||
icon_state = "pwergamer_sc"
|
||||
list_reagents = list("nutriment" = 1, "laughter" = 1)
|
||||
tastes = list("vaild" = 5, "salt" = 5, "wats" = 5)
|
||||
foodtype = JUNKFOOD | SUGAR
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/spacemountainwind
|
||||
name = "Space Mountain Wind snowcone"
|
||||
desc = "Space Mountain Wind drizzled over a snowball in a paper cup."
|
||||
icon_state = "kiwi_sc"
|
||||
list_reagents = list("nutriment" = 1, "spacemountainwind" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "mountain wind" = 5)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/pwrgame
|
||||
name = "pwrgame snowcone"
|
||||
desc = "Pwrgame soda drizzled over a snowball in a paper cup."
|
||||
icon_state = "pwrgame_sc"
|
||||
list_reagents = list("nutriment" = 1, "pwr_game" = 5)
|
||||
tastes = list("ice" = 1, "water" = 1, "valid" = 5, "salt" = 5, "wats" = 5)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/honey
|
||||
name = "honey flavored snowcone"
|
||||
desc = "A honey flavord snowball in a paper cup."
|
||||
icon_state = "honey_sc"
|
||||
name = "honey snowcone"
|
||||
desc = "Honey drizzled over a snowball in a paper cup."
|
||||
icon_state = "amber_sc"
|
||||
list_reagents = list("nutriment" = 1, "honey" = 5)
|
||||
tastes = list("pollen" = 5, "sweetness" = 5, "wax" = 1)
|
||||
tastes = list("ice" = 1, "water" = 1, "flowers" = 5, "sweetness" = 5, "wax" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/snowcones/rainbow
|
||||
name = "rainbow color snowcone"
|
||||
desc = "A rainbow color snowball in a paper cup."
|
||||
name = "rainbow snowcone"
|
||||
desc = "A very colorful snowball in a paper cup."
|
||||
icon_state = "rainbow_sc"
|
||||
list_reagents = list("nutriment" = 5, "laughter" = 25)
|
||||
tastes = list("sunlight" = 5, "light" = 5, "slime" = 5, "paint" = 3, "clouds" = 3)
|
||||
tastes = list("ice" = 1, "water" = 1, "sunlight" = 5, "light" = 5, "slime" = 5, "paint" = 3, "clouds" = 3)
|
||||
|
||||
@@ -149,7 +149,7 @@
|
||||
bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
|
||||
list_reagents = list("nutriment" = 6, "vitamin" = 1)
|
||||
tastes = list("meat" = 1)
|
||||
foodtype = MEAT
|
||||
foodtype = MEAT | BREAKFAST
|
||||
var/roasted = FALSE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/sausage/Initialize()
|
||||
@@ -344,3 +344,19 @@
|
||||
icon_state = "doubleratkebab"
|
||||
tastes = list("rat meat" = 2, "metal" = 1)
|
||||
bonus_reagents = list("nutriment" = 6, "vitamin" = 2)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/kebab/fiesta
|
||||
name = "fiesta skewer"
|
||||
icon_state = "fiestaskewer"
|
||||
tastes = list("tex-mex" = 3, "cumin" = 2)
|
||||
bonus_reagents = list("vitamin" = 5, "capsaicin" = 3)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/bbqribs
|
||||
name = "bbq ribs"
|
||||
desc = "BBQ ribs, slathered in a healthy coating of BBQ sauce. The least vegan thing to ever exist."
|
||||
icon_state = "ribs"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
list_reagents = list("nutriment" = 8, "vitamin" = 2, "bbqsauce" = 5)
|
||||
bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
|
||||
tastes = list("meat" = 3, "smokey sauce" = 1)
|
||||
foodtype = MEAT
|
||||
@@ -47,6 +47,7 @@
|
||||
filling_color = "#A0522D"
|
||||
tastes = list("chocolate" = 1)
|
||||
foodtype = JUNKFOOD | SUGAR
|
||||
dunkable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/hugemushroomslice
|
||||
name = "huge mushroom slice"
|
||||
@@ -90,6 +91,7 @@
|
||||
filling_color = "#FFD700"
|
||||
tastes = list("fries" = 3, "salt" = 1)
|
||||
foodtype = VEGETABLES | GRAIN | FRIED
|
||||
dunkable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/tatortot
|
||||
name = "tator tot"
|
||||
@@ -99,6 +101,7 @@
|
||||
filling_color = "FFD700"
|
||||
tastes = list("potato" = 3, "valids" = 1)
|
||||
foodtype = FRIED | VEGETABLES
|
||||
dunkable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/soydope
|
||||
name = "soy dope"
|
||||
@@ -109,6 +112,7 @@
|
||||
filling_color = "#DEB887"
|
||||
tastes = list("soy" = 1)
|
||||
foodtype = VEGETABLES
|
||||
dunkable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/cheesyfries
|
||||
name = "cheesy fries"
|
||||
@@ -128,6 +132,7 @@
|
||||
list_reagents = list("bad_food" = 30)
|
||||
filling_color = "#8B4513"
|
||||
foodtype = GROSS
|
||||
dunkable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/carrotfries
|
||||
name = "carrot fries"
|
||||
@@ -401,7 +406,6 @@
|
||||
tastes = list("death" = 2, "rock" = 1, "meat" = 1, "hot peppers" = 1)
|
||||
foodtype = MEAT
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/powercrepe
|
||||
name = "Powercrepe"
|
||||
desc = "With great power, comes great crepes. It looks like a pancake filled with jelly but packs quite a punch."
|
||||
@@ -583,6 +587,7 @@
|
||||
filling_color = "#ffdf26"
|
||||
tastes = list("strawberries" = 5, "chocolate" = 3)
|
||||
foodtype = FRUIT | SUGAR
|
||||
dunkable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/chocolatebanana
|
||||
name = "Chocolate dipped banana"
|
||||
@@ -591,4 +596,81 @@
|
||||
list_reagents = list("sugar" = 5, "nutriment" = 3, "vitamin" = 1)
|
||||
filling_color = "#ffdf26"
|
||||
tastes = list("banana" = 5, "chocolate" = 3)
|
||||
foodtype = FRUIT | SUGAR
|
||||
foodtype = FRUIT | SUGAR
|
||||
dunkable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/cornchips
|
||||
name = "boritos corn chips"
|
||||
desc = "Triangular corn chips. They do seem a bit bland but would probably go well with some kind of dipping sauce."
|
||||
icon_state = "boritos"
|
||||
trash = /obj/item/trash/boritos
|
||||
bitesize = 2
|
||||
list_reagents = list("nutriment" = 3, "cooking_oil" = 2, "sodiumchloride" = 3)
|
||||
filling_color = "#ECA735"
|
||||
tastes = list("fried corn" = 1)
|
||||
foodtype = JUNKFOOD | FRIED
|
||||
dunkable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/marshmallow
|
||||
name = "marshmallow"
|
||||
desc = "A marshmallow filled with fluffy marshmallow fluff."
|
||||
icon_state = "marshmallow"
|
||||
list_reagents = list("sugar" = 5, "nutriment" = 2)
|
||||
filling_color = "#fafafa"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
tastes = list("marshmallow" = 2)
|
||||
foodtype = SUGAR | JUNKFOOD
|
||||
var/burned = 0
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/marshmallow/attackby(obj/item/I, mob/user)
|
||||
switch (I.get_temperature())
|
||||
if (355 to 1500)
|
||||
if (prob(30))
|
||||
burnmallow()
|
||||
if (1500 to 2000)
|
||||
if (prob(50))
|
||||
burnmallow()
|
||||
else
|
||||
burnmallow(TRUE)
|
||||
if (2000 to 3000)
|
||||
if (prob(10))
|
||||
burnmallow()
|
||||
else
|
||||
burnmallow(TRUE)
|
||||
if (3000 to INFINITY)
|
||||
burnmallow(TRUE)
|
||||
return ..()
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/marshmallow/proc/burnmallow(reallyburned = FALSE)
|
||||
if (reallyburned && burned == 1)
|
||||
icon_state = "marshmallowrburned"
|
||||
else if (burned == 0)
|
||||
icon_state = "marshmallowburned"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/marshmallow/examine(mob/user)
|
||||
. = ..()
|
||||
if (burned == 2)
|
||||
. += "It looks very burned."
|
||||
if (burned == 1)
|
||||
. += "It looks just right for eating!"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/marshmallow/fire_act(temp,volume)
|
||||
switch (temp)
|
||||
if (355 to 1500)
|
||||
if (prob(30))
|
||||
burnmallow()
|
||||
if (1500 to 2000)
|
||||
if (prob(50))
|
||||
burnmallow()
|
||||
else
|
||||
burnmallow(TRUE)
|
||||
if (2000 to 3000)
|
||||
if (prob(10))
|
||||
burnmallow()
|
||||
else
|
||||
burnmallow(TRUE)
|
||||
if (3000 to 7000)
|
||||
burnmallow(TRUE)
|
||||
if (7000 to INFINITY)
|
||||
burn()
|
||||
..()
|
||||
|
||||
@@ -5,28 +5,31 @@
|
||||
/obj/item/reagent_containers/food/snacks/donut
|
||||
name = "donut"
|
||||
desc = "Goes great with robust coffee."
|
||||
icon_state = "donut1"
|
||||
icon = 'icons/obj/food/donut.dmi'
|
||||
icon_state = "donut"
|
||||
bitesize = 5
|
||||
bonus_reagents = list("sugar" = 1)
|
||||
list_reagents = list("nutriment" = 3, "sprinkles" = 1, "sugar" = 2)
|
||||
filling_color = "#D2691E"
|
||||
tastes = list("donut" = 1)
|
||||
foodtype = JUNKFOOD | GRAIN | FRIED | SUGAR
|
||||
var/frosted_icon = "donut2"
|
||||
var/is_frosted = FALSE
|
||||
foodtype = JUNKFOOD | GRAIN | FRIED | SUGAR | BREAKFAST
|
||||
dunkable = TRUE
|
||||
var/decorated_icon = "donut_homer"
|
||||
var/is_decorated = FALSE
|
||||
var/extra_reagent = null
|
||||
var/decorated_adjective = "sprinkled"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/Initialize()
|
||||
. = ..()
|
||||
if(prob(30))
|
||||
frost_donut()
|
||||
decorate_donut()
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/proc/frost_donut()
|
||||
if(is_frosted || !frosted_icon)
|
||||
/obj/item/reagent_containers/food/snacks/donut/proc/decorate_donut()
|
||||
if(is_decorated || !decorated_icon)
|
||||
return
|
||||
is_frosted = TRUE
|
||||
name = "frosted [name]"
|
||||
icon_state = frosted_icon //delish~!
|
||||
is_decorated = TRUE
|
||||
name = "[decorated_adjective] [name]"
|
||||
icon_state = decorated_icon //delish~!
|
||||
reagents.add_reagent("sprinkles", 1)
|
||||
filling_color = "#FF69B4"
|
||||
return TRUE
|
||||
@@ -43,64 +46,283 @@
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/plain
|
||||
//Use this donut ingame
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/chaos
|
||||
name = "chaos donut"
|
||||
desc = "Like life, it never quite tastes the same."
|
||||
icon_state = "donut_chaos"
|
||||
bitesize = 10
|
||||
tastes = list("donut" = 3, "chaos" = 1)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/chaos/Initialize()
|
||||
. = ..()
|
||||
extra_reagent = pick("nutriment", "capsaicin", "frostoil", "krokodil", "plasma", "cocoa", "slimejelly", "banana", "berryjuice", "omnizine")
|
||||
reagents.add_reagent("[extra_reagent]", 3)
|
||||
reagents.add_reagent(extra_reagent, 3)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/meat
|
||||
name = "Meat Donut"
|
||||
desc = "Tastes as gross as it looks."
|
||||
icon_state = "donut_meat"
|
||||
bonus_reagents = list("ketchup" = 1)
|
||||
list_reagents = list("nutriment" = 3, "ketchup" = 2)
|
||||
tastes = list("meat" = 1)
|
||||
foodtype = JUNKFOOD | MEAT | GROSS | FRIED | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/berry
|
||||
name = "pink donut"
|
||||
desc = "Goes great with a soy latte."
|
||||
icon_state = "donut_pink"
|
||||
bonus_reagents = list("berryjuice" = 3, "sprinkles" = 1) //Extra sprinkles to reward frosting
|
||||
filling_color = "#E57d9A"
|
||||
decorated_icon = "donut_homer"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/trumpet
|
||||
name = "spaceman's donut"
|
||||
desc = "Goes great with a cold beaker of malk."
|
||||
icon_state = "donut_purple"
|
||||
bonus_reagents = list("polypyr" = 3, "sprinkles" = 1)
|
||||
tastes = list("donut" = 3, "violets" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#8739BF"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/apple
|
||||
name = "apple donut"
|
||||
desc = "Goes great with a shot of cinnamon schnapps."
|
||||
icon_state = "donut_green"
|
||||
bonus_reagents = list("applejuice" = 3, "sprinkles" = 1)
|
||||
tastes = list("donut" = 3, "green apples" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#6ABE30"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/caramel
|
||||
name = "caramel donut"
|
||||
desc = "Goes great with a mug of hot coco."
|
||||
icon_state = "donut_beige"
|
||||
bonus_reagents = list("caramel" = 3, "sprinkles" = 1)
|
||||
tastes = list("donut" = 3, "buttery sweetness" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#D4AD5B"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/choco
|
||||
name = "chocolate donut"
|
||||
desc = "Goes great with a glass of warm milk."
|
||||
icon_state = "donut_choc"
|
||||
bonus_reagents = list("hot_coco" = 3, "sprinkles" = 1) //the coco reagent is just bitter.
|
||||
tastes = list("donut" = 4, "bitterness" = 1)
|
||||
decorated_icon = "donut_choc_sprinkles"
|
||||
filling_color = "#4F230D"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/blumpkin
|
||||
name = "blumpkin donut"
|
||||
desc = "Goes great with a mug of soothing drunken blumpkin."
|
||||
icon_state = "donut_blue"
|
||||
bonus_reagents = list("blumpkinjuice" = 3, "sprinkles" = 1)
|
||||
tastes = list("donut" = 2, "blumpkin" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#2788C4"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/bungo
|
||||
name = "bungo donut"
|
||||
desc = "Goes great with a mason jar of hippie's delight."
|
||||
icon_state = "donut_yellow"
|
||||
bonus_reagents = list("bungojuice" = 3, "sprinkles" = 1)
|
||||
tastes = list("donut" = 3, "tropical sweetness" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#DEC128"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/matcha
|
||||
name = "matcha donut"
|
||||
desc = "Goes great with a cup of tea."
|
||||
icon_state = "donut_olive"
|
||||
bonus_reagents = list("teapowder = 3", "sprinkles" = 1)
|
||||
tastes = list("donut" = 3, "matcha" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#879630"
|
||||
|
||||
//////////////////////JELLY DONUTS/////////////////////////
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly
|
||||
name = "jelly donut"
|
||||
desc = "You jelly?"
|
||||
icon_state = "jdonut1"
|
||||
frosted_icon = "jdonut2"
|
||||
icon_state = "jelly"
|
||||
decorated_icon = "jelly_homer"
|
||||
bonus_reagents = list("sugar" = 1, "vitamin" = 1)
|
||||
extra_reagent = "berryjuice"
|
||||
tastes = list("jelly" = 1, "donut" = 3)
|
||||
foodtype = JUNKFOOD | GRAIN | FRIED | FRUIT | SUGAR
|
||||
foodtype = JUNKFOOD | GRAIN | FRIED | FRUIT | SUGAR | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/Initialize()
|
||||
. = ..()
|
||||
if(extra_reagent)
|
||||
reagents.add_reagent("[extra_reagent]", 3)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/plain //use this ingame to avoid inheritance related crafting issues.
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/berry
|
||||
name = "pink jelly donut"
|
||||
desc = "Goes great with a soy latte."
|
||||
icon_state = "jelly_pink"
|
||||
bonus_reagents = list("berryjuice" = 3, "sprinkles" = 1, "vitamin" = 1) //Extra sprinkles to reward frosting.
|
||||
filling_color = "#E57d9A"
|
||||
decorated_icon = "jelly_homer"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/trumpet
|
||||
name = "spaceman's jelly donut"
|
||||
desc = "Goes great with a cold beaker of malk."
|
||||
icon_state = "jelly_purple"
|
||||
bonus_reagents = list("polypyr" = 3, "sprinkles" = 1, "vitamin" = 1)
|
||||
tastes = list("jelly" = 1, "donut" = 3, "violets" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#8739BF"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/apple
|
||||
name = "apple jelly donut"
|
||||
desc = "Goes great with a shot of cinnamon schnapps."
|
||||
icon_state = "jelly_green"
|
||||
bonus_reagents = list("applejuice" = 3, "sprinkles" = 1, "vitamin" = 1)
|
||||
tastes = list("jelly" = 1, "donut" = 3, "green apples" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#6ABE30"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/caramel
|
||||
name = "caramel jelly donut"
|
||||
desc = "Goes great with a mug of hot coco."
|
||||
icon_state = "jelly_beige"
|
||||
bonus_reagents = list("caramel" = 3, "sprinkles" = 1, "vitamin" = 1)
|
||||
tastes = list("jelly" = 1, "donut" = 3, "buttery sweetness" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#D4AD5B"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/choco
|
||||
name = "chocolate jelly donut"
|
||||
desc = "Goes great with a glass of warm milk."
|
||||
icon_state = "jelly_choc"
|
||||
bonus_reagents = list("hot_coco" = 3, "sprinkles" = 1, "vitamin" = 1) //the coco reagent is just bitter.
|
||||
tastes = list("jelly" = 1, "donut" = 4, "bitterness" = 1)
|
||||
decorated_icon = "jelly_choc_sprinkles"
|
||||
filling_color = "#4F230D"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/blumpkin
|
||||
name = "blumpkin jelly donut"
|
||||
desc = "Goes great with a mug of soothing drunken blumpkin."
|
||||
icon_state = "jelly_blue"
|
||||
bonus_reagents = list("blumpkinjuice" = 3, "sprinkles" = 1, "vitamin" = 1)
|
||||
tastes = list("jelly" = 1, "donut" = 2, "blumpkin" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#2788C4"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/bungo
|
||||
name = "bungo jelly donut"
|
||||
desc = "Goes great with a mason jar of hippie's delight."
|
||||
icon_state = "jelly_yellow"
|
||||
bonus_reagents = list("bungojuice" = 3, "sprinkles" = 1, "vitamin" = 1)
|
||||
tastes = list("jelly" = 1, "donut" = 3, "tropical sweetness" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#DEC128"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/matcha
|
||||
name = "matcha jelly donut"
|
||||
desc = "Goes great with a cup of tea."
|
||||
icon_state = "jelly_olive"
|
||||
bonus_reagents = list("teapowder" = 3, "sprinkles" = 1, "vitamin" = 1)
|
||||
tastes = list("jelly" = 1, "donut" = 3, "matcha" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#879630"
|
||||
|
||||
//////////////////////////SLIME DONUTS/////////////////////////
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly
|
||||
name = "jelly donut"
|
||||
desc = "You jelly?"
|
||||
icon_state = "jdonut1"
|
||||
icon_state = "jelly"
|
||||
extra_reagent = "slimejelly"
|
||||
foodtype = JUNKFOOD | GRAIN | FRIED | TOXIC | SUGAR
|
||||
foodtype = JUNKFOOD | GRAIN | FRIED | TOXIC | SUGAR | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/cherryjelly
|
||||
name = "jelly donut"
|
||||
desc = "You jelly?"
|
||||
icon_state = "jdonut1"
|
||||
extra_reagent = "cherryjelly"
|
||||
foodtype = JUNKFOOD | GRAIN | FRIED | FRUIT
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/meat
|
||||
bonus_reagents = list("ketchup" = 1)
|
||||
list_reagents = list("nutriment" = 3, "ketchup" = 2)
|
||||
tastes = list("meat" = 1)
|
||||
foodtype = JUNKFOOD | MEAT | GROSS | FRIED
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/berry
|
||||
name = "pink jelly donut"
|
||||
desc = "Goes great with a soy latte."
|
||||
icon_state = "jelly_pink"
|
||||
bonus_reagents = list("berryjuice" = 3, "sprinkles" = 1, "vitamin" = 1) //Extra sprinkles to reward frosting
|
||||
filling_color = "#E57d9A"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/semen
|
||||
name = "\"cream\" donut"
|
||||
desc = "That cream looks a little runny..."
|
||||
icon_state = "donut3"
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/trumpet
|
||||
name = "spaceman's jelly donut"
|
||||
desc = "Goes great with a cold beaker of malk."
|
||||
icon_state = "jelly_purple"
|
||||
bonus_reagents = list("polypyr" = 3, "sprinkles" = 1, "vitamin" = 1)
|
||||
tastes = list("jelly" = 1, "donut" = 3, "violets" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#8739BF"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/apple
|
||||
name = "apple jelly donut"
|
||||
desc = "Goes great with a shot of cinnamon schnapps."
|
||||
icon_state = "jelly_green"
|
||||
bonus_reagents = list("applejuice" = 3, "sprinkles" = 1, "vitamin" = 1)
|
||||
tastes = list("jelly" = 1, "donut" = 3, "green apples" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#6ABE30"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/caramel
|
||||
name = "caramel jelly donut"
|
||||
desc = "Goes great with a mug of hot coco."
|
||||
icon_state = "jelly_beige"
|
||||
bonus_reagents = list("caramel" = 3, "sprinkles" = 1, "vitamin" = 1)
|
||||
tastes = list("jelly" = 1, "donut" = 3, "buttery sweetness" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#D4AD5B"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/choco
|
||||
name = "chocolate jelly donut"
|
||||
desc = "Goes great with a glass of warm milk."
|
||||
icon_state = "jelly_choc"
|
||||
bonus_reagents = list("hot_coco" = 3, "sprinkles" = 1, "vitamin" = 1) //the coco reagent is just bitter.
|
||||
tastes = list("jelly" = 1, "donut" = 4, "bitterness" = 1)
|
||||
decorated_icon = "jelly_choc_sprinkles"
|
||||
filling_color = "#4F230D"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/blumpkin
|
||||
name = "blumpkin jelly donut"
|
||||
desc = "Goes great with a mug of soothing drunken blumpkin."
|
||||
icon_state = "jelly_blue"
|
||||
bonus_reagents = list("blumpkinjuice" = 3, "sprinkles" = 1, "vitamin" = 1)
|
||||
tastes = list("jelly" = 1, "donut" = 2, "blumpkin" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#2788C4"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/bungo
|
||||
name = "bungo jelly donut"
|
||||
desc = "Goes great with a mason jar of hippie's delight."
|
||||
icon_state = "jelly_yellow"
|
||||
bonus_reagents = list("bungojuice" = 3, "sprinkles" = 1, "vitamin" = 1)
|
||||
tastes = list("jelly" = 1, "donut" = 3, "tropical sweetness" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#DEC128"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/matcha
|
||||
name = "matcha jelly donut"
|
||||
desc = "Goes great with a cup of tea."
|
||||
icon_state = "jelly_olive"
|
||||
bonus_reagents = list("teapowder" = 3, "sprinkles" = 1, "vitamin" = 1)
|
||||
tastes = list("jelly" = 1, "donut" = 3, "matcha" = 1)
|
||||
is_decorated = TRUE
|
||||
filling_color = "#879630"
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/glaze
|
||||
name = "glazed donut"
|
||||
desc = "A sugar glazed donut."
|
||||
icon_state = "donut_glaze"
|
||||
bitesize = 10
|
||||
bonus_reagents = list("semen" = 1)
|
||||
list_reagents = list("nutriment" = 3, "sugar" = 2, "semen" = 5)
|
||||
bonus_reagents = list("sugar" = 3)
|
||||
list_reagents = list("nutriment" = 3, "sugar" = 8)
|
||||
filling_color = "#FFFFFF"
|
||||
tastes = list("donut" = 1, "salt" = 3)
|
||||
foodtype = JUNKFOOD | GRAIN | FRIED | SUGAR
|
||||
|
||||
|
||||
////////////////////////////////////////////MUFFINS////////////////////////////////////////////
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/muffin
|
||||
@@ -111,14 +333,14 @@
|
||||
list_reagents = list("nutriment" = 6)
|
||||
filling_color = "#F4A460"
|
||||
tastes = list("muffin" = 1)
|
||||
foodtype = GRAIN | SUGAR
|
||||
foodtype = GRAIN | SUGAR | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/muffin/berry
|
||||
name = "berry muffin"
|
||||
icon_state = "berrymuffin"
|
||||
desc = "A delicious and spongy little cake, with berries."
|
||||
tastes = list("muffin" = 3, "berry" = 1)
|
||||
foodtype = GRAIN | FRUIT | SUGAR
|
||||
foodtype = GRAIN | FRUIT | SUGAR | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/muffin/booberry
|
||||
name = "booberry muffin"
|
||||
@@ -126,7 +348,7 @@
|
||||
alpha = 125
|
||||
desc = "My stomach is a graveyard! No living being can quench my bloodthirst!"
|
||||
tastes = list("muffin" = 3, "spookiness" = 1)
|
||||
foodtype = GRAIN | FRUIT | SUGAR
|
||||
foodtype = GRAIN | FRUIT | SUGAR | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/chawanmushi
|
||||
name = "chawanmushi"
|
||||
@@ -149,7 +371,7 @@
|
||||
list_reagents = list("nutriment" = 8, "vitamin" = 1)
|
||||
filling_color = "#D2691E"
|
||||
tastes = list("waffles" = 1)
|
||||
foodtype = GRAIN | SUGAR
|
||||
foodtype = GRAIN | SUGAR | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/soylentgreen
|
||||
name = "\improper Soylent Green"
|
||||
@@ -160,7 +382,7 @@
|
||||
list_reagents = list("nutriment" = 10, "vitamin" = 1)
|
||||
filling_color = "#9ACD32"
|
||||
tastes = list("waffles" = 7, "people" = 1)
|
||||
foodtype = GRAIN | GROSS | MEAT
|
||||
foodtype = GRAIN | MEAT
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/soylenviridians
|
||||
name = "\improper Soylent Virdians"
|
||||
@@ -183,7 +405,7 @@
|
||||
list_reagents = list("nutriment" = 8, "mushroomhallucinogen" = 2, "vitamin" = 2)
|
||||
filling_color = "#00BFFF"
|
||||
tastes = list("waffle" = 1, "mushrooms" = 1)
|
||||
foodtype = GRAIN | VEGETABLES | TOXIC | SUGAR
|
||||
foodtype = GRAIN | VEGETABLES | SUGAR | BREAKFAST
|
||||
|
||||
////////////////////////////////////////////OTHER////////////////////////////////////////////
|
||||
|
||||
@@ -196,7 +418,8 @@
|
||||
list_reagents = list("nutriment" = 1)
|
||||
filling_color = "#F0E68C"
|
||||
tastes = list("cookie" = 1)
|
||||
foodtype = SUGAR
|
||||
foodtype = GRAIN | SUGAR
|
||||
dunkable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donkpocket
|
||||
name = "\improper Donk-pocket"
|
||||
@@ -213,6 +436,7 @@
|
||||
desc = "The heated food of choice for the seasoned traitor."
|
||||
bonus_reagents = list("omnizine" = 3)
|
||||
list_reagents = list("nutriment" = 4, "omnizine" = 3)
|
||||
cooked_type = null
|
||||
tastes = list("meat" = 2, "dough" = 2, "laziness" = 1)
|
||||
foodtype = GRAIN
|
||||
|
||||
@@ -315,6 +539,7 @@
|
||||
filling_color = "#CD853F"
|
||||
tastes = list("sweetness" = 1)
|
||||
foodtype = GRAIN | JUNKFOOD | SUGAR
|
||||
dunkable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/chococornet
|
||||
name = "chocolate cornet"
|
||||
@@ -335,6 +560,7 @@
|
||||
filling_color = "#D2691E"
|
||||
tastes = list("cookie" = 2, "oat" = 1)
|
||||
foodtype = GRAIN
|
||||
dunkable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/raisincookie
|
||||
name = "raisin cookie"
|
||||
@@ -345,6 +571,7 @@
|
||||
filling_color = "#F0E68C"
|
||||
tastes = list("cookie" = 1, "raisins" = 1)
|
||||
foodtype = GRAIN | FRUIT
|
||||
dunkable = TRUE
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/cherrycupcake
|
||||
name = "cherry cupcake"
|
||||
@@ -367,7 +594,7 @@
|
||||
foodtype = GRAIN | FRUIT | SUGAR
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/strawberrycupcake
|
||||
name = "Strawberry cupcake"
|
||||
name = "strawberry cupcake"
|
||||
desc = "Strawberry inside a delicious cupcake."
|
||||
icon_state = "strawberrycupcake"
|
||||
bonus_reagents = list("nutriment" = 1, "vitamin" = 3)
|
||||
@@ -384,9 +611,9 @@
|
||||
list_reagents = list("nutriment" = 5, "honey" = 5)
|
||||
filling_color = "#F2CE91"
|
||||
tastes = list("pastry" = 1, "sweetness" = 1)
|
||||
foodtype = GRAIN
|
||||
foodtype = GRAIN | SUGAR
|
||||
|
||||
#define PANCAKE_MAX_STACK 30
|
||||
#define PANCAKE_MAX_STACK 10
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/pancakes
|
||||
name = "pancake"
|
||||
@@ -397,7 +624,7 @@
|
||||
list_reagents = list("nutriment" = 4, "vitamin" = 1)
|
||||
filling_color = "#D2691E"
|
||||
tastes = list("pancakes" = 1)
|
||||
foodtype = GRAIN | SUGAR
|
||||
foodtype = GRAIN | SUGAR | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/pancakes/blueberry
|
||||
name = "blueberry pancake"
|
||||
@@ -465,13 +692,13 @@
|
||||
to_chat(user, "<span class='notice'>You add the [I] to the [name].</span>")
|
||||
P.name = initial(P.name)
|
||||
contents += P
|
||||
update_overlays(P)
|
||||
update_snack_overlays(P)
|
||||
if (P.contents.len)
|
||||
for(var/V in P.contents)
|
||||
P = V
|
||||
P.name = initial(P.name)
|
||||
contents += P
|
||||
update_overlays(P)
|
||||
update_snack_overlays(P)
|
||||
P = I
|
||||
clearlist(P.contents)
|
||||
return
|
||||
@@ -480,7 +707,7 @@
|
||||
return O.attackby(I, user, params)
|
||||
..()
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/pancakes/update_overlays(obj/item/reagent_containers/food/snacks/P)
|
||||
/obj/item/reagent_containers/food/snacks/pancakes/update_snack_overlays(obj/item/reagent_containers/food/snacks/P)
|
||||
var/mutable_appearance/pancake = mutable_appearance(icon, "[P.item_state]_[rand(1,3)]")
|
||||
pancake.pixel_x = rand(-1,1)
|
||||
pancake.pixel_y = 3 * contents.len - 1
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
bonus_reagents = list("nutriment" = 4, "vitamin" = 4)
|
||||
list_reagents = list("nutriment" = 7, "milk" = 10, "vitamin" = 2)
|
||||
tastes = list("oats" = 1, "milk" = 1)
|
||||
foodtype = DAIRY | GRAIN
|
||||
foodtype = DAIRY | GRAIN | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/salad/fruit
|
||||
name = "fruit salad"
|
||||
@@ -55,7 +55,7 @@
|
||||
icon_state = "fruitsalad"
|
||||
bonus_reagents = list("nutriment" = 2, "vitamin" = 4)
|
||||
tastes = list("fruit" = 1)
|
||||
foodtype = FRUIT
|
||||
foodtype = FRUIT | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/salad/jungle
|
||||
name = "jungle salad"
|
||||
@@ -64,7 +64,7 @@
|
||||
bonus_reagents = list("nutriment" = 4, "vitamin" = 4)
|
||||
list_reagents = list("nutriment" = 7, "banana" = 5, "vitamin" = 4)
|
||||
tastes = list("fruit" = 1, "the jungle" = 1)
|
||||
foodtype = FRUIT
|
||||
foodtype = FRUIT | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/salad/citrusdelight
|
||||
name = "citrus delight"
|
||||
@@ -73,7 +73,7 @@
|
||||
bonus_reagents = list("nutriment" = 4, "vitamin" = 4)
|
||||
list_reagents = list("nutriment" = 7, "vitamin" = 5)
|
||||
tastes = list("sourness" = 1, "leaves" = 1)
|
||||
foodtype = FRUIT
|
||||
foodtype = FRUIT | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/salad/ricebowl
|
||||
name = "ricebowl"
|
||||
@@ -91,7 +91,7 @@
|
||||
bonus_reagents = list("nutriment" = 1, "vitamin" = 1)
|
||||
list_reagents = list("nutriment" = 5, "vitamin" = 1)
|
||||
tastes = list("rice" = 1)
|
||||
foodtype = GRAIN
|
||||
foodtype = GRAIN | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/salad/ricepudding
|
||||
name = "rice pudding"
|
||||
|
||||
@@ -225,3 +225,22 @@
|
||||
bonus_reagents = list("nutriment" = 4, "vitamin" = 6)
|
||||
tastes = list("beet" = 1)
|
||||
foodtype = VEGETABLES
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/soup/electron
|
||||
name = "electron soup"
|
||||
desc = "A gastronomic curiosity of ethereal origin. It is famed for the minature weather system formed over a properly prepared soup."
|
||||
icon_state = "electronsoup"
|
||||
list_reagents = list("nutriment" = 3, "liquidelectricity" = 5)
|
||||
tastes = list("mushroom" = 1, "electrons" = 4, "shockingly good")
|
||||
filling_color = "#CC2B52"
|
||||
foodtype = VEGETABLES | TOXIC
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/soup/bungocurry
|
||||
name = "bungo curry"
|
||||
desc = "A spicy vegetable curry made with the humble bungo fruit, Exotic!"
|
||||
icon_state = "bungocurry"
|
||||
bonus_reagents = list("vitamin" = 11)
|
||||
list_reagents = list("nutriment" = 6, "capsaicin" = 5)
|
||||
tastes = list("bungo" = 2, "hot curry" = 4, "tropical sweetness" = 1)
|
||||
filling_color = "#E6A625"
|
||||
foodtype = VEGETABLES | FRUIT | DAIRY
|
||||
|
||||
@@ -80,6 +80,9 @@ God bless America.
|
||||
I.reagents.trans_to(src, I.reagents.total_volume)
|
||||
qdel(I)
|
||||
return
|
||||
if(istype(I,/obj/item/clothing/head/mob_holder))
|
||||
to_chat(user, "<span class='warning'>This does not fit in the fryer.</span>") // TODO: Deepfrying instakills mobs, spawns a whole deep-fried mob.
|
||||
return
|
||||
if(!reagents.has_reagent("cooking_oil"))
|
||||
to_chat(user, "<span class='warning'>[src] has no cooking oil to fry with!</span>")
|
||||
return
|
||||
|
||||
@@ -0,0 +1,139 @@
|
||||
/obj/machinery/grill
|
||||
name = "grill"
|
||||
desc = "Just like the old days."
|
||||
icon = 'icons/obj/kitchen.dmi'
|
||||
icon_state = "grill_open"
|
||||
density = TRUE
|
||||
layer = BELOW_OBJ_LAYER
|
||||
use_power = NO_POWER_USE
|
||||
var/grill_fuel = 0
|
||||
var/obj/item/reagent_containers/food/grilled_item
|
||||
var/grill_time = 0
|
||||
var/datum/looping_sound/grill/grill_loop
|
||||
|
||||
/obj/machinery/grill/Initialize()
|
||||
. = ..()
|
||||
grill_loop = new(list(src), FALSE)
|
||||
|
||||
/obj/machinery/grill/update_icon()
|
||||
if(grilled_item)
|
||||
icon_state = "grill"
|
||||
else if(grill_fuel)
|
||||
icon_state = "grill_on"
|
||||
else
|
||||
icon_state = "grill_open"
|
||||
|
||||
/obj/machinery/grill/attackby(obj/item/I, mob/user)
|
||||
if(istype(I, /obj/item/stack/sheet/mineral/coal) || istype(I, /obj/item/stack/sheet/mineral/wood))
|
||||
var/obj/item/stack/S = I
|
||||
var/stackamount = S.get_amount()
|
||||
to_chat(user, "<span class='notice'>You put [stackamount] [I]s in [src].</span>")
|
||||
if(istype(I, /obj/item/stack/sheet/mineral/coal))
|
||||
grill_fuel += (500 * stackamount)
|
||||
else
|
||||
grill_fuel += (50 * stackamount)
|
||||
S.use(stackamount)
|
||||
update_icon()
|
||||
return
|
||||
if(I.resistance_flags & INDESTRUCTIBLE)
|
||||
to_chat(user, "<span class='warning'>You don't feel it would be wise to grill [I]...</span>")
|
||||
return ..()
|
||||
if(istype(I, /obj/item/reagent_containers))
|
||||
if(istype(I, /obj/item/reagent_containers/food) && !istype(I, /obj/item/reagent_containers/food/drinks))
|
||||
if(HAS_TRAIT(I, TRAIT_NODROP) || (I.item_flags & (ABSTRACT | DROPDEL)))
|
||||
return ..()
|
||||
else if(!grill_fuel)
|
||||
to_chat(user, "<span class='notice'>There is not enough fuel.</span>")
|
||||
return
|
||||
else if(!grilled_item && user.transferItemToLoc(I, src))
|
||||
grilled_item = I
|
||||
to_chat(user, "<span class='notice'>You put the [grilled_item] on [src].</span>")
|
||||
update_icon()
|
||||
grill_loop.start()
|
||||
return
|
||||
else
|
||||
if(I.reagents.has_reagent("monkey_energy"))
|
||||
grill_fuel += (20 * (I.reagents.get_reagent_amount("monkey_energy")))
|
||||
to_chat(user, "<span class='notice'>You pour the Monkey Energy in [src].</span>")
|
||||
I.reagents.remove_reagent("monkey_energy", I.reagents.get_reagent_amount("monkey_energy"))
|
||||
update_icon()
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/machinery/grill/process()
|
||||
..()
|
||||
update_icon()
|
||||
if(!grill_fuel)
|
||||
return
|
||||
else
|
||||
grill_fuel -= 1
|
||||
if(prob(1))
|
||||
var/datum/effect_system/smoke_spread/bad/smoke = new
|
||||
smoke.set_up(1, loc)
|
||||
smoke.start()
|
||||
if(grilled_item)
|
||||
grill_time += 1
|
||||
grilled_item.reagents.add_reagent("char", 1)
|
||||
grill_fuel -= 10
|
||||
grilled_item.AddComponent(/datum/component/sizzle)
|
||||
|
||||
/obj/machinery/grill/Exited(atom/movable/AM)
|
||||
if(AM == grilled_item)
|
||||
finish_grill()
|
||||
grilled_item = null
|
||||
..()
|
||||
|
||||
/obj/machinery/grill/Destroy()
|
||||
grilled_item = null
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/grill/handle_atom_del(atom/A)
|
||||
if(A == grilled_item)
|
||||
grilled_item = null
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/grill/wrench_act(mob/living/user, obj/item/I)
|
||||
. = ..()
|
||||
if(default_unfasten_wrench(user, I) != CANT_UNFASTEN)
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/grill/deconstruct(disassembled = TRUE)
|
||||
finish_grill()
|
||||
if(!(flags_1 & NODECONSTRUCT_1))
|
||||
new /obj/item/stack/sheet/metal(loc, 5)
|
||||
new /obj/item/stack/rods(loc, 5)
|
||||
..()
|
||||
|
||||
/obj/machinery/grill/attack_ai(mob/user)
|
||||
return
|
||||
|
||||
/obj/machinery/grill/attack_hand(mob/user)
|
||||
if(grilled_item)
|
||||
to_chat(user, "<span class='notice'>You take out [grilled_item] from [src].</span>")
|
||||
grilled_item.forceMove(drop_location())
|
||||
update_icon()
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/machinery/grill/proc/finish_grill()
|
||||
switch(grill_time) //no 0-9 to prevent spam
|
||||
if(10 to 15)
|
||||
grilled_item.name = "lightly-grilled [grilled_item.name]"
|
||||
grilled_item.desc = "[grilled_item.desc] It's been lightly grilled."
|
||||
if(16 to 39)
|
||||
grilled_item.name = "grilled [grilled_item.name]"
|
||||
grilled_item.desc = "[grilled_item.desc] It's been grilled."
|
||||
grilled_item.foodtype |= FRIED
|
||||
if(40 to 50)
|
||||
grilled_item.name = "heavily grilled [grilled_item.name]"
|
||||
grilled_item.desc = "[grilled_item.desc] It's been heavily grilled."
|
||||
grilled_item.foodtype |= FRIED
|
||||
if(51 to INFINITY) //grill marks reach max alpha
|
||||
grilled_item.name = "Powerfully Grilled [grilled_item.name]"
|
||||
grilled_item.desc = "A [grilled_item.name]. Reminds you of your deepfryer skills, wait, no, it's better!"
|
||||
grilled_item.foodtype |= FRIED
|
||||
grill_time = 0
|
||||
grill_loop.stop()
|
||||
|
||||
/obj/machinery/grill/unwrenched
|
||||
anchored = FALSE
|
||||
@@ -76,6 +76,22 @@
|
||||
required_reagents = list("corn_starch" = 1, "sacid" = 1)
|
||||
required_temp = 374
|
||||
|
||||
/datum/chemical_reaction/caramel
|
||||
name = "Caramel"
|
||||
id = "caramel"
|
||||
results = list("caramel" = 1)
|
||||
required_reagents = list("sugar" = 1)
|
||||
required_temp = 413
|
||||
mob_react = FALSE
|
||||
|
||||
/datum/chemical_reaction/caramel_burned
|
||||
name = "Caramel burned"
|
||||
id = "caramel_burned"
|
||||
results = list("carbon" = 1)
|
||||
required_reagents = list("caramel" = 1)
|
||||
required_temp = 483
|
||||
mob_react = FALSE
|
||||
|
||||
/datum/chemical_reaction/cheesewheel
|
||||
name = "Cheesewheel"
|
||||
id = "cheesewheel"
|
||||
@@ -161,3 +177,9 @@
|
||||
new /obj/item/reagent_containers/food/snacks/salad/ricebowl(location)
|
||||
if(holder && holder.my_atom)
|
||||
qdel(holder.my_atom)
|
||||
|
||||
/datum/chemical_reaction/bbqsauce
|
||||
name = "BBQ Sauce"
|
||||
id = "bbqsauce"
|
||||
results = list("bbqsauce" = 5)
|
||||
required_reagents = list("ash" = 1, "tomatojuice" = 1, "salglu_solution" = 3, "blackpepper" = 1)
|
||||
@@ -44,6 +44,10 @@
|
||||
input = /obj/item/reagent_containers/food/snacks/grown/parsnip
|
||||
output = /obj/item/reagent_containers/food/snacks/roastparsnip
|
||||
|
||||
/datum/food_processor_process/tortilla
|
||||
input = /obj/item/reagent_containers/food/snacks/tortilla
|
||||
output = /obj/item/reagent_containers/food/snacks/cornchips
|
||||
|
||||
/datum/food_processor_process/mob/slime
|
||||
input = /mob/living/simple_animal/slime
|
||||
output = null
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user