mirror of
https://github.com/KabKebab/GS13.git
synced 2026-07-09 23:21:02 +01:00
Update with master
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
/client/proc/spawn_floor_cluwne()
|
||||
set category = "Fun"
|
||||
set name = "Unleash Targeted Floor Cluwne"
|
||||
set desc = "Pick a specific target. Be warned: spawning more than one may cause issues!"
|
||||
var/target
|
||||
|
||||
if(!check_rights(R_FUN))
|
||||
return
|
||||
|
||||
target = input("Any specific target in mind? Please note only live, non cluwned, human targets are valid.", "Target", target) as null|anything in GLOB.player_list
|
||||
if(target && ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
var/mob/living/simple_animal/hostile/floor_cluwne/FC = new /mob/living/simple_animal/hostile/floor_cluwne(H.loc)
|
||||
FC.forced = TRUE
|
||||
FC.Acquire_Victim(H)
|
||||
FC.target = H
|
||||
FC.current_victim = H
|
||||
log_admin("[key_name(usr)] spawned floor cluwne.")
|
||||
message_admins("[key_name(usr)] spawned floor cluwne.")
|
||||
deadchat_broadcast("<span class='deadsay'><b>Floor Cluwne</b> has just been spawned!</span>")
|
||||
|
||||
/client/proc/spawn_random_floor_cluwne()
|
||||
set category = "Fun"
|
||||
set name = "Unleash Random Floor Cluwne"
|
||||
set desc = "Goes after a random player in your Z level. Be warned: spawning more than one may cause issues!"
|
||||
|
||||
if(!check_rights(R_FUN))
|
||||
return
|
||||
|
||||
var/turf/T = get_turf(usr)
|
||||
new /mob/living/simple_animal/hostile/floor_cluwne(T)
|
||||
log_admin("[key_name(usr)] spawned a random target floor cluwne.")
|
||||
message_admins("[key_name(usr)] spawned a random target floor cluwne.")
|
||||
|
||||
/client/proc/spawn_twitch_plays_clowncar()
|
||||
set category = "Fun"
|
||||
set name = "Spawn Twich Plays: Clown Car Edition"
|
||||
set desc = "A clown car that weights the direction it goes based on the keys ghosts are pushing. Terrible idea? Maybe."
|
||||
|
||||
if(!check_rights(R_FUN))
|
||||
return
|
||||
|
||||
var/turf/T = get_turf(usr)
|
||||
var/obj/vehicle/sealed/car/clowncar/twitch_plays/G = new /obj/vehicle/sealed/car/clowncar/twitch_plays(T)
|
||||
var/area/A = get_area(G)
|
||||
log_admin("[key_name(usr)] spawned a twitch plays clown car.")
|
||||
message_admins("[key_name(usr)] spawned a twitch plays clown car. Some soundtrack is likely recommended for the fuckshit that's about to unfold.")
|
||||
notify_ghosts("A Ghost Controlled Clown Car has been spawned at \the [A.name]! Double click it to orbit and wrestle its direction with other ghosts!", 'yogstation/sound/misc/bikehorn_creepy.ogg', source = G, action = NOTIFY_JUMP, flashwindow = FALSE)
|
||||
|
||||
@@ -0,0 +1,277 @@
|
||||
/*
|
||||
Holds things like antag datums, game modes, abilities, and everything
|
||||
related to the antag that could be a datum
|
||||
*/
|
||||
|
||||
//ANTAGONIST
|
||||
/datum/antagonist/wendigo
|
||||
name = "wendigo"
|
||||
antagpanel_category = "Wendigo"
|
||||
|
||||
/datum/antagonist/wendigo/on_gain()
|
||||
if(istype(owner.current, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/wendigo/new_owner = new/mob/living/carbon/wendigo(get_turf(owner.current))
|
||||
var/mob/current_body = owner.current
|
||||
current_body.transfer_ckey(new_owner)
|
||||
current_body.Destroy()
|
||||
owner = new_owner.mind
|
||||
owner.current = new_owner
|
||||
..()
|
||||
|
||||
|
||||
//HUD
|
||||
//Contents: Intentions, Hands, Dropping/Throwing/Pulling, Inventory Equip
|
||||
// Health + Souls on the bottom of screen
|
||||
//TODO: Health doll, Soul counter (not devil)
|
||||
|
||||
/datum/hud/wendigo/New(mob/living/carbon/wendigo/owner)
|
||||
..()
|
||||
var/obj/screen/using
|
||||
var/obj/screen/inventory/inv_box
|
||||
|
||||
var/widescreenlayout = FALSE //adds support for different hud layouts depending on widescreen pref
|
||||
if(owner.client && owner.client.prefs && owner.client.prefs.widescreenpref)
|
||||
widescreenlayout = FALSE
|
||||
|
||||
//CRAFTING
|
||||
using = new /obj/screen/craft
|
||||
using.icon = ui_style
|
||||
if(!widescreenlayout)
|
||||
using.screen_loc = ui_boxcraft
|
||||
static_inventory += using
|
||||
|
||||
//LANG MENU
|
||||
using = new/obj/screen/language_menu
|
||||
using.icon = ui_style
|
||||
if(!widescreenlayout)
|
||||
using.screen_loc = ui_boxlang
|
||||
static_inventory += using
|
||||
|
||||
//AREA EDITOR
|
||||
using = new /obj/screen/area_creator
|
||||
using.icon = ui_style
|
||||
if(!widescreenlayout)
|
||||
using.screen_loc = ui_boxarea
|
||||
static_inventory += using
|
||||
|
||||
using = new /obj/screen/voretoggle()
|
||||
using.icon = tg_ui_icon_to_cit_ui(ui_style)
|
||||
using.screen_loc = ui_voremode
|
||||
if(!widescreenlayout)
|
||||
using.screen_loc = ui_boxvore
|
||||
static_inventory += using
|
||||
|
||||
//INTENTS & ACTIONS
|
||||
action_intent = new /obj/screen/act_intent/segmented
|
||||
action_intent.icon_state = mymob.a_intent
|
||||
static_inventory += action_intent
|
||||
|
||||
using = new /obj/screen/human/equip()
|
||||
using.icon = ui_style
|
||||
using.screen_loc = ui_equip_position(mymob)
|
||||
static_inventory += using
|
||||
|
||||
using = new /obj/screen/mov_intent
|
||||
using.icon = tg_ui_icon_to_cit_ui(ui_style)
|
||||
using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking")
|
||||
using.screen_loc = ui_movi
|
||||
static_inventory += using
|
||||
|
||||
using = new /obj/screen/resist()
|
||||
using.icon = ui_style
|
||||
using.screen_loc = ui_overridden_resist
|
||||
hotkeybuttons += using
|
||||
|
||||
using = new /obj/screen/restbutton()
|
||||
using.icon = tg_ui_icon_to_cit_ui(ui_style)
|
||||
using.screen_loc = ui_pull_resist
|
||||
static_inventory += using
|
||||
|
||||
using = new /obj/screen/combattoggle()
|
||||
using.icon = tg_ui_icon_to_cit_ui(ui_style)
|
||||
using.screen_loc = ui_combat_toggle
|
||||
static_inventory += using
|
||||
|
||||
using = new /obj/screen/drop()
|
||||
using.icon = ui_style
|
||||
using.screen_loc = ui_drop_throw
|
||||
static_inventory += using
|
||||
|
||||
pull_icon = new /obj/screen/pull()
|
||||
pull_icon.icon = ui_style
|
||||
pull_icon.update_icon(mymob)
|
||||
pull_icon.screen_loc = ui_pull_resist
|
||||
static_inventory += pull_icon
|
||||
|
||||
throw_icon = new /obj/screen/throw_catch()
|
||||
throw_icon.icon = ui_style
|
||||
throw_icon.screen_loc = ui_drop_throw
|
||||
hotkeybuttons += throw_icon
|
||||
|
||||
//////
|
||||
//INVENTORY
|
||||
//////
|
||||
build_hand_slots()
|
||||
|
||||
using = new /obj/screen/human/toggle()
|
||||
using.icon = ui_style
|
||||
using.screen_loc = ui_inventory
|
||||
static_inventory += using
|
||||
|
||||
using = new /obj/screen/swap_hand()
|
||||
using.icon = ui_style
|
||||
using.icon_state = "swap_1"
|
||||
using.screen_loc = ui_swaphand_position(owner,1)
|
||||
static_inventory += using
|
||||
|
||||
using = new /obj/screen/swap_hand()
|
||||
using.icon = ui_style
|
||||
using.icon_state = "swap_2"
|
||||
using.screen_loc = ui_swaphand_position(owner,2)
|
||||
static_inventory += using
|
||||
|
||||
inv_box = new /obj/screen/inventory()
|
||||
inv_box.name = "neck"
|
||||
inv_box.icon = ui_style
|
||||
inv_box.icon_state = "neck"
|
||||
inv_box.screen_loc = ui_neck
|
||||
inv_box.slot_id = SLOT_NECK
|
||||
toggleable_inventory += inv_box
|
||||
|
||||
inv_box = new /obj/screen/inventory()
|
||||
inv_box.name = "back"
|
||||
inv_box.icon = ui_style
|
||||
inv_box.icon_state = "back"
|
||||
inv_box.screen_loc = ui_back
|
||||
inv_box.slot_id = SLOT_BACK
|
||||
static_inventory += inv_box
|
||||
|
||||
inv_box = new /obj/screen/inventory()
|
||||
inv_box.name = "gloves"
|
||||
inv_box.icon = ui_style
|
||||
inv_box.icon_state = "gloves"
|
||||
inv_box.screen_loc = ui_gloves
|
||||
inv_box.slot_id = SLOT_GLOVES
|
||||
toggleable_inventory += inv_box
|
||||
|
||||
inv_box = new /obj/screen/inventory()
|
||||
inv_box.name = "eyes"
|
||||
inv_box.icon = ui_style
|
||||
inv_box.icon_state = "glasses"
|
||||
inv_box.screen_loc = ui_glasses
|
||||
inv_box.slot_id = SLOT_GLASSES
|
||||
toggleable_inventory += inv_box
|
||||
|
||||
inv_box = new /obj/screen/inventory()
|
||||
inv_box.name = "ears"
|
||||
inv_box.icon = ui_style
|
||||
inv_box.icon_state = "ears"
|
||||
inv_box.screen_loc = ui_ears
|
||||
inv_box.slot_id = SLOT_EARS
|
||||
toggleable_inventory += inv_box
|
||||
|
||||
inv_box = new /obj/screen/inventory()
|
||||
inv_box.name = "head"
|
||||
inv_box.icon = ui_style
|
||||
inv_box.icon_state = "head"
|
||||
inv_box.screen_loc = ui_head
|
||||
inv_box.slot_id = SLOT_HEAD
|
||||
toggleable_inventory += inv_box
|
||||
|
||||
inv_box = new /obj/screen/inventory()
|
||||
inv_box.name = "belt"
|
||||
inv_box.icon = ui_style
|
||||
inv_box.icon_state = "belt"
|
||||
inv_box.screen_loc = ui_belt
|
||||
inv_box.slot_id = SLOT_BELT
|
||||
static_inventory += inv_box
|
||||
|
||||
//INFO DISPLAY
|
||||
|
||||
internals = new /obj/screen/internals()
|
||||
infodisplay += internals
|
||||
|
||||
healths = new /obj/screen/healths()
|
||||
infodisplay += healths
|
||||
|
||||
healthdoll = new /obj/screen/healthdoll()
|
||||
infodisplay += healthdoll
|
||||
|
||||
zone_select = new /obj/screen/zone_sel()
|
||||
zone_select.icon = ui_style
|
||||
zone_select.update_icon(mymob)
|
||||
static_inventory += zone_select
|
||||
|
||||
for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory))
|
||||
if(inv.slot_id)
|
||||
inv.hud = src
|
||||
inv_slots[inv.slot_id] = inv
|
||||
inv.update_icon()
|
||||
|
||||
/datum/hud/wendigo/hidden_inventory_update(mob/viewer)
|
||||
if(!mymob)
|
||||
return
|
||||
var/mob/living/carbon/wendigo/W = mymob
|
||||
|
||||
var/mob/screenmob = viewer || W
|
||||
|
||||
if(screenmob.hud_used.inventory_shown && screenmob.hud_used.hud_shown)
|
||||
if(W.gloves)
|
||||
W.gloves.screen_loc = ui_gloves
|
||||
screenmob.client.screen += W.gloves
|
||||
if(W.ears)
|
||||
W.ears.screen_loc = ui_ears
|
||||
screenmob.client.screen += W.ears
|
||||
if(W.glasses)
|
||||
W.glasses.screen_loc = ui_glasses
|
||||
screenmob.client.screen += W.glasses
|
||||
if(W.wear_neck)
|
||||
W.wear_neck.screen_loc = ui_neck
|
||||
screenmob.client.screen += W.wear_neck
|
||||
if(W.head)
|
||||
W.head.screen_loc = ui_head
|
||||
screenmob.client.screen += W.head
|
||||
else
|
||||
if(W.gloves) screenmob.client.screen -= W.gloves
|
||||
if(W.ears) screenmob.client.screen -= W.ears
|
||||
if(W.glasses) screenmob.client.screen -= W.glasses
|
||||
if(W.wear_neck) screenmob.client.screen -= W.wear_neck
|
||||
if(W.head) screenmob.client.screen -= W.head
|
||||
|
||||
/datum/hud/wendigo/persistent_inventory_update(mob/viewer)
|
||||
if(!mymob)
|
||||
return
|
||||
..()
|
||||
var/mob/living/carbon/wendigo/W = mymob
|
||||
|
||||
var/mob/screenmob = viewer || W
|
||||
|
||||
if(screenmob.hud_used)
|
||||
if(screenmob.hud_used.hud_shown)
|
||||
if(W.belt)
|
||||
W.belt.screen_loc = ui_belt
|
||||
screenmob.client.screen += W.belt
|
||||
if(W.back)
|
||||
W.back.screen_loc = ui_back
|
||||
screenmob.client.screen += W.back
|
||||
else
|
||||
if(W.belt)
|
||||
screenmob.client.screen -= W.belt
|
||||
if(W.back)
|
||||
screenmob.client.screen -= W.back
|
||||
|
||||
if(hud_version != HUD_STYLE_NOHUD)
|
||||
for(var/obj/item/I in W.held_items)
|
||||
I.screen_loc = ui_hand_position(W.get_held_index_of_item(I))
|
||||
screenmob.client.screen += I
|
||||
else
|
||||
for(var/obj/item/I in W.held_items)
|
||||
I.screen_loc = null
|
||||
screenmob.client.screen -= I
|
||||
|
||||
/datum/hud/wendigo/show_hud(version = 0,mob/viewmob)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
var/mob/screenmob = viewmob || mymob
|
||||
hidden_inventory_update(screenmob)
|
||||
@@ -0,0 +1,14 @@
|
||||
/obj/structure/soul_storage
|
||||
name = "soul storage"
|
||||
desc = "Stores souls!"
|
||||
var/list/souls = list()
|
||||
|
||||
//This is a big WIP. I don't even want it having the name "soul storage" but it'll do for now
|
||||
|
||||
/obj/structure/soul_storage/Initialize()
|
||||
. = ..()
|
||||
GLOB.wendigo_soul_storages += src
|
||||
|
||||
/obj/structure/soul_storage/Destroy()
|
||||
GLOB.wendigo_soul_storages -= src
|
||||
return ..()
|
||||
@@ -0,0 +1,11 @@
|
||||
/mob/living/carbon/wendigo/UnarmedAttack(atom/A, proximity)
|
||||
A.attack_hand(src)
|
||||
|
||||
/mob/living/carbon/wendigo/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE)
|
||||
if(incapacitated() || lying)
|
||||
to_chat(src, "<span class='warning'>You can't do that right now!</span>")
|
||||
return FALSE
|
||||
if(be_close && !in_range(M, src))
|
||||
to_chat(src, "<span class='warning'>You are too far away!</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
@@ -0,0 +1,115 @@
|
||||
#define DEFAULT_MOVESPEED 1.5
|
||||
//The mob itself
|
||||
/mob/living/carbon/wendigo
|
||||
name = "wendigo"
|
||||
gender = FEMALE
|
||||
unique_name = FALSE
|
||||
hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD, NANITE_HUD, DIAG_NANITE_FULL_HUD,ANTAG_HUD,GLAND_HUD,SENTIENT_DISEASE_HUD)
|
||||
hud_type = /datum/hud/wendigo
|
||||
possible_a_intents = list(INTENT_HELP, INTENT_DISARM, INTENT_GRAB, INTENT_HARM)
|
||||
appearance_flags = TILE_BOUND|PIXEL_SCALE|LONG_GLIDE
|
||||
status_flags = CANSTUN //cant be knocked down, unconscious, or be pushed
|
||||
maxHealth = 200
|
||||
icon = 'hyperstation/icons/mobs/wendigo.dmi'
|
||||
icon_state = "reference"
|
||||
|
||||
bodyparts = list(/obj/item/bodypart/chest/wendigo, /obj/item/bodypart/head/wendigo,
|
||||
/obj/item/bodypart/l_arm/wendigo, /obj/item/bodypart/r_arm/wendigo,
|
||||
/obj/item/bodypart/l_leg/wendigo, /obj/item/bodypart/r_leg/wendigo)
|
||||
var/obj/item/belt = null
|
||||
var/datum/physiology/physiology
|
||||
var/obj/structure/soul_storage/connected_link
|
||||
var/fake_breast_size = 5 //She doesn't actually have the organ, but we cache her breast size for rp reasons
|
||||
var/fake_penis_size = 8
|
||||
|
||||
/mob/living/carbon/wendigo/Initialize()
|
||||
. = ..()
|
||||
/* //TODO: Uncomment when objectives + forest get finished
|
||||
if(!connected_link)
|
||||
if(!GLOB.wendigo_soul_storages.len)
|
||||
connected_link = new /obj/structure/soul_storage(get_turf(src))
|
||||
else
|
||||
connected_link = pick(GLOB.wendigo_soul_storages)
|
||||
gender = pick(FEMALE, MALE)
|
||||
*/
|
||||
if(gender == MALE)
|
||||
fake_breast_size = 0
|
||||
else
|
||||
fake_penis_size = 0
|
||||
real_name = name
|
||||
//DAMAGE RESISTANCE
|
||||
physiology = new()
|
||||
physiology.brute_mod = 0.7
|
||||
physiology.burn_mod = 1.25
|
||||
physiology.tox_mod = -1
|
||||
physiology.oxy_mod = 1
|
||||
physiology.clone_mod = 0
|
||||
physiology.stamina_mod = 0 //Running and attacking, prods
|
||||
physiology.heat_mod = 2 //IM MELTIIINNNGGGG-!
|
||||
physiology.cold_mod = 0
|
||||
physiology.siemens_coeff = 0.2
|
||||
physiology.stun_mod = 0 //prods n aggressive grab
|
||||
//physiology.bleed_mod = 2
|
||||
physiology.speed_mod = 0.9 //Should be faster than a normal person's walking speed
|
||||
physiology.hunger_mod = 2 //We're gonna have a FEAST TONIGHT!
|
||||
physiology.do_after_speed = 1
|
||||
|
||||
//Traits & Bodyparts
|
||||
create_bodyparts()
|
||||
create_internal_organs()
|
||||
ADD_TRAIT(src, TRAIT_NOCLONE, "initialize")
|
||||
add_verb(src, /mob/living/proc/mob_sleep)
|
||||
add_verb(src, /mob/living/proc/lay_down)
|
||||
add_movespeed_modifier("MOVESPEED_DEFAULT", multiplicative_slowdown=DEFAULT_MOVESPEED)
|
||||
update_body_parts()
|
||||
|
||||
/mob/living/carbon/wendigo/Destroy()
|
||||
QDEL_NULL(physiology)
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/wendigo/update_body_parts()
|
||||
for(var/X in bodyparts)
|
||||
var/obj/item/bodypart/BP = X
|
||||
BP.update_limb()
|
||||
|
||||
/mob/living/carbon/wendigo/update_move_intent_slowdown()
|
||||
var/mod = 0
|
||||
if(m_intent == MOVE_INTENT_WALK)
|
||||
mod = (CONFIG_GET(number/movedelay/walk_delay) / 2) //complete copy besides this part
|
||||
else
|
||||
mod = 1.30
|
||||
if(!isnum(mod))
|
||||
mod = 1
|
||||
add_movespeed_modifier(MOVESPEED_ID_MOB_WALK_RUN_CONFIG_SPEED, TRUE, 100, override = TRUE, multiplicative_slowdown = mod)
|
||||
|
||||
/mob/living/carbon/wendigo/update_movespeed(resort=TRUE)
|
||||
return (..() * physiology.speed_mod)
|
||||
|
||||
/mob/living/carbon/wendigo/can_hold_items()
|
||||
return TRUE
|
||||
/mob/living/carbon/wendigo/IsAdvancedToolUser()
|
||||
return TRUE
|
||||
/mob/living/carbon/wendigo/can_be_pulled()
|
||||
return FALSE
|
||||
/mob/living/carbon/wendigo/is_literate()
|
||||
return TRUE
|
||||
/mob/living/carbon/wendigo/canBeHandcuffed()
|
||||
return TRUE
|
||||
/mob/living/carbon/wendigo/update_inv_handcuffed()
|
||||
return
|
||||
/mob/living/carbon/wendigo/update_inv_legcuffed()
|
||||
return
|
||||
|
||||
//
|
||||
//ORGANS
|
||||
//
|
||||
/mob/living/carbon/wendigo/create_internal_organs()
|
||||
internal_organs += new /obj/item/organ/eyes/wendigo
|
||||
internal_organs += new /obj/item/organ/liver/wendigo
|
||||
|
||||
internal_organs += new /obj/item/organ/tongue
|
||||
internal_organs += new /obj/item/organ/lungs
|
||||
internal_organs += new /obj/item/organ/heart
|
||||
internal_organs += new /obj/item/organ/stomach
|
||||
internal_organs += new /obj/item/organ/ears
|
||||
..()
|
||||
@@ -0,0 +1,86 @@
|
||||
/mob/living/carbon/wendigo/examine(mob/user)
|
||||
var/t_He = p_they(TRUE)
|
||||
var/t_His = p_their(TRUE)
|
||||
var/t_his = p_their()
|
||||
var/t_him = p_them()
|
||||
|
||||
. = list("<span class='info'>*---------*\nThis is [icon2html(src, user)] \a <EM>[src]</EM>!")
|
||||
|
||||
if(handcuffed)
|
||||
. += "<span class='warning'>[t_He] is [icon2html(handcuffed, user)] handcuffed!</span>"
|
||||
if(legcuffed)
|
||||
. += "<span class='warning'>[t_He] has [icon2html(legcuffed, user)] leg cuffs!</span>"
|
||||
if(head)
|
||||
. += "[t_He] is wearing [head.get_examine_string(user)] on [t_his] head."
|
||||
if(wear_neck)
|
||||
. += "[t_He] is wearing [wear_neck.get_examine_string(user)] around [t_his] neck."
|
||||
|
||||
for(var/obj/item/I in held_items)
|
||||
if(!(I.item_flags & ABSTRACT))
|
||||
. += "[t_He] is holding [I.get_examine_string(user)] in [t_his] [get_held_index_name(get_held_index_of_item(I))]."
|
||||
|
||||
if(back)
|
||||
. += "[t_He] has [back.get_examine_string(user)] on [t_his] back."
|
||||
|
||||
if(stat == DEAD)
|
||||
. += "<span class='deadsay'>[t_He] is limp and unresponsive, with no signs of life.</span>"
|
||||
|
||||
var/list/msg = ("<span class='warning'>")
|
||||
var/temp_hp = getBruteLoss()
|
||||
if(!(user == src && src.hal_screwyhud == SCREWYHUD_HEALTHY))
|
||||
if(temp_hp)
|
||||
if(temp_hp <= 25) msg += "[t_He] has minor bruising.\n"
|
||||
else if(temp_hp <= 75) msg += "[t_He] has <B>moderate</B> bruising!\n"
|
||||
else msg += "<B>[t_He] has severe bruising!</B>\n"
|
||||
temp_hp = getFireLoss()
|
||||
if(temp_hp)
|
||||
if(temp_hp <= 25) msg += "[t_He] has minor burns.\n"
|
||||
else if(temp_hp <= 50) msg += "[t_He] has <B>moderate</B> burns!\n"
|
||||
else msg += "<B>[t_He] has severe burns!</B>\n"
|
||||
if(fire_stacks > 0)
|
||||
msg += "[t_He] is covered in something flammable.\n"
|
||||
if(fire_stacks < 0)
|
||||
msg += "[t_He] looks a little soaked.\n"
|
||||
if(pulledby)
|
||||
if(pulledby.grab_state)
|
||||
msg += "[t_He] is restrained by [pulledby]'s grip.\n"
|
||||
|
||||
msg += "</span>"
|
||||
. += msg
|
||||
|
||||
if(stat == UNCONSCIOUS)
|
||||
. += "[t_He] isn't responding to anything around [t_him] and seems to be asleep."
|
||||
else if(InCritical())
|
||||
. += "[t_His] breathing is shallow and labored."
|
||||
|
||||
|
||||
if(fake_breast_size < 16)
|
||||
. += "You see a pair of breasts. You estimate them to be [ascii2text(round(fake_breast_size)+63)]-cups."
|
||||
else if(!fake_breast_size && gender == FEMALE)
|
||||
. += "You see a pair of breasts. They're small and flatchested, however."
|
||||
else
|
||||
. += "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "two big old tonhongerekoogers", "a couple of giant bonkhonagahoogs", "a pair of humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [round(fake_breast_size)]cm in diameter."
|
||||
|
||||
if(fake_penis_size)
|
||||
. += "You see a flaccid human penis. You estimate it's about [round(fake_penis_size, 0.25)] inch[round(fake_penis_size, 0.25) != 1 ? "es" : ""] long." //would put girth here but lazy
|
||||
|
||||
if(connected_link)
|
||||
if(connected_link.souls.len > 5)
|
||||
. += "<span class='warning'><B>[t_His] eyes are glowing a deadly red.</B></span>"
|
||||
else
|
||||
var/A = "<span class='deadsay'>"
|
||||
switch(connected_link.souls.len)
|
||||
if(0)
|
||||
A += "[t_He] looks malnourished and weak."
|
||||
if(1)
|
||||
A += "[t_He] looks hungry."
|
||||
if(2 to 4)
|
||||
A += "[t_He] is salivating."
|
||||
if(5)
|
||||
A += "[t_His] eyes are glowing red."
|
||||
. += "[A]</span>"
|
||||
else
|
||||
. += "<span class='deadsay'>[t_He] looks lost.</span>"
|
||||
|
||||
SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, .)
|
||||
. += "*---------*</span>"
|
||||
@@ -0,0 +1,55 @@
|
||||
//Snowflake metabolization with naughty organ manipulation
|
||||
/mob/living/carbon/wendigo/proc/metabolize_hunger()
|
||||
if(HAS_TRAIT(src, TRAIT_NOHUNGER))
|
||||
return
|
||||
|
||||
if(connected_link)
|
||||
if(connected_link.souls.len > 3)
|
||||
nutrition = min(800, nutrition + (HUNGER_FACTOR*connected_link.souls.len))
|
||||
nutrition = max(0, nutrition - (HUNGER_FACTOR / (physiology.hunger_mod / (connected_link.souls.len + 1))))
|
||||
else
|
||||
nutrition = max(0, nutrition - (HUNGER_FACTOR / physiology.hunger_mod))
|
||||
|
||||
switch(nutrition)
|
||||
if(NUTRITION_LEVEL_FULL to INFINITY)
|
||||
throw_alert("nutrition", /obj/screen/alert/fat)
|
||||
if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FULL)
|
||||
clear_alert("nutrition")
|
||||
if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_STARVING)
|
||||
throw_alert("nutrition", /obj/screen/alert/hungry)
|
||||
if(0 to NUTRITION_LEVEL_STARVING)
|
||||
throw_alert("nutrition", /obj/screen/alert/starving)
|
||||
|
||||
/mob/living/carbon/wendigo/reagent_check(datum/reagent/R)
|
||||
if(istype(R, /datum/reagent/fermi))
|
||||
var/had_changed = FALSE
|
||||
if(R.type == /datum/reagent/fermi/penis_enlarger)
|
||||
fake_penis_size += 0.25
|
||||
had_changed = "penis_enlarger"
|
||||
if(R.type == /datum/reagent/fermi/PEsmaller)
|
||||
fake_penis_size = max(0, fake_penis_size - 0.25)
|
||||
had_changed = "PEsmaller"
|
||||
if(R.type == /datum/reagent/fermi/breast_enlarger)
|
||||
fake_breast_size += 0.25
|
||||
had_changed = "breast_enlarger"
|
||||
if(R.type == /datum/reagent/fermi/BEsmaller)
|
||||
fake_breast_size = max(0, fake_breast_size - 0.25)
|
||||
had_changed = "BEsmaller"
|
||||
|
||||
if(had_changed)
|
||||
R.volume -= R.metabolization_rate
|
||||
if(round(fake_penis_size, 1) == fake_penis_size && fake_penis_size)
|
||||
switch(had_changed)
|
||||
if("penis_enlarger")
|
||||
to_chat(src, "<span class='warning'>Your [pick(GLOB.gentlemans_organ_names)] [pick("swells up to", "flourishes into", "expands into", "bursts forth into", "grows eagerly into", "amplifys into")] a [fake_penis_size] inch penis.</b></span>")
|
||||
if("PEsmaller")
|
||||
if(fake_penis_size > 0)
|
||||
to_chat(src, "<span class='warning'>Your [pick(GLOB.gentlemans_organ_names)] [pick("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [fake_penis_size] inch penis.</b></span>")
|
||||
else if(round(fake_breast_size, 1) == fake_breast_size && fake_breast_size)
|
||||
switch(had_changed)
|
||||
if("breast_enlarger")
|
||||
to_chat(src, "<span class='warning'>Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [ascii2text(round(fake_breast_size)+63)]-cup.</b></span>")
|
||||
if("BEsmaller)")
|
||||
if(fake_breast_size > 0)
|
||||
to_chat(src, "<span class='warning'>Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "contracts into")] a [ascii2text(round(fake_breast_size)+63)]-cup.</b></span>")
|
||||
return TRUE
|
||||
@@ -0,0 +1,125 @@
|
||||
/mob/living/carbon/wendigo/handle_environment(datum/gas_mixture/environment)
|
||||
if(!environment)
|
||||
return
|
||||
|
||||
var/loc_temp = get_temperature(environment)
|
||||
|
||||
if(stat != DEAD)
|
||||
adjust_bodytemperature(natural_bodytemperature_stabilization())
|
||||
|
||||
if(!on_fire) //If you're on fire, you do not heat up or cool down based on surrounding gases
|
||||
if(loc_temp < bodytemperature)
|
||||
adjust_bodytemperature(max((loc_temp - bodytemperature) / BODYTEMP_COLD_DIVISOR, BODYTEMP_COOLING_MAX))
|
||||
else
|
||||
adjust_bodytemperature(min((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR, BODYTEMP_HEATING_MAX))
|
||||
|
||||
|
||||
if(bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !HAS_TRAIT(src, TRAIT_RESISTHEAT))
|
||||
switch(bodytemperature)
|
||||
if(280 to 300)
|
||||
throw_alert("temp", /obj/screen/alert/hot, 1)
|
||||
apply_damage(HEAT_DAMAGE_LEVEL_1*physiology.heat_mod, BURN)
|
||||
if(300 to 350)
|
||||
throw_alert("temp", /obj/screen/alert/hot, 2)
|
||||
apply_damage(HEAT_DAMAGE_LEVEL_2*physiology.heat_mod, BURN)
|
||||
if(350 to INFINITY)
|
||||
throw_alert("temp", /obj/screen/alert/hot, 3)
|
||||
if(on_fire)
|
||||
apply_damage(HEAT_DAMAGE_LEVEL_3*physiology.heat_mod, BURN)
|
||||
else
|
||||
apply_damage(HEAT_DAMAGE_LEVEL_2*physiology.heat_mod, BURN)
|
||||
|
||||
else if(bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !HAS_TRAIT(src, TRAIT_RESISTCOLD))
|
||||
if(!istype(loc, /obj/machinery/atmospherics/components/unary/cryo_cell))
|
||||
switch(bodytemperature)
|
||||
if(200 to 260)
|
||||
throw_alert("temp", /obj/screen/alert/cold, 1)
|
||||
apply_damage(COLD_DAMAGE_LEVEL_1*physiology.cold_mod, BURN)
|
||||
if(0 to 120)
|
||||
throw_alert("temp", /obj/screen/alert/cold, 2)
|
||||
apply_damage(COLD_DAMAGE_LEVEL_2*physiology.cold_mod, BURN)
|
||||
if(-INFINITY to 0)
|
||||
throw_alert("temp", /obj/screen/alert/cold, 3)
|
||||
apply_damage(COLD_DAMAGE_LEVEL_3*physiology.cold_mod, BURN)
|
||||
else
|
||||
clear_alert("temp")
|
||||
|
||||
else
|
||||
clear_alert("temp")
|
||||
|
||||
//Account for massive pressure differences
|
||||
|
||||
var/pressure = environment.return_pressure()
|
||||
var/adjusted_pressure = calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob.
|
||||
switch(adjusted_pressure)
|
||||
if(HAZARD_HIGH_PRESSURE to INFINITY)
|
||||
adjustBruteLoss(min((((adjusted_pressure / HAZARD_HIGH_PRESSURE)-1)*PRESSURE_DAMAGE_COEFFICIENT)*physiology.pressure_mod, MAX_HIGH_PRESSURE_DAMAGE))
|
||||
throw_alert("pressure", /obj/screen/alert/highpressure, 2)
|
||||
if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE)
|
||||
throw_alert("pressure", /obj/screen/alert/highpressure, 1)
|
||||
if(WARNING_LOW_PRESSURE to WARNING_HIGH_PRESSURE)
|
||||
clear_alert("pressure")
|
||||
if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE)
|
||||
throw_alert("pressure", /obj/screen/alert/lowpressure, 1)
|
||||
else
|
||||
adjustBruteLoss( LOW_PRESSURE_DAMAGE*physiology.pressure_mod )
|
||||
throw_alert("pressure", /obj/screen/alert/lowpressure, 2)
|
||||
|
||||
return
|
||||
|
||||
/mob/living/carbon/wendigo/handle_breath_temperature(datum/gas_mixture/breath)
|
||||
if(abs(BODYTEMP_NORMAL - breath.temperature) > 50)
|
||||
switch(breath.temperature)
|
||||
if(-INFINITY to 0)
|
||||
adjustFireLoss(3)
|
||||
if(0 to 120) //We flourish in a cold environment
|
||||
adjustFireLoss(1.5)
|
||||
if(298 to 350) //But hoo boy do we not like the heat
|
||||
adjustFireLoss(2)
|
||||
if(350 to 800)
|
||||
adjustFireLoss(3)
|
||||
if(800 to INFINITY)
|
||||
adjustFireLoss(8)
|
||||
|
||||
/mob/living/carbon/wendigo/handle_fire()
|
||||
if(..())
|
||||
return
|
||||
adjust_bodytemperature(BODYTEMP_HEATING_MAX*physiology.heat_mod)
|
||||
return
|
||||
|
||||
/mob/living/carbon/wendigo/adjustBruteLoss(amount, updating_health, forced)
|
||||
return ..(amount*physiology.brute_mod, updating_health, forced)
|
||||
|
||||
/mob/living/carbon/wendigo/adjustFireLoss(amount, updating_health, forced)
|
||||
return ..(amount*physiology.burn_mod, updating_health, forced)
|
||||
|
||||
/mob/living/carbon/wendigo/adjustToxLoss(amount, updating_health, forced)
|
||||
return ..(amount*physiology.tox_mod, updating_health, forced)
|
||||
|
||||
/mob/living/carbon/wendigo/adjustOxyLoss(amount, updating_health, forced)
|
||||
return ..(amount*physiology.oxy_mod, updating_health, forced)
|
||||
|
||||
/mob/living/carbon/wendigo/adjustCloneLoss(amount, updating_health, forced)
|
||||
return ..(amount*physiology.clone_mod, updating_health, forced)
|
||||
|
||||
/mob/living/carbon/wendigo/adjustStaminaLoss(amount, updating_health, forced)
|
||||
return ..(amount*physiology.stamina_mod, updating_health, forced)
|
||||
|
||||
/mob/living/carbon/wendigo/do_after_coefficent()
|
||||
. = ..()
|
||||
. *= physiology.do_after_speed
|
||||
|
||||
/mob/living/carbon/wendigo/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, override = 0, tesla_shock = 0, illusion = 0, stun = TRUE)
|
||||
return ..(shock_damage, source, physiology.siemens_coeff, safety, override, tesla_shock, illusion, stun)
|
||||
|
||||
/mob/living/carbon/wendigo/Stun(amount, updating, ignore_canstun)
|
||||
return ..(amount*physiology.stun_mod, updating, ignore_canstun)
|
||||
|
||||
/mob/living/carbon/wendigo/Knockdown(amount, updating, ignore_canknockdown, override_hardstun, override_stamdmg)
|
||||
return ..(amount*physiology.stun_mod, updating, ignore_canknockdown, override_hardstun, override_stamdmg)
|
||||
|
||||
/mob/living/carbon/wendigo/Unconscious(amount, updating, ignore_canunconscious)
|
||||
return ..(amount*physiology.stun_mod, updating, ignore_canunconscious)
|
||||
|
||||
/mob/living/carbon/wendigo/bleed(amt)
|
||||
return ..(amt*physiology.bleed_mod)
|
||||
@@ -0,0 +1,100 @@
|
||||
/mob/living/carbon/wendigo/can_equip(obj/item/I, slot, disable_warning)
|
||||
switch(slot)
|
||||
if(SLOT_HANDS)
|
||||
if(get_empty_held_indexes())
|
||||
return TRUE
|
||||
return FALSE
|
||||
if(SLOT_GLASSES)
|
||||
if(glasses)
|
||||
return FALSE
|
||||
if(!(I.slot_flags & ITEM_SLOT_EYES))
|
||||
return FALSE
|
||||
return TRUE
|
||||
if(SLOT_NECK)
|
||||
if(wear_neck)
|
||||
return FALSE
|
||||
if(!(I.slot_flags & ITEM_SLOT_NECK))
|
||||
return FALSE
|
||||
return TRUE
|
||||
if(SLOT_EARS)
|
||||
if(ears)
|
||||
return FALSE
|
||||
if(!(I.slot_flags & ITEM_SLOT_EARS))
|
||||
return FALSE
|
||||
return TRUE
|
||||
if(SLOT_GLOVES)
|
||||
if(gloves)
|
||||
return FALSE
|
||||
if(!(I.slot_flags & ITEM_SLOT_GLOVES))
|
||||
return FALSE
|
||||
return TRUE
|
||||
if(SLOT_BACK)
|
||||
if(back)
|
||||
return FALSE
|
||||
if(!(I.slot_flags & ITEM_SLOT_BACK))
|
||||
return FALSE
|
||||
return TRUE
|
||||
if(SLOT_IN_BACKPACK)
|
||||
if(back)
|
||||
if(SEND_SIGNAL(back, COMSIG_TRY_STORAGE_CAN_INSERT, I, src, TRUE))
|
||||
return TRUE
|
||||
return FALSE
|
||||
if(SLOT_HEAD)
|
||||
if(head)
|
||||
return FALSE
|
||||
if(!(I.slot_flags & ITEM_SLOT_HEAD))
|
||||
return FALSE
|
||||
return TRUE
|
||||
if(SLOT_BELT)
|
||||
if(belt)
|
||||
return FALSE
|
||||
if(!(I.slot_flags & ITEM_SLOT_BELT))
|
||||
return FALSE
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/mob/living/carbon/wendigo/equip_to_slot(obj/item/I, slot)
|
||||
if(!..())
|
||||
return
|
||||
switch(slot)
|
||||
if(SLOT_GLASSES)
|
||||
glasses = I
|
||||
update_inv_glasses()
|
||||
if(SLOT_EARS)
|
||||
ears = I
|
||||
update_inv_ears()
|
||||
if(SLOT_GLOVES)
|
||||
gloves = I
|
||||
update_inv_gloves()
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/wendigo/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE)
|
||||
. = ..()
|
||||
if(!. || !I)
|
||||
return
|
||||
|
||||
else if(I == gloves)
|
||||
gloves = null
|
||||
if(!QDELETED(src))
|
||||
update_inv_gloves()
|
||||
else if(I == glasses)
|
||||
glasses = null
|
||||
var/obj/item/clothing/glasses/G = I
|
||||
if(G.tint)
|
||||
update_tint()
|
||||
if(G.vision_correction)
|
||||
if(HAS_TRAIT(src, TRAIT_NEARSIGHT))
|
||||
overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1)
|
||||
adjust_eye_damage(0)
|
||||
if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view || !isnull(G.lighting_alpha))
|
||||
update_sight()
|
||||
if(!QDELETED(src))
|
||||
update_inv_glasses()
|
||||
else if(I == ears)
|
||||
ears = null
|
||||
if(!QDELETED(src))
|
||||
update_inv_ears()
|
||||
else if(I == belt)
|
||||
belt = null
|
||||
if(!QDELETED(src))
|
||||
update_inv_belt()
|
||||
@@ -0,0 +1,58 @@
|
||||
/obj/item/organ/liver/wendigo
|
||||
name = "rotten liver"
|
||||
desc = "A liver from a wendigo. It looks like a spoiled tomato."
|
||||
decay_factor = 0
|
||||
|
||||
/obj/item/organ/liver/wendigo/on_life()
|
||||
var/mob/living/carbon/C = owner
|
||||
if(istype(C))
|
||||
damage = initial(maxHealth)
|
||||
|
||||
if(filterToxins && !HAS_TRAIT(owner, TRAIT_TOXINLOVER))
|
||||
//handle liver toxin filtration
|
||||
for(var/datum/reagent/toxin/T in C.reagents.reagent_list)
|
||||
var/thisamount = C.reagents.get_reagent_amount(T.type)
|
||||
if (thisamount && thisamount <= toxTolerance)
|
||||
C.reagents.remove_reagent(T.type, 1)
|
||||
|
||||
C.reagents.metabolize(C, can_overdose=FALSE)
|
||||
if(istype(C, /mob/living/carbon/wendigo))
|
||||
var/mob/living/carbon/wendigo/A = C
|
||||
A.metabolize_hunger()
|
||||
|
||||
/obj/item/organ/eyes/wendigo
|
||||
sight_flags = SEE_MOBS
|
||||
|
||||
/obj/item/bodypart/head/wendigo
|
||||
dismemberable = FALSE
|
||||
max_damage = INFINITY
|
||||
animal_origin = WENDIGO_BODYPART
|
||||
|
||||
/obj/item/bodypart/chest/wendigo
|
||||
dismemberable = FALSE
|
||||
max_damage = INFINITY
|
||||
animal_origin = WENDIGO_BODYPART
|
||||
|
||||
/obj/item/bodypart/l_arm/wendigo
|
||||
dismemberable = FALSE
|
||||
max_damage = INFINITY
|
||||
attack_verb = list("slashed", "clawed", "mauled")
|
||||
animal_origin = WENDIGO_BODYPART
|
||||
|
||||
/obj/item/bodypart/r_arm/wendigo
|
||||
dismemberable = FALSE
|
||||
max_damage = INFINITY
|
||||
attack_verb = list("slashed", "clawed", "mauled")
|
||||
animal_origin = WENDIGO_BODYPART
|
||||
|
||||
/obj/item/bodypart/l_leg/wendigo
|
||||
dismemberable = FALSE
|
||||
max_damage = INFINITY
|
||||
attack_verb = list("pounded", "stomped", "stamped", "kicked")
|
||||
animal_origin = WENDIGO_BODYPART
|
||||
|
||||
/obj/item/bodypart/r_leg/wendigo
|
||||
dismemberable = FALSE
|
||||
max_damage = INFINITY
|
||||
attack_verb = list("pounded", "stomped", "stamped", "kicked")
|
||||
animal_origin = WENDIGO_BODYPART
|
||||
@@ -0,0 +1,370 @@
|
||||
#define HEAD_X_OFFSET_NORTH 2
|
||||
#define HEAD_Y_OFFSET_NORTH 8
|
||||
#define HEAD_X_OFFSET_EAST 2
|
||||
#define HEAD_Y_OFFSET_EAST 8
|
||||
#define HEAD_X_OFFSET_SOUTH 8
|
||||
#define HEAD_Y_OFFSET_SOUTH 2
|
||||
#define HEAD_X_OFFSET_WEST 8
|
||||
#define HEAD_Y_OFFSET_WEST -2
|
||||
|
||||
#define LHAND_X_OFFSET_NORTH -5
|
||||
#define LHAND_Y_OFFSET_NORTH 3
|
||||
#define LHAND_X_OFFSET_EAST -2
|
||||
#define LHAND_Y_OFFSET_EAST 3
|
||||
#define LHAND_X_OFFSET_SOUTH 8
|
||||
#define LHAND_Y_OFFSET_SOUTH 3
|
||||
#define LHAND_X_OFFSET_WEST -2
|
||||
#define LHAND_Y_OFFSET_WEST 3
|
||||
|
||||
#define RHAND_X_OFFSET_NORTH 8
|
||||
#define RHAND_Y_OFFSET_NORTH 3
|
||||
#define RHAND_X_OFFSET_EAST 2
|
||||
#define RHAND_Y_OFFSET_EAST 3
|
||||
#define RHAND_X_OFFSET_SOUTH -5
|
||||
#define RHAND_Y_OFFSET_SOUTH 3
|
||||
#define RHAND_X_OFFSET_WEST 2
|
||||
#define RHAND_Y_OFFSET_WEST 3
|
||||
|
||||
#define EARS_X_OFFSET_NORTH 0
|
||||
#define EARS_Y_OFFSET_NORTH 0
|
||||
#define EARS_X_OFFSET_EAST 0
|
||||
#define EARS_Y_OFFSET_EAST 0
|
||||
#define EARS_X_OFFSET_SOUTH 0
|
||||
#define EARS_Y_OFFSET_SOUTH 0
|
||||
#define EARS_X_OFFSET_WEST 0
|
||||
#define EARS_Y_OFFSET_WEST 0
|
||||
|
||||
#define GLASSES_X_OFFSET_NORTH 5
|
||||
#define GLASSES_Y_OFFSET_NORTH 10
|
||||
#define GLASSES_X_OFFSET_EAST 1
|
||||
#define GLASSES_Y_OFFSET_EAST 10
|
||||
#define GLASSES_X_OFFSET_SOUTH -2
|
||||
#define GLASSES_Y_OFFSET_SOUTH 10
|
||||
#define GLASSES_X_OFFSET_WEST -1
|
||||
#define GLASSES_Y_OFFSET_WEST 10
|
||||
|
||||
#define BELT_X_OFFSET_NORTH 0
|
||||
#define BELT_Y_OFFSET_NORTH 10
|
||||
#define BELT_X_OFFSET_EAST 0
|
||||
#define BELT_Y_OFFSET_EAST 0
|
||||
#define BELT_X_OFFSET_SOUTH 0
|
||||
#define BELT_Y_OFFSET_SOUTH 0
|
||||
#define BELT_X_OFFSET_WEST 0
|
||||
#define BELT_Y_OFFSET_WEST 0
|
||||
|
||||
#define BACK_X_OFFSET_NORTH 1
|
||||
#define BACK_Y_OFFSET_NORTH 8
|
||||
#define BACK_X_OFFSET_EAST 0
|
||||
#define BACK_Y_OFFSET_EAST 8
|
||||
#define BACK_X_OFFSET_SOUTH 1
|
||||
#define BACK_Y_OFFSET_SOUTH 8
|
||||
#define BACK_X_OFFSET_WEST 0
|
||||
#define BACK_Y_OFFSET_WEST 8
|
||||
|
||||
#define NECK_X_OFFSET_NORTH 2
|
||||
#define NECK_Y_OFFSET_NORTH 10
|
||||
#define NECK_X_OFFSET_EAST 0
|
||||
#define NECK_Y_OFFSET_EAST 10
|
||||
#define NECK_X_OFFSET_SOUTH 2
|
||||
#define NECK_Y_OFFSET_SOUTH 10
|
||||
#define NECK_X_OFFSET_WEST 0
|
||||
#define NECK_Y_OFFSET_WEST 10
|
||||
|
||||
/mob/living/carbon/wendigo/setDir(newdir, ismousemovement)
|
||||
if(dir == newdir)
|
||||
return //Don't spend time regenerating icons when we don't move
|
||||
. = ..()
|
||||
regenerate_icons()
|
||||
|
||||
/mob/living/carbon/wendigo/regenerate_icons()
|
||||
if(!..())
|
||||
update_inv_head()
|
||||
update_inv_gloves()
|
||||
update_inv_ears()
|
||||
update_inv_glasses()
|
||||
update_inv_belt()
|
||||
update_inv_back()
|
||||
update_inv_neck()
|
||||
update_transform()
|
||||
|
||||
/mob/living/carbon/wendigo/update_inv_gloves()
|
||||
if(gloves)
|
||||
gloves.screen_loc = ui_gloves
|
||||
if(client && hud_used && hud_used.hud_shown)
|
||||
if(hud_used.inventory_shown)
|
||||
client.screen += gloves
|
||||
|
||||
//GLASSES
|
||||
/mob/living/carbon/wendigo/update_inv_glasses()
|
||||
if(glasses)
|
||||
glasses.screen_loc = ui_glasses
|
||||
if(client && hud_used && hud_used.hud_shown)
|
||||
if(hud_used.inventory_shown)
|
||||
client.screen += glasses
|
||||
|
||||
//EARS
|
||||
/mob/living/carbon/wendigo/update_inv_ears()
|
||||
remove_overlay(EARS_LAYER)
|
||||
if(ears)
|
||||
if(client && hud_used)
|
||||
var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_EARS]
|
||||
inv.update_icon()
|
||||
ears.screen_loc = ui_ears //move the item to the appropriate screen loc
|
||||
if(client && hud_used && hud_used.hud_shown)
|
||||
if(hud_used.inventory_shown)
|
||||
client.screen += ears
|
||||
|
||||
overlays_standing[EARS_LAYER] = ears.build_worn_icon(state = ears.icon_state, default_layer = EARS_LAYER, default_icon_file = ((ears.alternate_worn_icon) ? ears.alternate_worn_icon : 'icons/mob/ears.dmi'))
|
||||
var/mutable_appearance/ears_overlay = overlays_standing[EARS_LAYER]
|
||||
switch(dir)
|
||||
if(NORTH)
|
||||
ears_overlay.pixel_x += EARS_X_OFFSET_NORTH
|
||||
ears_overlay.pixel_y += EARS_Y_OFFSET_NORTH
|
||||
if(EAST)
|
||||
ears_overlay.pixel_x += EARS_X_OFFSET_EAST
|
||||
ears_overlay.pixel_y += EARS_Y_OFFSET_EAST
|
||||
if(SOUTH)
|
||||
ears_overlay.pixel_x += EARS_X_OFFSET_SOUTH
|
||||
ears_overlay.pixel_y += EARS_Y_OFFSET_SOUTH
|
||||
if(WEST)
|
||||
ears_overlay.pixel_x += EARS_X_OFFSET_WEST
|
||||
ears_overlay.pixel_y += EARS_Y_OFFSET_WEST
|
||||
overlays_standing[EARS_LAYER] = ears_overlay
|
||||
apply_overlay(EARS_LAYER)
|
||||
|
||||
//BELT
|
||||
/mob/living/carbon/wendigo/update_inv_belt()
|
||||
remove_overlay(BELT_LAYER)
|
||||
|
||||
if(belt)
|
||||
belt.screen_loc = ui_belt
|
||||
if(client && hud_used && hud_used.hud_shown)
|
||||
if(hud_used.inventory_shown)
|
||||
client.screen += belt
|
||||
|
||||
var/t_state = belt.item_state
|
||||
if(!t_state)
|
||||
t_state = belt.icon_state
|
||||
|
||||
overlays_standing[BELT_LAYER] = belt.build_worn_icon(state = t_state, default_layer = BELT_LAYER, default_icon_file = ((belt.alternate_worn_icon) ? belt.alternate_worn_icon : 'icons/mob/belt.dmi'))
|
||||
var/mutable_appearance/belt_overlay = overlays_standing[BELT_LAYER]
|
||||
switch(dir)
|
||||
if(NORTH)
|
||||
belt_overlay.pixel_x += BELT_X_OFFSET_NORTH
|
||||
belt_overlay.pixel_y += BELT_Y_OFFSET_NORTH
|
||||
if(EAST)
|
||||
belt_overlay.pixel_x += BELT_X_OFFSET_EAST
|
||||
belt_overlay.pixel_y += BELT_Y_OFFSET_EAST
|
||||
if(SOUTH)
|
||||
belt_overlay.pixel_x += BELT_X_OFFSET_SOUTH
|
||||
belt_overlay.pixel_y += BELT_Y_OFFSET_SOUTH
|
||||
if(WEST)
|
||||
belt_overlay.pixel_x += BELT_X_OFFSET_WEST
|
||||
belt_overlay.pixel_y += BELT_Y_OFFSET_WEST
|
||||
overlays_standing[BELT_LAYER] = belt_overlay
|
||||
apply_overlay(BELT_LAYER)
|
||||
|
||||
//BACK
|
||||
/mob/living/carbon/wendigo/update_inv_back()
|
||||
..()
|
||||
if(back)
|
||||
back.screen_loc = ui_back
|
||||
if(client && hud_used && hud_used.hud_shown)
|
||||
if(hud_used.inventory_shown)
|
||||
client.screen += back
|
||||
var/mutable_appearance/back_overlay = overlays_standing[BACK_LAYER]
|
||||
if(back_overlay)
|
||||
remove_overlay(BACK_LAYER)
|
||||
switch(dir)
|
||||
if(NORTH)
|
||||
back_overlay.pixel_x += BACK_X_OFFSET_NORTH
|
||||
back_overlay.pixel_y += BACK_Y_OFFSET_NORTH
|
||||
if(EAST)
|
||||
back_overlay.pixel_x += BACK_X_OFFSET_EAST
|
||||
back_overlay.pixel_y += BACK_Y_OFFSET_EAST
|
||||
if(SOUTH)
|
||||
back_overlay.pixel_x += BACK_X_OFFSET_SOUTH
|
||||
back_overlay.pixel_y += BACK_Y_OFFSET_SOUTH
|
||||
if(WEST)
|
||||
back_overlay.pixel_x += BACK_X_OFFSET_WEST
|
||||
back_overlay.pixel_y += BACK_Y_OFFSET_WEST
|
||||
overlays_standing[BACK_LAYER] = back_overlay
|
||||
apply_overlay(BACK_LAYER)
|
||||
|
||||
//NECK
|
||||
/mob/living/carbon/wendigo/update_inv_neck()
|
||||
..()
|
||||
if(wear_neck)
|
||||
wear_neck.screen_loc = ui_neck
|
||||
if(client && hud_used && hud_used.hud_shown)
|
||||
if(hud_used.inventory_shown)
|
||||
client.screen += wear_neck
|
||||
var/mutable_appearance/neck_overlay = overlays_standing[NECK_LAYER]
|
||||
if(neck_overlay)
|
||||
remove_overlay(NECK_LAYER)
|
||||
switch(dir)
|
||||
if(NORTH)
|
||||
neck_overlay.pixel_x += NECK_X_OFFSET_NORTH
|
||||
neck_overlay.pixel_y += NECK_Y_OFFSET_NORTH
|
||||
if(EAST)
|
||||
neck_overlay.pixel_x += NECK_X_OFFSET_EAST
|
||||
neck_overlay.pixel_y += NECK_Y_OFFSET_EAST
|
||||
if(SOUTH)
|
||||
neck_overlay.pixel_x += NECK_X_OFFSET_SOUTH
|
||||
neck_overlay.pixel_y += NECK_Y_OFFSET_SOUTH
|
||||
if(WEST)
|
||||
neck_overlay.pixel_x += NECK_X_OFFSET_WEST
|
||||
neck_overlay.pixel_y += NECK_Y_OFFSET_WEST
|
||||
overlays_standing[NECK_LAYER] = neck_overlay
|
||||
apply_overlay(NECK_LAYER)
|
||||
|
||||
//HANDS
|
||||
/mob/living/carbon/wendigo/update_inv_hands()
|
||||
remove_overlay(HANDS_LAYER)
|
||||
if (handcuffed)
|
||||
drop_all_held_items()
|
||||
return
|
||||
|
||||
var/list/hands = list()
|
||||
for(var/obj/item/I in held_items)
|
||||
if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD)
|
||||
I.screen_loc = ui_hand_position(get_held_index_of_item(I))
|
||||
client.screen += I
|
||||
if(observers && observers.len)
|
||||
for(var/M in observers)
|
||||
var/mob/dead/observe = M
|
||||
if(observe.client && observe.client.eye == src)
|
||||
observe.client.screen += I
|
||||
else
|
||||
observers -= observe
|
||||
if(!observers.len)
|
||||
observers = null
|
||||
break
|
||||
|
||||
var/t_state = I.item_state
|
||||
if(!t_state)
|
||||
t_state = I.icon_state
|
||||
|
||||
var/icon_file = I.lefthand_file
|
||||
var/righthand = 0
|
||||
if(get_held_index_of_item(I) % 2 == 0)
|
||||
icon_file = I.righthand_file
|
||||
righthand = 1
|
||||
|
||||
var/mutable_appearance/thing = I.build_worn_icon(state = t_state, default_layer = HANDS_LAYER, default_icon_file = icon_file, isinhands = TRUE)
|
||||
if(righthand)
|
||||
switch(dir)
|
||||
if(NORTH)
|
||||
thing.pixel_x += RHAND_X_OFFSET_NORTH
|
||||
thing.pixel_y += RHAND_Y_OFFSET_NORTH
|
||||
if(EAST)
|
||||
thing = null //ghetto
|
||||
if(SOUTH)
|
||||
thing.pixel_x += RHAND_X_OFFSET_SOUTH
|
||||
thing.pixel_y += RHAND_Y_OFFSET_SOUTH
|
||||
if(WEST)
|
||||
thing.pixel_x += RHAND_X_OFFSET_WEST
|
||||
thing.pixel_y += RHAND_Y_OFFSET_WEST
|
||||
else
|
||||
switch(dir)
|
||||
if(NORTH)
|
||||
thing.pixel_x += LHAND_X_OFFSET_NORTH
|
||||
thing.pixel_y += LHAND_Y_OFFSET_NORTH
|
||||
if(EAST)
|
||||
thing.pixel_x += LHAND_X_OFFSET_EAST
|
||||
thing.pixel_y += LHAND_Y_OFFSET_EAST
|
||||
if(SOUTH)
|
||||
thing.pixel_x += LHAND_X_OFFSET_SOUTH
|
||||
thing.pixel_y += LHAND_Y_OFFSET_SOUTH
|
||||
if(WEST)
|
||||
thing = null //ghetto
|
||||
|
||||
hands += thing
|
||||
|
||||
overlays_standing[HANDS_LAYER] = hands
|
||||
apply_overlay(HANDS_LAYER)
|
||||
|
||||
//HEAD
|
||||
/mob/living/carbon/wendigo/update_inv_head()
|
||||
remove_overlay(HEAD_LAYER)
|
||||
|
||||
if(head)
|
||||
head.screen_loc = ui_head
|
||||
if(client && hud_used && hud_used.hud_shown)
|
||||
if(hud_used.inventory_shown)
|
||||
client.screen += head
|
||||
var/mutable_appearance/head_icon = head.build_worn_icon(state = head.icon_state, default_layer = HEAD_LAYER, default_icon_file = 'icons/mob/head.dmi')
|
||||
switch(dir)
|
||||
if(NORTH)
|
||||
head_icon.pixel_x += HEAD_X_OFFSET_NORTH
|
||||
head_icon.pixel_y += HEAD_Y_OFFSET_NORTH
|
||||
if(EAST)
|
||||
head_icon.pixel_x += HEAD_X_OFFSET_EAST
|
||||
head_icon.pixel_y += HEAD_Y_OFFSET_EAST
|
||||
if(SOUTH)
|
||||
head_icon.pixel_x += HEAD_X_OFFSET_SOUTH
|
||||
head_icon.pixel_y += HEAD_Y_OFFSET_SOUTH
|
||||
if(WEST)
|
||||
head_icon.pixel_x += HEAD_X_OFFSET_WEST
|
||||
head_icon.pixel_y += HEAD_Y_OFFSET_WEST
|
||||
overlays_standing[SLOT_HEAD] = head_icon
|
||||
update_hud_head(head)
|
||||
|
||||
apply_overlay(HEAD_LAYER)
|
||||
|
||||
#undef LHAND_X_OFFSET_NORTH
|
||||
#undef LHAND_Y_OFFSET_NORTH
|
||||
#undef LHAND_X_OFFSET_EAST
|
||||
#undef LHAND_Y_OFFSET_EAST
|
||||
#undef LHAND_X_OFFSET_SOUTH
|
||||
#undef LHAND_Y_OFFSET_SOUTH
|
||||
#undef LHAND_X_OFFSET_WEST
|
||||
#undef LHAND_Y_OFFSET_WEST
|
||||
#undef RHAND_X_OFFSET_NORTH
|
||||
#undef RHAND_Y_OFFSET_NORTH
|
||||
#undef RHAND_X_OFFSET_EAST
|
||||
#undef RHAND_Y_OFFSET_EAST
|
||||
#undef RHAND_X_OFFSET_SOUTH
|
||||
#undef RHAND_Y_OFFSET_SOUTH
|
||||
#undef RHAND_X_OFFSET_WEST
|
||||
#undef RHAND_Y_OFFSET_WEST
|
||||
#undef EARS_X_OFFSET_NORTH
|
||||
#undef EARS_Y_OFFSET_NORTH
|
||||
#undef EARS_X_OFFSET_EAST
|
||||
#undef EARS_Y_OFFSET_EAST
|
||||
#undef EARS_X_OFFSET_SOUTH
|
||||
#undef EARS_Y_OFFSET_SOUTH
|
||||
#undef EARS_X_OFFSET_WEST
|
||||
#undef EARS_Y_OFFSET_WEST
|
||||
#undef GLASSES_X_OFFSET_NORTH
|
||||
#undef GLASSES_Y_OFFSET_NORTH
|
||||
#undef GLASSES_X_OFFSET_EAST
|
||||
#undef GLASSES_Y_OFFSET_EAST
|
||||
#undef GLASSES_X_OFFSET_SOUTH
|
||||
#undef GLASSES_Y_OFFSET_SOUTH
|
||||
#undef GLASSES_X_OFFSET_WEST
|
||||
#undef GLASSES_Y_OFFSET_WEST
|
||||
#undef BELT_X_OFFSET_NORTH
|
||||
#undef BELT_Y_OFFSET_NORTH
|
||||
#undef BELT_X_OFFSET_EAST
|
||||
#undef BELT_Y_OFFSET_EAST
|
||||
#undef BELT_X_OFFSET_SOUTH
|
||||
#undef BELT_Y_OFFSET_SOUTH
|
||||
#undef BELT_X_OFFSET_WEST
|
||||
#undef BELT_Y_OFFSET_WEST
|
||||
#undef BACK_X_OFFSET_NORTH
|
||||
#undef BACK_Y_OFFSET_NORTH
|
||||
#undef BACK_X_OFFSET_EAST
|
||||
#undef BACK_Y_OFFSET_EAST
|
||||
#undef BACK_X_OFFSET_SOUTH
|
||||
#undef BACK_Y_OFFSET_SOUTH
|
||||
#undef BACK_X_OFFSET_WEST
|
||||
#undef BACK_Y_OFFSET_WEST
|
||||
#undef NECK_X_OFFSET_NORTH
|
||||
#undef NECK_Y_OFFSET_NORTH
|
||||
#undef NECK_X_OFFSET_EAST
|
||||
#undef NECK_Y_OFFSET_EAST
|
||||
#undef NECK_X_OFFSET_SOUTH
|
||||
#undef NECK_Y_OFFSET_SOUTH
|
||||
#undef NECK_X_OFFSET_WEST
|
||||
#undef NECK_Y_OFFSET_WEST
|
||||
@@ -7,26 +7,13 @@
|
||||
. = ..()
|
||||
var/dat = {"<B>Genitals</B><BR><HR>"}
|
||||
|
||||
//List genitals
|
||||
var/obj/item/organ/genital/penis/P = user.getorganslot("penis")
|
||||
if (P) //they have a pp
|
||||
dat += "<a href='byond://?src=[REF(src)];hidepenis=1'>[P.mode == "hidden" ? "Penis <font color='red'>(Hidden)</font>" : (P.mode == "clothes" ? "Penis <font color='yellow'>(Hidden by Clothes)</font>" : (P.mode == "visable" ? "Penis <font color='green'>(Visable)</font>" : "Penis <font color='green'>(Visable)</font>"))]</a><BR>"
|
||||
|
||||
var/obj/item/organ/genital/testicles/T = user.getorganslot("testicles")
|
||||
if (T) //they have teabags
|
||||
if(!T.internal)
|
||||
dat += "<a href='byond://?src=[REF(src)];hidetesticles=1'>[T.mode == "hidden" ? "Testicles <font color='red'>(Hidden)</font>" : (T.mode == "clothes" ? "Testicles <font color='yellow'>(Hidden by Clothes)</font>" : (T.mode == "visable" ? "Testicles <font color='green'>(Visable)</font>" : "Testicles <font color='green'>(Visable)</font>"))]</a><BR>"
|
||||
else //internal balls
|
||||
dat += "<a href='byond://?src=[REF(src)];na=1'>Internal Testicles</A><BR>"
|
||||
var/obj/item/organ/genital/vagina/V = user.getorganslot("vagina")
|
||||
if (V) //they have a vjay
|
||||
dat += "<a href='byond://?src=[REF(src)];hidevagina=1'>[V.mode == "hidden" ? "Vagina <font color='red'>(Hidden)</font>" : (V.mode == "clothes" ? "Vagina <font color='yellow'>(Hidden by Clothes)</font>" : (V.mode == "visable" ? "Vagina <font color='green'>(Visable)</font>" : "Vagina <font color='green'>(Visable)</font>"))]</a><BR>"
|
||||
|
||||
var/obj/item/organ/genital/breasts/B = user.getorganslot("breasts")
|
||||
if (B) //they have a boobiedoo
|
||||
dat += "<a href='byond://?src=[REF(src)];hidebreasts=1'>[B.mode == "hidden" ? "Breasts <font color='red'>(Hidden)</font>" : (B.mode == "clothes" ? "Breasts <font color='yellow'>(Hidden by Clothes)</font>" : (B.mode == "visable" ? "Breasts <font color='green'>(Visable)</font>" : "Breasts <font color='green'>(Visable)</font>"))]</a><BR>"
|
||||
var/mob/living/carbon/U = user
|
||||
for(var/obj/item/organ/genital/G in U.internal_organs)
|
||||
if(!G.dontlist)
|
||||
dat += "<a href='byond://?src=[REF(src)];hide[G.name]=1'>[G.mode == "hidden" ? "[G.name] <font color='red'>(Hidden)</font>" : (G.mode == "clothes" ? "[G.name] <font color='yellow'>(Hidden by Clothes)</font>" : (G.mode == "visable" ? "[G.name] <font color='green'>(Visable)</font>" : "[G.name] <font color='green'>(Visable)</font>"))]</a><BR>"
|
||||
|
||||
dat += {"<BR><B>Contexual Options</B><BR><HR>"}
|
||||
var/obj/item/organ/genital/penis/P = user.getorganslot("penis")
|
||||
//Options
|
||||
dat += "<a href='byond://?src=[REF(src)];masturbate=1'>Masturbate</A>"
|
||||
dat += "(Stimulate a sexual organ with your hands.)<BR>"
|
||||
@@ -37,13 +24,22 @@
|
||||
dat += "<a href='byond://?src=[REF(src)];container=1'>Fill container</A>"
|
||||
dat += "(Use a container in your hand to collect your seminal fluid.)<BR>"
|
||||
|
||||
var/mob/living/carbon/human/C = usr
|
||||
if(C && C.w_uniform || C.wear_suit) //if they are wearing cloths
|
||||
dat += "<a href='byond://?src=[REF(src)];clothesplosion=1'>Explode out of clothes</A>"
|
||||
dat += "(Flex your body to cause your clothes to burst apart.)<BR>"
|
||||
|
||||
if(user.pulling)
|
||||
dat += "<a href='byond://?src=[REF(src)];kiss=1'>Kiss [user.pulling]</A>"
|
||||
dat += "(Kiss a partner, or object.)<BR>"
|
||||
else
|
||||
dat += "<span class='linkOff'>Kiss</span></A>"
|
||||
dat += "(Requires a partner)<BR>"
|
||||
|
||||
|
||||
if(user.pulling)
|
||||
dat += "<a href='byond://?src=[REF(src)];climaxover=1'>Climax over [user.pulling]</A>" //you can cum on objects if you really want...
|
||||
dat += "(Orgasm over a person or object.)<BR>"
|
||||
|
||||
if(isliving(user.pulling))
|
||||
if(iscarbon(user.pulling))
|
||||
dat += "<a href='byond://?src=[REF(src)];climaxwith=1'>Climax with [user.pulling]</A>"
|
||||
@@ -51,15 +47,24 @@
|
||||
|
||||
var/mob/living/carbon/human/H = user.pulling
|
||||
if(H.breedable && P && H)
|
||||
dat += "<a href='byond://?src=[REF(src)];impreg=1'>Impregnate [user.pulling]</A>"
|
||||
dat += "(Climax inside another person, knocking them up.)<BR>"
|
||||
dat += "<a href='byond://?src=[REF(src)];impreg=1'>Impregnate [U.pulling] ([clamp(U.impregchance,0,100)]%)</A>"
|
||||
dat += "(Climax inside another person, and attempt to knock them up.)<BR>"
|
||||
else
|
||||
dat += "<span class='linkOff'>Climax over</span></A>"
|
||||
dat += "(Requires a partner)<BR>"
|
||||
dat += "<span class='linkOff'>Climax with</span></A>"
|
||||
dat += "(Requires a partner)<BR>"
|
||||
|
||||
|
||||
if(P) // They have a dick (make sure to check or this will break everything)
|
||||
//old code needs to be cleaned
|
||||
if(P)
|
||||
if(P.condom == 1)
|
||||
dat += "<a href='byond://?src=[REF(src)];removecondom=1'>Remove Condom</A><BR>"
|
||||
dat += "<a href='byond://?src=[REF(src)];removecondom=1'>Remove condom (penis)</A><BR>"
|
||||
if(P.sounding == 1)
|
||||
dat += "<a href='byond://?src=[REF(src)];removesound=1'>Remove Sounding Rod</A><BR>"
|
||||
dat += "<a href='byond://?src=[REF(src)];removesound=1'>Remove sounding rod (penis)</A><BR>"
|
||||
for(var/obj/item/organ/genital/G in U.internal_organs)
|
||||
if(G.equipment) //they have equipment
|
||||
dat += "<a href='byond://?src=[REF(src)];removeequipment[G.name]=1;'>Remove [G.equipment.name] ([G.name])</A><BR>"
|
||||
|
||||
dat += {"<HR>"}//Newline for the objects
|
||||
//bottom options
|
||||
dat += "<a href='byond://?src=[REF(src)];refresh=1'>Refresh</A>"
|
||||
@@ -74,6 +79,9 @@
|
||||
popup.open()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/screen/arousal/Topic(href, href_list)
|
||||
. = ..() //Sanity checks.
|
||||
if(..())
|
||||
@@ -106,6 +114,11 @@
|
||||
var/picked_visibility = input(usr, "Choose visibility", "Expose/Hide genitals", "Hidden by clothes") in list("Always visible", "Hidden by clothes", "Always hidden")
|
||||
B.toggle_visibility(picked_visibility)
|
||||
|
||||
if(href_list["hidebelly"])
|
||||
var/obj/item/organ/genital/belly/E = usr.getorganslot("belly")
|
||||
var/picked_visibility = input(usr, "Choose visibility", "Expose/Hide genitals", "Hidden by clothes") in list("Always visible", "Hidden by clothes", "Always hidden")
|
||||
E.toggle_visibility(picked_visibility)
|
||||
|
||||
if(href_list["hidetesticles"])
|
||||
var/obj/item/organ/genital/testicles/T = usr.getorganslot("testicles")
|
||||
var/picked_visibility = input(usr, "Choose visibility", "Expose/Hide genitals", "Hidden by clothes") in list("Always visible", "Hidden by clothes", "Always hidden")
|
||||
@@ -127,6 +140,14 @@
|
||||
to_chat(usr, "<span class='warning'>You aren't aroused enough for that! </span>")
|
||||
return
|
||||
|
||||
if(href_list["clothesplosion"])
|
||||
if (H.arousalloss >= (H.max_arousal / 100) * 33) //Requires 33% arousal.
|
||||
H.clothesplosion()
|
||||
return
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>You aren't aroused enough for that! </span>")
|
||||
return
|
||||
|
||||
if(href_list["climax"])
|
||||
if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal.
|
||||
H.climaxalone(FALSE)
|
||||
@@ -172,6 +193,34 @@
|
||||
if(href_list["removesound"])
|
||||
H.menuremovesounding()
|
||||
|
||||
if(href_list["removeequipmentpenis"])
|
||||
var/obj/item/organ/genital/penis/O = usr.getorganslot("penis")
|
||||
var/obj/item/I = O.equipment
|
||||
usr.put_in_hands(I)
|
||||
O.equipment = null
|
||||
|
||||
if(href_list["removeequipmentbreasts"])
|
||||
var/obj/item/organ/genital/breasts/O = usr.getorganslot("breasts")
|
||||
var/obj/item/I = O.equipment
|
||||
usr.put_in_hands(I)
|
||||
O.equipment = null
|
||||
|
||||
|
||||
if(href_list["removeequipmentvagina"])
|
||||
var/obj/item/organ/genital/vagina/O = usr.getorganslot("vagina")
|
||||
var/obj/item/I = O.equipment
|
||||
usr.put_in_hands(I)
|
||||
if(istype(I, /obj/item/portalpanties))
|
||||
var/obj/item/portalpanties/P = I
|
||||
P.remove()
|
||||
O.equipment = null
|
||||
|
||||
if(href_list["removeequipmentbelly"])
|
||||
var/obj/item/organ/genital/belly/O = usr.getorganslot("belly")
|
||||
var/obj/item/I = O.equipment
|
||||
usr.put_in_hands(I)
|
||||
O.equipment = null
|
||||
|
||||
if(href_list["omenu"])
|
||||
usr << browse(null, "window=arousal") //closes the window
|
||||
H.mob_climax()
|
||||
@@ -268,8 +317,6 @@ obj/screen/arousal/proc/kiss()
|
||||
src.visible_message("<span class='notice'>[src] is about to kiss [L]!</span>", \
|
||||
"<span class='notice'>You're attempting to kiss [L]!</span>", \
|
||||
"<span class='notice'>You're attempting to kiss with something!</span>")
|
||||
if(!do_mob(src, L, 2 SECONDS)) //I think two seconds is enough time to pull away if its unwanted.
|
||||
return
|
||||
SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "kissed", /datum/mood_event/kiss) //how cute, affection is nice.
|
||||
//Well done you kissed it/them!
|
||||
src.visible_message("<span class='notice'>[src] kisses [L]!</span>", \
|
||||
@@ -288,7 +335,6 @@ obj/screen/arousal/proc/kiss()
|
||||
to_chat(src, "<span class='warning'>You cannot climax without choosing genitals.</span>")
|
||||
return
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/climaxwith(mob/living/T)
|
||||
|
||||
var/mob/living/carbon/human/L = pick_partner()
|
||||
@@ -313,6 +359,8 @@ obj/screen/arousal/proc/kiss()
|
||||
to_chat(src, "<span class='warning'>You cannot climax without choosing genitals.</span>")
|
||||
return
|
||||
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/climaxover(mob/living/T)
|
||||
|
||||
var/mob/living/carbon/human/L = T
|
||||
@@ -337,6 +385,20 @@ obj/screen/arousal/proc/kiss()
|
||||
to_chat(src, "<span class='warning'>You cannot climax without choosing genitals.</span>")
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/proc/clothesplosion()
|
||||
if(usr.restrained(TRUE))
|
||||
to_chat(usr, "<span class='warning'>You can't do that while restrained!</span>")
|
||||
return
|
||||
var/mob/living/carbon/human/H = src
|
||||
var/items = H.get_contents()
|
||||
for(var/obj/item/W in items)
|
||||
if(W == H.w_uniform || W == H.wear_suit)
|
||||
H.dropItemToGround(W, TRUE)
|
||||
playsound(H.loc, 'sound/items/poster_ripped.ogg', 50, 1)
|
||||
H.visible_message("<span class='boldnotice'>[H] explodes out of their clothes!'</span>")
|
||||
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/impregwith(mob/living/T)
|
||||
|
||||
var/mob/living/carbon/human/L = pick_partner()
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
/datum/export/sweatshop/stool
|
||||
cost = 850
|
||||
unit_name = "custom stool"
|
||||
export_types = list(/obj/item/processed/wood/stool)
|
||||
|
||||
/datum/export/sweatshop/cushion
|
||||
cost = 300
|
||||
unit_name = "cloth cushion"
|
||||
export_types = list(/obj/item/cushion)
|
||||
|
||||
/datum/export/sweatshop/cushionsilk
|
||||
cost = 500
|
||||
unit_name = "silk cushion"
|
||||
export_types = list(/obj/item/cushion)
|
||||
|
||||
/datum/export/sweatshop/stool/cushioncloth
|
||||
cost = 1800
|
||||
unit_name = "cushioned stool (cloth)"
|
||||
export_types = list(/obj/item/processed/wood/stoolcloth)
|
||||
|
||||
/datum/export/sweatshop/stool/cushionsilk
|
||||
cost = 2400
|
||||
unit_name = "cushioned stool (cloth)"
|
||||
export_types = list(/obj/item/processed/wood/stoolsilk)
|
||||
@@ -0,0 +1,7 @@
|
||||
/datum/supply_pack/service/stripperpole
|
||||
name = "Stripper Pole Crate"
|
||||
desc = "No private bar is complete without a stripper pole, show off the goods! Comes with a ready-to-assemble stripper pole, and a complementary wrench to get things set up!"
|
||||
cost = 3550
|
||||
contains = list(/obj/item/polepack/,
|
||||
/obj/item/wrench/)
|
||||
crate_name = "stripper pole crate"
|
||||
@@ -0,0 +1,6 @@
|
||||
/obj/item/processed/metal
|
||||
name = "Heated Metal"
|
||||
desc = "A malleable metal, able to be cut into nails."
|
||||
icon = 'hyperstation/icons/obj/cargo/sweatshop/metal.dmi'
|
||||
icon_state = "metal"
|
||||
sharpness = TRUE
|
||||
@@ -0,0 +1,256 @@
|
||||
//THE TOOLS
|
||||
/obj/item/carpentry
|
||||
name = "carpentry"
|
||||
desc = "You shouldn't be seeing this!"
|
||||
icon = 'hyperstation/icons/obj/cargo/sweatshop/sweatshop.dmi'
|
||||
usesound = list('sound/effects/picaxe1.ogg', 'sound/effects/picaxe2.ogg', 'sound/effects/picaxe3.ogg')
|
||||
|
||||
/obj/item/carpentry/handsaw
|
||||
name = "handsaw"
|
||||
desc = "A shoddy tool used to process wood into smaller segments."
|
||||
icon_state = "handsaw"
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
force = 8
|
||||
sharpness = TRUE
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
materials = list(MAT_METAL=50)
|
||||
attack_verb = list("slashed", "sawed")
|
||||
|
||||
/obj/item/carpentry/hammer
|
||||
name = "hammer"
|
||||
desc = "A tool used to manually bash nails into place."
|
||||
icon_state = "hammer"
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
force = 7
|
||||
sharpness = FALSE
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
materials = list(MAT_METAL=100)
|
||||
attack_verb = list("bonked", "nailed")
|
||||
|
||||
/obj/item/carpentry/glue
|
||||
name = "glue"
|
||||
desc = "Used to haphazardly stick things together; secured by the toughest Monkey Glue(TM)."
|
||||
icon_state = "glue"
|
||||
force = 0
|
||||
sharpness = FALSE
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
materials = list(MAT_PLASTIC=25)
|
||||
attack_verb = list("glued", "coughed")
|
||||
|
||||
/obj/item/carpentry/borer
|
||||
name = "manual borer"
|
||||
desc = "An incredibly awful tool used to manually drill holes into something... Surely there's a better option."
|
||||
icon_state = "borer"
|
||||
force = 3
|
||||
sharpness = TRUE
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
materials = list(MAT_METAL=25)
|
||||
attack_verb = list("bored", "drilled")
|
||||
|
||||
/obj/item/carpentry/sandpaper
|
||||
name = "sandpaper strip"
|
||||
desc = "A strip of sandpaper, commonly used for sanding down rough surfaces into a more smooth shape."
|
||||
icon_state = "sandpaper"
|
||||
force = 1
|
||||
sharpness = FALSE
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
materials = list(MAT_GLASS=1) //lmao
|
||||
attack_verb = list("sanded", "licked")
|
||||
|
||||
/obj/item/nails
|
||||
name = "metal nails"
|
||||
desc = "A bunch of nails, used for hammering into things."
|
||||
icon = 'hyperstation/icons/obj/cargo/sweatshop/sweatshop.dmi'
|
||||
icon_state = "nails"
|
||||
force = 0
|
||||
sharpness = TRUE
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
materials = list(MAT_METAL=10)
|
||||
attack_verb = list("nailed", "screwed")
|
||||
|
||||
/obj/item/cushion
|
||||
name = "basic cushion"
|
||||
desc = "Beats sitting on the floor."
|
||||
icon = 'hyperstation/icons/obj/cargo/sweatshop/cloth.dmi'
|
||||
icon_state = "clothcushion"
|
||||
force = 0
|
||||
sharpness = FALSE
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
attack_verb = list("thomped", "thwacked")
|
||||
|
||||
/obj/item/cushion/silk
|
||||
name = "silk cushion"
|
||||
desc = "How'd it turn red?!"
|
||||
icon_state = "silkcushion"
|
||||
|
||||
//BASIC RECIPES - To do, add sound. As well as refactor everything in a more smart way so we can add the possibility of multiple wood types in the future.
|
||||
//saw a plank into two platforms
|
||||
/obj/item/processed/wood/plank/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/carpentry/handsaw))
|
||||
to_chat(user,"<span class='notice'> You begin to saw [src] in half...</span>")
|
||||
if(do_after(user, 40) && isturf(loc))
|
||||
new src.sawobj(loc)
|
||||
new src.sawobj(loc) //send help i dont know how to make two in the same line lmfao
|
||||
to_chat(user, "<span class='notice'> You saw [src] in half.</span>")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to hold still to saw [src]!</span>")
|
||||
else
|
||||
..()
|
||||
//saw a platform into four blocks
|
||||
/obj/item/processed/wood/platform/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/carpentry/handsaw))
|
||||
to_chat(user,"<span class='notice'> You begin cut [src] into smaller pieces...</span>")
|
||||
if(do_after(user, 20) && isturf(loc))
|
||||
new src.sawobj(loc)
|
||||
new src.sawobj(loc)
|
||||
new src.sawobj(loc)
|
||||
new src.sawobj(loc)
|
||||
to_chat(user, "<span class='notice'> You cut [src] into four pieces.</span>")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to hold still to saw [src]!</span>")
|
||||
else
|
||||
..()
|
||||
//sand a block into a peg
|
||||
/obj/item/processed/wood/block/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/carpentry/sandpaper))
|
||||
to_chat(user,"<span class='notice'> You carefully begin to sand down [src]...</span>")
|
||||
if(do_after(user, 50) && isturf(loc))
|
||||
new src.sandobj(loc)
|
||||
to_chat(user, "<span class='notice'> You smooth [src] into a peg.</span>")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to hold still to sand [src]!</span>")
|
||||
else
|
||||
..()
|
||||
//cut heated metal into nails
|
||||
/obj/item/processed/metal/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/wirecutters))
|
||||
to_chat(user,"<span class='notice'> You tediously begin to cut [src] into several nails...</span>")
|
||||
if(do_after(user, 80) && isturf(loc))
|
||||
new /obj/item/nails(loc)
|
||||
new /obj/item/nails(loc)
|
||||
to_chat(user, "<span class='notice'> You make some crude metal nails.</span>")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to hold still to process [src]!</span>")
|
||||
else
|
||||
..()
|
||||
|
||||
//Covered in glue
|
||||
//cover a wooden block in glue
|
||||
/obj/item/processed/wood/block/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/carpentry/glue))
|
||||
to_chat(user,"<span class='notice'> You begin to glue down one end of [src]...</span>")
|
||||
if(do_after(user, 10) && isturf(loc))
|
||||
new src.glueobj(loc)
|
||||
to_chat(user, "<span class='notice'> You slap some glue onto [src].</span>")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to hold still to glue [src]!</span>")
|
||||
else
|
||||
..()
|
||||
//cover a wooden peg in glue
|
||||
/obj/item/processed/wood/peg/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/carpentry/glue))
|
||||
to_chat(user,"<span class='notice'> You begin to glue down one end of the [src]...</span>")
|
||||
if(do_after(user, 10) && isturf(loc))
|
||||
new src.glueobj(loc)
|
||||
to_chat(user, "<span class='notice'> You slap some glue onto [src].</span>")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to hold still to glue [src]!</span>")
|
||||
else
|
||||
..()
|
||||
|
||||
//Seats
|
||||
//bore a platform into a seat
|
||||
/obj/item/processed/wood/platform/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/carpentry/borer))
|
||||
to_chat(user,"<span class='notice'> You begin to cut four holes into [src]...</span>")
|
||||
if(do_after(user, 40) && isturf(loc))
|
||||
new src.boreobj(loc)
|
||||
to_chat(user, "<span class='notice'> You drill four holes into [src].</span>")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to hold still to refine [src]!</span>")
|
||||
else
|
||||
..()
|
||||
|
||||
//Stools - Further crafting
|
||||
/obj/item/processed/wood/stool1/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/nails))
|
||||
to_chat(user,"<span class='notice'> You place nails into [src]...</span>")
|
||||
if(do_after(user, 20) && isturf(loc))
|
||||
new /obj/item/processed/wood/stool2(loc)
|
||||
to_chat(user, "<span class='notice'> The nails are ready to be hammered.</span>")
|
||||
qdel(src)
|
||||
qdel(I)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to hold still to refine [src]!</span>")
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/processed/wood/stool2/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/carpentry/hammer))
|
||||
to_chat(user,"<span class='notice'> You begin to hammer the [src]...</span>")
|
||||
if(do_after(user, 30) && isturf(loc))
|
||||
new /obj/item/processed/wood/stool3(loc)
|
||||
to_chat(user, "<span class='notice'> The nails are hammered into place.</span>")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to hold still to refine [src]!</span>")
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/processed/wood/stool3/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/carpentry/sandpaper))
|
||||
to_chat(user,"<span class='notice'> You begin to sand the [src]...</span>")
|
||||
if(do_after(user, 30) && isturf(loc))
|
||||
new /obj/item/processed/wood/stool4(loc)
|
||||
to_chat(user, "<span class='notice'> You sand down the [src].</span>")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to hold still to refine [src]!</span>")
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/processed/wood/stool4/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/processed/wood/glueblock))
|
||||
to_chat(user,"<span class='notice'> You add some finishing touches to the [src]...</span>")
|
||||
if(do_after(user, 30) && isturf(loc))
|
||||
new /obj/item/processed/wood/stool(loc)
|
||||
to_chat(user, "<span class='notice'> You complete the [src].</span>")
|
||||
qdel(src)
|
||||
qdel(I)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to hold still to refine [src]!</span>")
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/processed/wood/stool/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/cushion))
|
||||
to_chat(user,"<span class='notice'> You secure a cloth cushion to [src]...</span>")
|
||||
if(do_after(user, 30) && isturf(loc))
|
||||
new /obj/item/processed/wood/stoolcloth(loc)
|
||||
to_chat(user, "<span class='notice'> You add a cushion to [src].</span>")
|
||||
qdel(src)
|
||||
qdel(I)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to hold still to detail [src]!</span>")
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/processed/wood/stool/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/cushion/silk))
|
||||
to_chat(user,"<span class='notice'> You secure a silk cushion to [src]...</span>")
|
||||
if(do_after(user, 30) && isturf(loc))
|
||||
new /obj/item/processed/wood/stoolsilk(loc)
|
||||
to_chat(user, "<span class='notice'> You add a cushion to [src].</span>")
|
||||
qdel(src)
|
||||
qdel(I)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to hold still to detail [src]!</span>")
|
||||
else
|
||||
..()
|
||||
@@ -0,0 +1,128 @@
|
||||
//WOODEN COMPONENTS. honestly i need to move some shit around to allow for easier material swapping, but that's for a later date.
|
||||
|
||||
/obj/item/processed/wood
|
||||
name = "Wooden Processed Item"
|
||||
desc = "You shouldn't see this!"
|
||||
icon = 'hyperstation/icons/obj/cargo/sweatshop/wooden.dmi'
|
||||
sharpness = FALSE
|
||||
attack_verb = list("slapped", "thunked")
|
||||
var/sawobj = /obj/item/condom
|
||||
var/glueobj = /obj/item/dildo
|
||||
var/sandobj = /obj/item/carpentry/sandpaper
|
||||
var/boreobj = /obj/item/carpentry/borer
|
||||
|
||||
/obj/item/processed/wood/plank
|
||||
name = "processable wooden plank"
|
||||
desc = "A somewhat sturdy refined plank. This can be used in various applications."
|
||||
icon_state = "plank"
|
||||
force = 3
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
sawobj = /obj/item/processed/wood/platform
|
||||
|
||||
/obj/item/processed/wood/platform
|
||||
name = "wood platform"
|
||||
desc = "A somewhat sturdy cropping of a plank. This one is an alright foundation for chairs and stools."
|
||||
icon_state = "platform"
|
||||
force = 3
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
sawobj = /obj/item/processed/wood/block
|
||||
boreobj = /obj/item/processed/wood/seat
|
||||
|
||||
/obj/item/processed/wood/block
|
||||
name = "wood block"
|
||||
desc = "A chopped platform into a wooden block. This one can be used for sanded into pegs, or used as a base on it's own."
|
||||
icon_state = "block"
|
||||
force = 2
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
sandobj = /obj/item/processed/wood/peg
|
||||
glueobj = /obj/item/processed/wood/glueblock
|
||||
|
||||
/obj/item/processed/wood/peg
|
||||
name = "wood peg"
|
||||
desc = "A wooden peg. Useful for fitting into holes."
|
||||
icon_state = "peg"
|
||||
force = 1
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
attack_verb = list("donked", "thunked")
|
||||
glueobj = /obj/item/processed/wood/gluepeg
|
||||
|
||||
//glue
|
||||
|
||||
/obj/item/processed/wood/gluepeg
|
||||
name = "glued wood peg"
|
||||
desc = "A wooden peg. With a bunch of glue used for securing."
|
||||
icon_state = "gluepeg"
|
||||
force = 1
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
attack_verb = list("pegged", "thunked")
|
||||
|
||||
/obj/item/processed/wood/glueblock
|
||||
name = "glued wood block"
|
||||
desc = "A wooden block. With a bunch of glue used for securing."
|
||||
icon_state = "glueblock"
|
||||
force = 2
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
attack_verb = list("blocked", "thunked")
|
||||
|
||||
//seat
|
||||
/obj/item/processed/wood/seat
|
||||
name = "wood seat"
|
||||
desc = "A baseline for crafting seats. Not exactly that comfortable to sit on..."
|
||||
icon_state = "seat"
|
||||
force = 2
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
attack_verb = list("slapped", "thunked")
|
||||
|
||||
|
||||
//Stool steps. There's probably an easier way to do this, but I cannot be assed rn, I'll refine after PR
|
||||
/obj/item/processed/wood/stool1
|
||||
name = "stool base"
|
||||
desc = "A haphazardly made base for a stool. It's not even secured with any nails."
|
||||
icon_state = "stool1"
|
||||
force = 4
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
|
||||
/obj/item/processed/wood/stool2
|
||||
name = "nailed stool base"
|
||||
desc = "Nails are in position"
|
||||
icon_state = "stool2"
|
||||
force = 4
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
|
||||
/obj/item/processed/wood/stool3
|
||||
name = "hammered stool base"
|
||||
desc = "A vaguely stool-shaped... Thing. Could use some sandpaper."
|
||||
icon_state = "stool3"
|
||||
force = 4
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
|
||||
/obj/item/processed/wood/stool4
|
||||
name = "bland stool"
|
||||
desc = "A rather bland stool."
|
||||
icon_state = "stool4"
|
||||
force = 4
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
|
||||
//The finished product
|
||||
/obj/item/processed/wood/stool
|
||||
name = "custom stool"
|
||||
desc = "An intricite, custom stool."
|
||||
icon_state = "stool"
|
||||
force = 10
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
|
||||
//Let's make it soft and more expensive
|
||||
|
||||
/obj/item/processed/wood/stoolcloth
|
||||
name = "cloth-cushioned stool"
|
||||
desc = "A custom stool with a cloth cushion."
|
||||
icon_state = "stoolcloth"
|
||||
force = 10
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
|
||||
/obj/item/processed/wood/stoolsilk
|
||||
name = "cloth-cushioned stool"
|
||||
desc = "A custom stool with a silk cushion."
|
||||
icon_state = "stoolsilk"
|
||||
force = 11 //lol
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
@@ -0,0 +1,13 @@
|
||||
/obj/item/clothing/gloves/guncaster
|
||||
name = "fingerless leather gloves"
|
||||
desc = "Sturdy leather gloves with no fingertips, buckled at the wrist."
|
||||
icon_state = "guncaster"
|
||||
item_state = "guncaster"
|
||||
icon = 'hyperstation/icons/obj/clothing/gloves.dmi'
|
||||
alternate_worn_icon = 'hyperstation/icons/mobs/gloves.dmi'
|
||||
item_color = null //So they don't wash.
|
||||
transfer_prints = TRUE
|
||||
strip_delay = 40
|
||||
equip_delay_other = 20
|
||||
cold_protection = HANDS
|
||||
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
|
||||
@@ -37,3 +37,133 @@
|
||||
SEND_SOUND(user, sound('hyperstation/sound/halflife/hevsuit_firstpickup.ogg', volume = 50))
|
||||
SEND_SOUND(user, sound('hyperstation/sound/halflife/anomalous_materials.ogg', volume = 50))
|
||||
return
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/shielded/goldenpa
|
||||
name = "Kinaris Power Armor"
|
||||
desc = "An advanced armor with built in energy shielding, developed by Kinaris via unknown means. It belongs by only few exclusive members of the corporation."
|
||||
icon_state = "golden_pa"
|
||||
item_state = "golden_pa"
|
||||
max_charges = 4
|
||||
current_charges = 4
|
||||
recharge_delay = 15
|
||||
armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
|
||||
strip_delay = 130
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/goldenpa
|
||||
slowdown = 0
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/shielded/goldenpa/Initialize()
|
||||
jetpack = new /obj/item/tank/jetpack/suit(src)
|
||||
. = ..()
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/shielded/goldenpa
|
||||
name = "Kinaris Power Helmet"
|
||||
desc = "An advanced armor helmet with built in energy shielding, developed by Kinaris via unknown means. It belongs by only few exclusive members of the corporation."
|
||||
icon_state = "hardsuit0-goldenpa"
|
||||
item_state = "hardsuit0-goldenpa"
|
||||
item_color = "goldenpa"
|
||||
armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
|
||||
strip_delay = 130
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/teslapa
|
||||
name = "Tesla Power Armor"
|
||||
desc = "An advanced power armor, with built-in tesla technology. You're sure this will fry whoever dares attack in close quarters."
|
||||
icon_state = "tesla_pa"
|
||||
item_state = "tesla_pa"
|
||||
item_color = "tesla_pa"
|
||||
armor = list("melee" = 70, "bullet" = 70, "laser" = 90, "energy" = 90, "bomb" = 70, "bio" = 100, "rad" = 40, "fire" = 100, "acid" = 100)
|
||||
strip_delay = 300
|
||||
equip_delay_self = 300
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/teslapahelmet
|
||||
slowdown = 1
|
||||
siemens_coefficient = -1
|
||||
blood_overlay_type = "armor"
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
hit_reaction_chance = 50
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
var/teslapa_cooldown = 20
|
||||
var/teslapa_cooldown_duration = 10
|
||||
var/tesla_power = 20000
|
||||
var/tesla_range = 4
|
||||
var/tesla_flags = TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE
|
||||
var/legacy = FALSE
|
||||
var/legacy_dmg = 35
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/teslapa/Initialize()
|
||||
jetpack = new /obj/item/tank/jetpack/suit(src)
|
||||
. = ..()
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/teslapa/dropped(mob/user)
|
||||
..()
|
||||
if(istype(user))
|
||||
user.flags_1 &= ~TESLA_IGNORE_1
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/teslapa/equipped(mob/user, slot)
|
||||
..()
|
||||
if(slot_flags & slotdefine2slotbit(slot)) //Was equipped to a valid slot for this item?
|
||||
user.flags_1 |= TESLA_IGNORE_1
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/teslapa/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
|
||||
if(prob(hit_reaction_chance))
|
||||
if(world.time < teslapa_cooldown_duration)
|
||||
var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
|
||||
sparks.set_up(1, 1, src)
|
||||
sparks.start()
|
||||
owner.visible_message("<span class='danger'>The tesla capacitors on [owner]'s Tesla Power Armor are still recharging! The armor merely emits some sparks.</span>")
|
||||
return
|
||||
owner.visible_message("<span class='danger'>[src] blocks [attack_text], sending out arcs of lightning!</span>")
|
||||
if(!legacy)
|
||||
tesla_zap(owner, tesla_range, tesla_power, tesla_flags)
|
||||
else
|
||||
for(var/mob/living/M in view(2, owner))
|
||||
if(M == owner)
|
||||
continue
|
||||
owner.Beam(M,icon_state="purple_lightning",icon='icons/effects/effects.dmi',time=5)
|
||||
M.adjustFireLoss(legacy_dmg)
|
||||
playsound(M, 'sound/machines/defib_zap.ogg', 50, 1, -1)
|
||||
teslapa_cooldown = world.time + teslapa_cooldown_duration
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/teslapahelmet
|
||||
name = "Tesla Power Armor Helmet"
|
||||
desc = "An advanced power armor, with built-in tesla technology. You're sure this will fry whoever dares attack in close quarters."
|
||||
icon_state = "teslaup"
|
||||
item_state = "teslaup"
|
||||
armor = list("melee" = 70, "bullet" = 70, "laser" = 90, "energy" = 90, "bomb" = 70, "bio" = 100, "rad" = 10, "fire" = 100, "acid" = 100)
|
||||
strip_delay = 130
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/advancedpa
|
||||
name = "Advanced Power Armor"
|
||||
desc = "An advanced power armor. You're sure this is near to impossible to penetrate in close quarters."
|
||||
icon_state = "advanced_pa"
|
||||
item_state = "advanced_pa"
|
||||
item_color = "advanced_pa"
|
||||
armor = list("melee" = 95, "bullet" = 95, "laser" = 70, "energy" = 80, "bomb" = 70, "bio" = 100, "rad" = 40, "fire" = 100, "acid" = 100)
|
||||
strip_delay = 300 //chonky armor means chonky strip
|
||||
equip_delay_self = 300
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/advancedpahelmet
|
||||
slowdown = 0
|
||||
blood_overlay_type = "armor"
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/advancedpa/Initialize()
|
||||
jetpack = new /obj/item/tank/jetpack/suit(src)
|
||||
. = ..()
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/advancedpahelmet
|
||||
name = "Advanced Power Armor Helmet"
|
||||
desc = "An advanced power armor. You're sure this is almost impenetrable in close quarters."
|
||||
icon_state = "adv_pa"
|
||||
item_state = "adv_pa"
|
||||
armor = list("melee" = 95, "bullet" = 90, "laser" = 70, "energy" = 80, "bomb" = 70, "bio" = 100, "rad" = 40, "fire" = 100, "acid" = 100)
|
||||
strip_delay = 300
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
|
||||
@@ -5,5 +5,20 @@
|
||||
item_state = "kaminacape"
|
||||
body_parts_covered = 0
|
||||
icon = 'hyperstation/icons/obj/clothing/suits.dmi'
|
||||
alternate_worn_icon = 'hyperstation/icons/mob/suit.dmi'
|
||||
alternate_worn_icon = 'hyperstation/icons/mobs/suits.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/suit/gcvest
|
||||
name = "\improper Guncaster's Vest"
|
||||
desc = "An open leather vest with battlescarred metal shoulderpads, perfect for hunting interdimensional wazards. Smells of gunpowder and plasma."
|
||||
icon_state = "guncaster"
|
||||
item_state = "guncaster"
|
||||
icon = 'hyperstation/icons/obj/clothing/suits.dmi'
|
||||
alternate_worn_icon = 'hyperstation/icons/mobs/suits.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/suit/gcvest/alt
|
||||
name = "\improper Hellraider's Vest"
|
||||
desc = "An open leather vest with battlescarred metal shoulderpads, discovered in a dimensional anomaly. Smells of gunpowder and plasma."
|
||||
icon_state = "guncaster_alt"
|
||||
item_state = "guncaster_alt"
|
||||
@@ -0,0 +1,9 @@
|
||||
/obj/item/clothing/under/lumberjack
|
||||
name = "lumberjack outfit"
|
||||
desc = "I am a lumberjack and I am ok, I sleep all night and I work all day."
|
||||
icon = 'hyperstation/icons/obj/clothing/suits.dmi'
|
||||
alternate_worn_icon = 'hyperstation/icons/mobs/suits.dmi'
|
||||
icon_state = "lumberjack"
|
||||
item_state = "lumberjack"
|
||||
can_adjust = FALSE
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
@@ -9,3 +9,38 @@
|
||||
name = "Penis Milking Machine"
|
||||
reqs = list(/obj/item/stack/cable_coil = 5, /obj/item/stack/rods = 1, /obj/item/stack/sheet/cardboard = 1, /obj/item/reagent_containers/glass/beaker/large = 1, /obj/item/stock_parts/manipulator = 1)
|
||||
result = /obj/item/milking_machine/penis
|
||||
|
||||
//to do: put carpentry in it's own crafting tab
|
||||
/datum/crafting_recipe/weak_metal
|
||||
name = "Heated Metal"
|
||||
reqs = list(/obj/item/stack/sheet/metal = 5)
|
||||
tools = list(TOOL_WELDER)
|
||||
category = CAT_MISC
|
||||
result = /obj/item/processed/metal
|
||||
|
||||
/datum/crafting_recipe/processed_wood
|
||||
name = "Processable Wood"
|
||||
reqs = list(/obj/item/stack/sheet/mineral/wood = 5)
|
||||
tools = list(TOOL_WIRECUTTER, TOOL_WELDER)
|
||||
category = CAT_MISC
|
||||
result = /obj/item/processed/wood/plank
|
||||
|
||||
/datum/crafting_recipe/stool_base
|
||||
name = "Stool Base"
|
||||
reqs = list(/obj/item/processed/wood/seat = 1, /obj/item/processed/wood/gluepeg = 4)
|
||||
category = CAT_MISC
|
||||
result = /obj/item/processed/wood/stool1
|
||||
|
||||
/datum/crafting_recipe/clothcushion
|
||||
name = "Cloth Cushion"
|
||||
reqs = list(/obj/item/stack/sheet/cloth = 2, /obj/item/stack/sheet/cotton = 5)
|
||||
tools = list(TOOL_WIRECUTTER)
|
||||
category = CAT_MISC
|
||||
result = /obj/item/cushion
|
||||
|
||||
/datum/crafting_recipe/silkcushion
|
||||
name = "Silk Cushion"
|
||||
reqs = list(/obj/item/stack/sheet/silk = 2, /obj/item/stack/sheet/cotton = 5)
|
||||
tools = list(TOOL_WIRECUTTER)
|
||||
category = CAT_MISC
|
||||
result = /obj/item/cushion/silk
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
#define DUMPTIME 3000
|
||||
|
||||
/datum/bank_account
|
||||
var/account_holder = "Some pleb"
|
||||
var/account_balance = 0
|
||||
var/account_offstation_balance = 0
|
||||
var/account_pin = 0
|
||||
var/account_dna = ""
|
||||
var/datum/job/account_job
|
||||
var/list/bank_cards = list()
|
||||
var/add_to_accounts = TRUE
|
||||
var/transferable = TRUE
|
||||
var/account_id
|
||||
var/withdrawDelay = 0
|
||||
|
||||
/datum/bank_account/New(newname, job)
|
||||
if(add_to_accounts)
|
||||
if(!SSeconomy)
|
||||
log_world("Wack")
|
||||
SSeconomy.bank_accounts += src
|
||||
account_holder = newname
|
||||
account_job = job
|
||||
account_id = rand(111111,999999)
|
||||
|
||||
/datum/bank_account/Destroy()
|
||||
if(add_to_accounts)
|
||||
SSeconomy.bank_accounts -= src
|
||||
return ..()
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
/obj/item/pen/attack(mob/living/M, mob/user,stealth)
|
||||
if(!istype(M))
|
||||
return
|
||||
|
||||
if(!force)
|
||||
if(M.can_inject(user, 1))
|
||||
if(user.a_intent == "harm") //old poke requires harm intent.
|
||||
to_chat(user, "<span class='warning'>You stab [M] with the pen.</span>")
|
||||
if(!stealth)
|
||||
to_chat(M, "<span class='danger'>You feel a tiny prick!</span>")
|
||||
. = 1
|
||||
|
||||
else //writing time
|
||||
var/mob/living/carbon/human/T = M
|
||||
if(!T) //not human.
|
||||
return
|
||||
if(!T.is_chest_exposed())
|
||||
to_chat(user, "<span class='warning'>You cannot write on someone with their clothes on.</span>")
|
||||
return
|
||||
|
||||
var/writting = input(user, "Add writing, doesn't replace current text", "Writing on [T]") as text|null
|
||||
if(!writting)
|
||||
return
|
||||
|
||||
var/obj/item/bodypart/BP = T.get_bodypart(user.zone_selected)
|
||||
|
||||
if(!(user==T))
|
||||
src.visible_message("<span class='notice'>[user] begins to write on [T]'s [BP.name].</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You begin to write on your [BP.name].</span>")
|
||||
|
||||
if(do_mob(user, T, 4 SECONDS))
|
||||
if((length(BP.writtentext))+(length(writting)) < 100) //100 character limmit to stop spamming.
|
||||
BP.writtentext += html_encode(writting) //you can add to text, not remove it.
|
||||
else
|
||||
to_chat(user, "<span class='notice'>There isnt enough space to write that on [T]'s [BP.name].</span>")
|
||||
return
|
||||
|
||||
if(!(user==T))
|
||||
to_chat(user, "<span class='notice'>You write on [T]'s [BP.name].</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You write on your [BP.name].</span>")
|
||||
else
|
||||
. = ..()
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
/datum/reagent/consumable/alienhoney //for players who want bee character bewbs that produce honey.
|
||||
name = "alien honey"
|
||||
description = "Sweet honey that came from a alien source. This honey doesn't possess the same healing or nutrition properties as earth-bound bee honey."
|
||||
color = "#d3a308"
|
||||
value = 3 //plentiful, so wouldnt be worth as much.
|
||||
nutriment_factor = 5 * REAGENTS_METABOLISM
|
||||
metabolization_rate = 1 * REAGENTS_METABOLISM
|
||||
taste_description = "sweetness"
|
||||
|
||||
/datum/reagent/consumable/alienhoney/on_mob_life(mob/living/carbon/M)
|
||||
..()
|
||||
@@ -0,0 +1,294 @@
|
||||
/*
|
||||
* If you ever decide to add more reactions, please remember to keep these
|
||||
* in alphabetical order, according to reagent names and not their datums.
|
||||
* It could be hard to find reactions when code diving.
|
||||
* Due note, unlike before this change, that subtypes will apply to the tray the same as their parents
|
||||
* -DT
|
||||
*/
|
||||
|
||||
#define DEFAULT_ACT_MUTAGEN switch(rand(100)){\
|
||||
if(91 to 100){\
|
||||
T.adjustHealth(-10);\
|
||||
to_chat(user, "<span class='warning'>The plant shrivels and burns.</span>");}\
|
||||
if(81 to 90)\
|
||||
T.mutatespecie();\
|
||||
if(66 to 80)\
|
||||
T.hardmutate();\
|
||||
if(41 to 65)\
|
||||
T.mutate();\
|
||||
if(21 to 41)\
|
||||
to_chat(user, "<span class='notice'>The plants don't seem to react...</span>");\
|
||||
if(11 to 20)\
|
||||
T.mutateweed();\
|
||||
if(1 to 10)\
|
||||
T.mutatepest(user);\
|
||||
else\
|
||||
to_chat(user, "<span class='notice'>Nothing happens...</span>");}
|
||||
|
||||
//Ammonia
|
||||
/datum/reagent/ammonia/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustHealth(round(volume * 0.5))
|
||||
T.adjustNutri(round(volume * 1))
|
||||
if(..())
|
||||
T.myseed.adjust_yield(round(volume * 0.01))
|
||||
return 1
|
||||
|
||||
//Ash
|
||||
/datum/reagent/ash/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
// Ash is used IRL in gardening, as a fertilizer enhancer and weed killer
|
||||
T.adjustHealth(round(volume * 0.25))
|
||||
T.adjustNutri(round(volume * 0.5))
|
||||
T.adjustWeeds(-round(volume / 10))
|
||||
return 1
|
||||
|
||||
//Beer
|
||||
/datum/reagent/consumable/ethanol/beer/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
// Beer is a chemical composition of alcohol and various other things. It's a shitty nutrient but hey, it's still one. Also alcohol is bad, mmmkay?
|
||||
T.adjustHealth(-round(volume * 0.05))
|
||||
T.adjustNutri(round(volume * 0.25))
|
||||
T.adjustWater(round(volume * 0.7))
|
||||
return 1
|
||||
|
||||
//Blood
|
||||
/datum/reagent/blood/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustNutri(round(volume * 0.6))
|
||||
T.adjustHealth(-round(volume))
|
||||
T.adjustPests(rand(2,4)) //they HUNGER
|
||||
return 1
|
||||
|
||||
//Charcoal
|
||||
/datum/reagent/medicine/charcoal/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustToxic(-round(volume * 2)) //Antitoxin binds shit pretty well. So the tox goes significantly down
|
||||
return 1
|
||||
|
||||
//Chlorine
|
||||
/datum/reagent/chlorine/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustHealth(-round(volume * 1))
|
||||
T.adjustToxic(round(volume * 1.5))
|
||||
T.adjustWater(-round(volume * 0.5))
|
||||
T.adjustWeeds(-rand(1,volume * 0.125))
|
||||
return 1
|
||||
|
||||
//Diethylamine
|
||||
/datum/reagent/diethylamine/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
//Corrosive to pests, but not to plants
|
||||
if(..())
|
||||
T.myseed.adjust_yield(round(volume * 0.02))
|
||||
T.adjustHealth(round(volume))
|
||||
T.adjustNutri(round(volume * 2))
|
||||
T.adjustPests(-rand(1,round(volume / 30)))
|
||||
return 1
|
||||
|
||||
//Earthsblood
|
||||
/datum/reagent/medicine/earthsblood/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.self_sufficiency_progress += volume
|
||||
if(T.self_sufficiency_progress >= T.self_sufficiency_req)
|
||||
T.become_self_sufficient()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[T] warms as it might on a spring day under a genuine Sun.</span>")
|
||||
return 1
|
||||
|
||||
//Enduro-Grow
|
||||
/datum/reagent/plantnutriment/endurogrow/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
if(!..())
|
||||
return -1
|
||||
T.myseed.adjust_potency(-round(volume / 10))
|
||||
T.myseed.adjust_yield(-round(volume / 30))
|
||||
T.myseed.adjust_endurance(round(volume / 30))
|
||||
return 1
|
||||
|
||||
//E-Z Nutrient
|
||||
/datum/reagent/plantnutriment/eznutriment/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.yieldmod = 1
|
||||
T.mutmod = 1
|
||||
return ..()
|
||||
|
||||
//Flourine
|
||||
/datum/reagent/fluorine/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
// Fluorine one of the most corrosive and deadly gasses
|
||||
T.adjustHealth(-round(volume * 2))
|
||||
T.adjustToxic(round(volume * 2.5))
|
||||
T.adjustWater(-round(volume * 0.5))
|
||||
T.adjustWeeds(-rand(1, volume * 0.25))
|
||||
return 1
|
||||
|
||||
//Fluorosulfuric acid
|
||||
/datum/reagent/toxin/acid/fluacid/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustHealth(-round(volume * 2))
|
||||
T.adjustToxic(round(volume * 3))
|
||||
T.adjustWeeds(-rand(1,volume * 0.5))
|
||||
return 1
|
||||
|
||||
//Holy Water
|
||||
/datum/reagent/water/holywater/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
//Mostly the same as water, it also heals the plant a little with the power of the spirits~
|
||||
T.adjustWater(round(volume))
|
||||
T.adjustHealth(round(volume * 0.1))
|
||||
return 1
|
||||
|
||||
//Left-4-Zed
|
||||
/datum/reagent/plantnutriment/left4zednutriment/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.yieldmod = 0
|
||||
T.mutmod = 2
|
||||
return ..()
|
||||
|
||||
//Liquid Earthquake
|
||||
/datum/reagent/plantnutriment/liquidearthquake/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
if(!..())
|
||||
return -1
|
||||
T.myseed.adjust_weed_chance(round(volume / 10))
|
||||
T.myseed.adjust_weed_rate(round(volume / 30))
|
||||
T.myseed.adjust_production(-round(volume / 30))
|
||||
return 1
|
||||
|
||||
//Milk
|
||||
/datum/reagent/consumable/milk/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustNutri(round(volume * 0.2))
|
||||
T.adjustWater(round(volume * 0.5))
|
||||
if(..()) // Milk is good for humans, but bad for plants. The sugars canot be used by plants, and the milk fat fucks up growth.
|
||||
if(!T.myseed.get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism)) //Not shrooms though
|
||||
T.adjustHealth(-round(volume / 2))
|
||||
return 1
|
||||
|
||||
//Napalm
|
||||
/datum/reagent/napalm/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
if(..())
|
||||
if(T.myseed.resistance_flags & FIRE_PROOF)
|
||||
return 1
|
||||
T.adjustHealth(-round(volume * 6))
|
||||
T.adjustToxic(round(volume * 7))
|
||||
T.adjustWeeds(-rand(5,9))
|
||||
return 1
|
||||
|
||||
//Nutriment
|
||||
/datum/reagent/consumable/nutriment/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
//Compost, effectively
|
||||
T.adjustHealth(round(volume * 0.5))
|
||||
T.adjustNutri(round(volume))
|
||||
return 1
|
||||
|
||||
//Pest Killer
|
||||
/datum/reagent/toxin/pestkiller/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustToxic(round(volume * 0.5))
|
||||
T.adjustPests(-rand(1,volume / 5))
|
||||
return 1
|
||||
|
||||
//Phosphorus
|
||||
/datum/reagent/phosphorus/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
// White Phosphorous + water -> phosphoric acid. That's not a good thing really.
|
||||
// Phosphoric salts are beneficial though. And even if the plant suffers, in the long run the tray gets some nutrients. The benefit isn't worth that much.
|
||||
T.adjustHealth(-round(volume * 0.75))
|
||||
T.adjustNutri(round(volume * 0.1))
|
||||
T.adjustWater(-round(volume * 0.5))
|
||||
T.adjustWeeds(-rand(1, volume * 0.1))
|
||||
return 1
|
||||
|
||||
//Plant-B-Gone
|
||||
/datum/reagent/toxin/plantbgone/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustHealth(-round(volume * 5))
|
||||
T.adjustToxic(round(volume * 6))
|
||||
T.adjustWeeds(-rand(4,8))
|
||||
return 1
|
||||
|
||||
//Plant Base
|
||||
//For subtypes of /datum/reagent/plantnutriment/
|
||||
/datum/reagent/plantnutriment/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustNutri(round(volume))
|
||||
return ..()
|
||||
|
||||
//Radium
|
||||
/datum/reagent/radium/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
if(volume >= 10)
|
||||
DEFAULT_ACT_MUTAGEN
|
||||
else if(volume >= 5)
|
||||
T.hardmutate()
|
||||
else if(volume >= 2)
|
||||
T.mutate()
|
||||
|
||||
T.adjustHealth(-round(volume))
|
||||
T.adjustToxic(round(volume * 3)) // Radium is harsher (OOC: also easier to produce)
|
||||
return 1
|
||||
|
||||
//Robust Harvest
|
||||
/datum/reagent/plantnutriment/robustharvestnutriment/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.yieldmod = 1.3
|
||||
T.mutmod = 0
|
||||
return ..()
|
||||
|
||||
//Saltpetre
|
||||
/datum/reagent/saltpetre/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
// Saltpetre is used for gardening IRL. To simplify highly, it speeds up growth and strengthens plants
|
||||
T.adjustHealth(round(volume * 0.25))
|
||||
if (..())
|
||||
T.myseed.adjust_production(-round(volume/100)-prob(volume%100))
|
||||
T.myseed.adjust_potency(round(volume*0.5))
|
||||
return 1
|
||||
|
||||
//Soda Water
|
||||
/datum/reagent/consumable/sodawater/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
// A variety of nutrients are dissolved in club soda, without sugar.
|
||||
// These nutrients include carbon, oxygen, hydrogen, phosphorous, potassium, sulfur and sodium, all of which are needed for healthy plant growth.
|
||||
T.adjustWater(round(volume) * 0.9)
|
||||
T.adjustHealth(round(volume * 0.1))
|
||||
T.adjustNutri(round(volume * 0.1))
|
||||
return 1
|
||||
|
||||
//Sugar
|
||||
/datum/reagent/consumable/sugar/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustWeeds(round(rand(1, volume / 5)))
|
||||
T.adjustPests(round(rand(1, volume / 5)))
|
||||
return 1
|
||||
|
||||
//Sulphuric Acid
|
||||
/datum/reagent/toxin/acid/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustHealth(-round(volume * 1))
|
||||
T.adjustToxic(round(volume * 1.5))
|
||||
T.adjustWeeds(-rand(1,volume * 0.25))
|
||||
return 1
|
||||
|
||||
//Toxin
|
||||
/datum/reagent/toxin/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustToxic(round(volume * 2))
|
||||
return 1
|
||||
|
||||
//Unstable Mutagen
|
||||
/datum/reagent/toxin/mutagen/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
if(volume >= 5)
|
||||
DEFAULT_ACT_MUTAGEN
|
||||
else if(volume >= 2)
|
||||
T.hardmutate()
|
||||
else if(volume >= 1)
|
||||
T.mutate()
|
||||
return 1
|
||||
|
||||
//Uranium
|
||||
/datum/reagent/uranium/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
if(volume >= 10)
|
||||
DEFAULT_ACT_MUTAGEN
|
||||
else if(volume >= 5)
|
||||
T.hardmutate()
|
||||
else if(volume >= 2)
|
||||
T.mutate()
|
||||
|
||||
T.adjustHealth(-round(volume))
|
||||
T.adjustToxic(round(volume * 2))
|
||||
return 1
|
||||
|
||||
//Virus Food
|
||||
/datum/reagent/toxin/mutagen/mutagenvirusfood/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustNutri(round(volume * 0.5))
|
||||
T.adjustHealth(-round(volume * 0.5))
|
||||
return 1
|
||||
|
||||
//Water
|
||||
/datum/reagent/water/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustWater(round(volume))
|
||||
return 1
|
||||
|
||||
//Weed Killer
|
||||
/datum/reagent/toxin/plantbgone/weedkiller/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustToxic(round(volume / 2))
|
||||
T.adjustWeeds(-rand(1,volume / 5))
|
||||
return 1
|
||||
|
||||
#undef DEFAULT_ACT_MUTAGEN
|
||||
@@ -0,0 +1,34 @@
|
||||
//This action is technically a duplicate of /action/small_sprite
|
||||
//However, we do our own things...
|
||||
|
||||
/datum/action/sizecode_resize
|
||||
name = "Toggle Giant Sprite"
|
||||
desc = "Others will continue to see you giant."
|
||||
icon_icon = 'icons/mob/screen_gen_old.dmi'
|
||||
button_icon_state = "health1" //You can change this if you want
|
||||
background_icon_state = "bg_alien" //But keep this as a distinct background
|
||||
var/small = FALSE
|
||||
var/image/small_icon
|
||||
|
||||
/datum/action/sizecode_resize/Grant(mob/M, safety=FALSE)
|
||||
if(ishuman(M) && !safety) //this probably gets called before a person gets overlays on roundstart, so try again
|
||||
if(!LAZYLEN(M.overlays))
|
||||
addtimer(CALLBACK(src, .proc/Grant, M, TRUE), 5) //https://www.youtube.com/watch?v=QQ-aYZzlDeo
|
||||
return
|
||||
|
||||
..()
|
||||
if(!owner)
|
||||
return
|
||||
var/image/I = image(icon=owner.icon,icon_state=owner.icon_state,loc=owner,layer=owner.layer,pixel_x=owner.pixel_x,pixel_y=owner.pixel_y)
|
||||
I.overlays += owner.overlays
|
||||
I.override = TRUE
|
||||
small_icon = I
|
||||
|
||||
/datum/action/sizecode_resize/Trigger()
|
||||
..()
|
||||
if(!small)
|
||||
owner.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic, "sizecode_smallsprite", small_icon)
|
||||
else
|
||||
owner.remove_alt_appearance("sizecode_smallsprite")
|
||||
small = !small
|
||||
return TRUE
|
||||
@@ -13,6 +13,8 @@ var/const/RESIZE_MICRO = 0.25
|
||||
var/size_multiplier = 1 //multiplier for the mob's icon size atm
|
||||
var/previous_size = 1
|
||||
|
||||
//Cyanosis - Action that resizes the sprite for the client but nobody else. Say goodbye to attacking yourself when someone's above you lmao
|
||||
var/datum/action/sizecode_resize/small_sprite
|
||||
|
||||
#define MOVESPEED_ID_SIZE "SIZECODE"
|
||||
#define MOVESPEED_ID_STOMP "STEPPY"
|
||||
@@ -44,7 +46,7 @@ mob/living/get_effective_size()
|
||||
if(size_multiplier == previous_size)
|
||||
return 1
|
||||
src.update_transform() //WORK DAMN YOU
|
||||
src.update_mobsize()
|
||||
src.update_mobsize()
|
||||
//Going to change the health and speed values too
|
||||
src.remove_movespeed_modifier(MOVESPEED_ID_SIZE)
|
||||
src.add_movespeed_modifier(MOVESPEED_ID_SIZE, multiplicative_slowdown = (abs(size_multiplier - 1) * 0.8 ))
|
||||
@@ -60,6 +62,13 @@ mob/living/get_effective_size()
|
||||
//if(src.size_multiplier >= RESIZE_A_HUGEBIG || src.size_multiplier <= RESIZE_A_TINYMICRO) Will remove clothing when too big or small. Will do later.
|
||||
previous_size = size_multiplier //And, change this now that we are finally done.
|
||||
|
||||
//Now check if the mob can get the size action
|
||||
if(!small_sprite)
|
||||
small_sprite = new(src)
|
||||
small_sprite.Remove(src)
|
||||
if(size_multiplier >= 1.25) //Anything bigger will start to block things
|
||||
small_sprite.Grant(src)
|
||||
|
||||
//handle the big steppy, except nice
|
||||
/mob/living/proc/handle_micro_bump_helping(var/mob/living/tmob)
|
||||
if(ishuman(src))
|
||||
@@ -67,7 +76,7 @@ mob/living/get_effective_size()
|
||||
|
||||
if(tmob.pulledby == H)
|
||||
return 0
|
||||
|
||||
|
||||
//Micro is on a table.
|
||||
var/turf/steppyspot = tmob.loc
|
||||
for(var/thing in steppyspot.contents)
|
||||
@@ -91,6 +100,7 @@ mob/living/get_effective_size()
|
||||
tmob.visible_message("<span class='notice'>[src] carefully slithers around [tmob].</span>", "<span class='notice'>[src]'s huge tail slithers besides you.</span>")
|
||||
else
|
||||
tmob.visible_message("<span class='notice'>[src] carefully steps over [tmob].</span>", "<span class='notice'>[src] steps over you carefully.</span>")
|
||||
|
||||
return 1
|
||||
|
||||
//Smaller person stepping under a larger person
|
||||
@@ -133,7 +143,20 @@ mob/living/get_effective_size()
|
||||
tmob.visible_message("<span class='danger'>[src] carefully rolls their tail over [tmob]!</span>", "<span class='danger'>[src]'s huge tail rolls over you!</span>")
|
||||
else
|
||||
tmob.visible_message("<span class='danger'>[src] carefully steps on [tmob]!</span>", "<span class='danger'>[src] steps onto you with force!</span>")
|
||||
return 1
|
||||
|
||||
//horny traits
|
||||
|
||||
if(HAS_TRAIT(src, TRAIT_MICROPHILE))
|
||||
src.adjustArousalLoss(8)
|
||||
if (src.getArousalLoss() >= 100 && ishuman(tmob) && tmob.has_dna())
|
||||
src.mob_climax(forced_climax=TRUE)
|
||||
|
||||
if(HAS_TRAIT(tmob, TRAIT_MACROPHILE))
|
||||
tmob.adjustArousalLoss(10)
|
||||
if (tmob.getArousalLoss() >= 100 && ishuman(tmob) && tmob.has_dna())
|
||||
tmob.mob_climax(forced_climax=TRUE)
|
||||
|
||||
return 1
|
||||
|
||||
if(H.a_intent == "harm" && H.canmove && !H.buckled)
|
||||
now_pushing = 0
|
||||
@@ -149,6 +172,19 @@ mob/living/get_effective_size()
|
||||
tmob.visible_message("<span class='danger'>[src] mows down [tmob] under their tail!</span>", "<span class='userdanger'>[src] plows their tail over you mercilessly!</span>")
|
||||
else
|
||||
tmob.visible_message("<span class='danger'>[src] slams their foot down on [tmob], crushing them!</span>", "<span class='userdanger'>[src] crushes you under their foot!</span>")
|
||||
|
||||
//horny traits
|
||||
|
||||
if(HAS_TRAIT(src, TRAIT_MICROPHILE))
|
||||
src.adjustArousalLoss((get_effective_size()/tmob.get_effective_size()*3))
|
||||
if (src.getArousalLoss() >= 100 && ishuman(tmob) && tmob.has_dna())
|
||||
src.mob_climax(forced_climax=TRUE)
|
||||
|
||||
if(HAS_TRAIT(tmob, TRAIT_MACROPHILE))
|
||||
tmob.adjustArousalLoss((get_effective_size()/tmob.get_effective_size()*3))
|
||||
if (tmob.getArousalLoss() >= 100 && ishuman(tmob) && tmob.has_dna())
|
||||
tmob.mob_climax(forced_climax=TRUE)
|
||||
|
||||
return 1
|
||||
|
||||
if(H.a_intent == "grab" && H.canmove && !H.buckled)
|
||||
@@ -215,7 +251,7 @@ mob/living/get_effective_size()
|
||||
mob_size = 2 //the default human size
|
||||
if(size_multiplier > 1)
|
||||
mob_size = 3
|
||||
|
||||
|
||||
//Proc for instantly grabbing valid size difference. Code optimizations soon(TM)
|
||||
/*
|
||||
/mob/living/proc/sizeinteractioncheck(var/mob/living/tmob)
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
//Sizechem reaction
|
||||
/datum/chemical_reaction/sizechem
|
||||
name = "Cell-Volume Altering Base"
|
||||
id = "sizechem"
|
||||
id = /datum/reagent/sizechem
|
||||
mix_message = "the reaction rapidly alters in size!"
|
||||
required_reagents = list(/datum/reagent/growthserum = 0.15, /datum/reagent/medicine/clonexadone = 0.15, /datum/reagent/gold = 0.15, /datum/reagent/acetone = 0.15)
|
||||
results = list(/datum/reagent/sizechem = 0.3)
|
||||
@@ -48,7 +48,7 @@
|
||||
//Growthchem reaction
|
||||
/datum/chemical_reaction/growthchem
|
||||
name = "Prospacillin"
|
||||
id = "growthchem"
|
||||
id = /datum/reagent/growthchem
|
||||
mix_message = "the reaction appears to grow!"
|
||||
required_reagents = list(/datum/reagent/sizechem = 0.15, /datum/reagent/consumable/condensedcapsaicin = 0.15, /datum/reagent/drug/aphrodisiac = 0.30)
|
||||
results = list(/datum/reagent/growthchem = 0.25)
|
||||
@@ -97,9 +97,9 @@
|
||||
//Shrinchem reaction
|
||||
/datum/chemical_reaction/shrinkchem
|
||||
name = "Diminicillin"
|
||||
id = "shrinkchem"
|
||||
id = /datum/reagent/shrinkchem
|
||||
mix_message = "the reaction appears to shrink!"
|
||||
required_reagents = list(/datum/reagent/sizechem = 0.15, /datum/reagent/consumable/frostoil = 0.15, /datum/reagent/drug = 0.30)
|
||||
required_reagents = list(/datum/reagent/sizechem = 0.15, /datum/reagent/consumable/frostoil = 0.15, /datum/reagent/drug/aphrodisiac = 0.30)
|
||||
results = list(/datum/reagent/shrinkchem = 0.25)
|
||||
required_temp = 1
|
||||
OptimalTempMin = 100 // Lower area of bell curve for determining heat based rate reactions
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
/obj/item/organ/cyberimp/arm/mblade
|
||||
name = "arm-mounted scytheblade"
|
||||
desc = "An extremely dangerous implant which can be used in a variety of ways. Mostly killing."
|
||||
contents = newlist(/obj/item/melee/mblade)
|
||||
|
||||
/obj/item/organ/cyberimp/arm/mblade/l
|
||||
zone = BODY_ZONE_L_ARM
|
||||
|
||||
/obj/item/melee/mblade
|
||||
name = "mounted scytheblade"
|
||||
desc = "An extremely dangerous implant which can be used in a variety of ways. Mostly killing."
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "mblade"
|
||||
item_state = "mblade"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
|
||||
force = 45
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
throwforce = 45
|
||||
block_chance = 70
|
||||
armour_penetration = 80
|
||||
flags_1 = CONDUCT_1
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
sharpness = IS_SHARP_ACCURATE
|
||||
attack_verb = list("slashed", "cut")
|
||||
@@ -5,6 +5,7 @@
|
||||
name = "Extra productive genitals"
|
||||
desc = "Your lower bits produce more and hold more than normal."
|
||||
value = 0
|
||||
category = CATEGORY_SEXUAL
|
||||
mob_trait = TRAIT_CUM_PLUS
|
||||
gain_text = "<span class='notice'>You feel pressure in your groin.</span>"
|
||||
lose_text = "<span class='notice'>You feel a weight lifted from your groin.</span>"
|
||||
|
||||
Reference in New Issue
Block a user