Update with master

This commit is contained in:
Archie
2021-05-04 03:28:10 -03:00
1103 changed files with 123721 additions and 20971 deletions
+6
View File
@@ -0,0 +1,6 @@
#define STARTING_PAYCHECK 50
//ID bank account support defines.
#define ID_NO_BANK_ACCOUNT 0
#define ID_FREE_BANK_ACCOUNT 1
#define ID_LOCKED_BANK_ACCOUNT 2
+1
View File
@@ -0,0 +1 @@
GLOBAL_LIST_EMPTY(wendigo_soul_storages)
@@ -0,0 +1,10 @@
SUBSYSTEM_DEF(economy)
name = "Economy"
wait = 5 MINUTES
init_order = INIT_ORDER_ECONOMY
runlevels = RUNLEVEL_GAME
flags = SS_NO_FIRE //Let's not forget this. This subsystem does not use fire and was needlessly using CPU.
var/roundstart_paychecks = 5
var/budget_pool = 35000
var/list/generated_accounts = list()
var/list/bank_accounts = list() //List of normal accounts (not department accounts)
@@ -11,4 +11,9 @@
/datum/mood_event/kiss
description = "<span class='nicegreen'>Someone kissed me, I feel happy!</span>\n"
mood_change = 2
timeout = 3 MINUTES
timeout = 3 MINUTES
/datum/mood_event/deathsaw
description = "<span class='boldwarning'>I saw someone die!</span>\n"
mood_change = -8
timeout = 20 MINUTES //takes a long time to get over
+4
View File
@@ -2,6 +2,7 @@
name = "Nar-Sian speaker"
desc = "Obsessed with forbidden knowledge regarding the blood cult, you've learned how to speak their ancient language."
value = 1
category = CATEGORY_LANGUAGES
gain_text = "<span class='notice'>Your mind feels sensitive to the slurred, ancient language of Nar'Sian cultists.</span>"
lose_text = "<span class='notice'>You forget how to speak Nar'Sian!</span>"
@@ -17,6 +18,7 @@
name = "Ratvarian speaker"
desc = "Obsessed with the inner workings of the clock cult, you've learned how to speak their language."
value = 1
category = CATEGORY_LANGUAGES
gain_text = "<span class='notice'>Your mind feels sensitive to the ancient language of Ratvarian cultists.</span>"
lose_text = "<span class='notice'>You forget how to speak Ratvarian!</span>"
@@ -32,6 +34,7 @@
name = "Encoded Audio speaker"
desc = "You've been augmented with language encoders, allowing you to understand encoded audio."
value = 1
category = CATEGORY_LANGUAGES
gain_text = "<span class='notice'>Your mouth feels a little weird for a moment as your language encoder kicks in.</span>"
lose_text = "<span class='notice'>You feel your encoded audio chip malfunction. You can no longer speak or understand the language of fax machines.</span>"
@@ -47,6 +50,7 @@
name = "Xenocommon speaker"
desc = "Through time observing and interacting with xenos and xeno hybrids, you've learned the intricate hissing patterns of their language."
value = 1
category = CATEGORY_LANGUAGES
gain_text = "<span class='notice'>You feel that you are now able to hiss in the same way xenomorphs do.</span>"
lose_text = "<span class='notice'>You seem to no longer know how to speak xenocommon.</span>"
@@ -3,6 +3,7 @@
name = "Alcoholic Lightweight"
desc = "Alcohol really goes straight to your head, gotta be careful with what you drink."
value = 0
category = CATEGORY_ALCOHOL
mob_trait = TRAIT_ALCOHOL_LIGHTWEIGHT
gain_text = "<span class='notice'>You feel woozy thinking of alcohol.</span>"
lose_text = "<span class='notice'>You regain your stomach for drinks.</span>"
@@ -12,6 +13,7 @@
name = "Cursed Blood"
desc = "Your lineage is cursed with the paleblood curse. Best to stay away from holy water... Hell water, on the other hand..."
value = 0
category = CATEGORY_GAMEPLAY
mob_trait = TRAIT_CURSED_BLOOD
gain_text = "<span class='notice'>A curse from a land where men return as beasts runs deep in your blood. Best to stay away from holy water... Hell water, on the other hand...</span>"
lose_text = "<span class='notice'>You feel the weight of the curse in your blood finally gone.</span>"
@@ -22,6 +24,7 @@
name = "Estrus Detection"
desc = "You have a animalistic sense of detecting if someone is in heat, and can get pregnant."
value = 0
category = CATEGORY_SEXUAL
mob_trait = TRAIT_HEAT_DETECT
gain_text = "<span class='notice'>You feel your senses adjust, allowing a animalistic sense of others' fertility.</span>"
lose_text = "<span class='notice'>You feel your sense of others' fertility fade.</span>"
@@ -31,6 +34,58 @@
name = "In Heat"
desc = "Your system burns with the desire to be bred, your body will betray you and alert others' to your desire when examining you. Satisfying your lust will make you happy, but ignoring it may cause you to become sad and needy."
value = 0
category = CATEGORY_SEXUAL
mob_trait = TRAIT_HEAT
gain_text = "<span class='notice'>You body burns with the desire to be bred.</span>"
lose_text = "<span class='notice'>You feel more in control of your body and thoughts.</span>"
/datum/quirk/overweight
name = "Overweight"
desc = "You're particularly fond of food, and join the round being overweight."
value = 0
category = CATEGORY_FOOD
gain_text = "<span class='notice'>You feel a bit chubby!</span>"
//no lose_text cause why would there be?
/datum/quirk/overweight/on_spawn()
var/mob/living/M = quirk_holder
M.nutrition = rand(NUTRITION_LEVEL_FAT + NUTRITION_LEVEL_START_MIN, NUTRITION_LEVEL_FAT + NUTRITION_LEVEL_START_MAX)
M.overeatduration = 100
ADD_TRAIT(M, TRAIT_FAT, OBESITY)
/datum/quirk/virile
name = "Virile"
desc = "Either through higher quality sperms, more of them, or just being more horny, your impregnation chance will increase by 20-30%."
value = 0
category = CATEGORY_SEXUAL
medical_record_text = "Patient has a higher sperm count."
mob_trait = TRAIT_VIRILE
gain_text = "<span class='notice'>You feel more potent."
lose_text = "<span class='notice'>You feel less potent."
var/ichange = 0
/datum/quirk/virile/add()
ichange = rand(20,30)
quirk_holder.impregchance += ichange
/datum/quirk/virile/remove()
if(quirk_holder)
quirk_holder.impregchance -= ichange
/datum/quirk/macrophile
name = "Macrophile"
desc = "You are attracted to larger people, and being stepped on by them."
value = 0
category = CATEGORY_SEXUAL
mob_trait = TRAIT_MACROPHILE
gain_text = "<span class='notice'>You feel attracted to people larger than you."
lose_text = "<span class='notice'>You feel less attracted to people larger than you."
/datum/quirk/microphile
name = "Microphile"
desc = "You are attracted to smaller people, and stepping on them."
value = 0
category = CATEGORY_SEXUAL
mob_trait = TRAIT_MICROPHILE
gain_text = "<span class='notice'>You feel attracted to people smaller than you."
lose_text = "<span class='notice'>You feel less attracted to people smaller than you."
@@ -0,0 +1,77 @@
//hyperstation 13 nail polish
/obj/item/nailpolish
name = "nail polish"
desc = "Paint with a fine brush to do your nails, or someone elses."
icon = 'hyperstation/icons/obj/cosmetic.dmi'
icon_state = "nailcap"
item_state = "nailpolish"
w_class = WEIGHT_CLASS_SMALL
var/paint = "black"
price = 5
var/mutable_appearance/bottle //show the colour on the bottle.
/obj/item/nailpolish/red
name = "red nail polish"
paint = "red"
/obj/item/nailpolish/blue
name = "blue nail polish"
paint = "blue"
/obj/item/nailpolish/aqua
name = "cyan nail polish"
paint = "aqua"
/obj/item/nailpolish/black
name = "black nail polish"
paint = "black"
/obj/item/nailpolish/white
name = "white nail polish"
paint = "white"
/obj/item/nailpolish/navy
name = "navy nail polish"
paint = "navy"
/obj/item/nailpolish/yellow
name = "yellow nail polish"
paint = "yellow"
/obj/item/nailpolish/purple
name = "purple nail polish"
paint = "purple"
/obj/item/nailpolish/Initialize()
. = ..()
bottle = mutable_appearance('hyperstation/icons/obj/cosmetic.dmi', "nailpolish")
bottle.color = paint
add_overlay(bottle)
/obj/item/nailpolish/attack(mob/M, mob/user)
if(!ismob(M))
return
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.nail_style) //to stop stacking bugs
to_chat(user, "<span class='warning'>Remove the old nail polish first!</span>")
if(H == user)
user.visible_message("<span class='notice'>[user] does [user.p_their()] nails with \the [src].</span>", \
"<span class='notice'>You take a moment to apply \the [src]. Perfect!</span>")
H.nail_style = "nails"
H.nail_color = paint
H.update_body()
else
user.visible_message("<span class='warning'>[user] begins to do [H]'s nails with \the [src].</span>", \
"<span class='notice'>You begin to apply \the [src] on [H]'s nails...</span>")
if(do_after(user, 20, target = H))
user.visible_message("[user] does [H]'s nails with \the [src].", \
"<span class='notice'>You apply \the [src] on [H]'s nails.</span>")
H.nail_style = "nails"
H.nail_color = paint
H.update_body()
else
to_chat(user, "<span class='warning'>Where are the nail on that?</span>")
+121
View File
@@ -0,0 +1,121 @@
//ported from virgo
/obj/structure/railing
name = "railing"
desc = "A railing to stop people from falling"
icon = 'hyperstation/icons/obj/railings.dmi'
var/icon_modifier = "grey_"
icon_state = "grey_railing0"
density = FALSE
layer = 4
anchored = TRUE
flags_1 = ON_BORDER_1
max_integrity = 250
var/heat_resistance = 800
resistance_flags = ACID_PROOF
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100)
CanAtmosPass = ATMOS_PASS_PROC
var/real_explosion_block //ignore this, just use explosion_block
var/breaksound = "shatter"
var/hitsound = 'sound/effects/Glasshit.ogg'
rad_insulation = RAD_VERY_LIGHT_INSULATION
rad_flags = RAD_PROTECT_CONTENTS
var/check = 0
var/static/list/freepass = typecacheof(list(
/obj/singularity,
/obj/effect/projectile,
/obj/effect/portal,
/obj/effect/abstract,
/obj/effect/hotspot,
/obj/effect/landmark,
/obj/effect/temp_visual,
/obj/effect/light_emitter/tendril,
/obj/effect/collapse,
/obj/effect/particle_effect/ion_trails,
/obj/effect/dummy/phased_mob,
/obj/effect/immovablerod
)) //Gotta make sure certain things can phase through it otherwise the railings also block them.
/obj/structure/railing/CanPass(atom/movable/mover, turf/target)
if(istype(mover) && (mover.pass_flags & PASSGLASS) || is_type_in_typecache(mover, freepass))
return 1
if(get_dir(loc, target) == dir)
return 0
return 1
/obj/structure/railing/CheckExit(atom/movable/O, turf/target)
if(istype(O) && (O.pass_flags & PASSGLASS) || is_type_in_typecache(O, freepass))
return 1
if(get_dir(O.loc, target) == dir)
return 0
return 1
/obj/structure/railing/Initialize()
. = ..()
if(src.anchored)
update_icon(0)
/obj/structure/railing/proc/NeighborsCheck(var/UpdateNeighbors = 1)
check = 0
//if (!anchored) return
var/Rturn = turn(src.dir, -90)
var/Lturn = turn(src.dir, 90)
for(var/obj/structure/railing/R in src.loc)
if ((R.dir == Lturn) && R.anchored)
check |= 32
if (UpdateNeighbors)
R.update_icon(0)
if ((R.dir == Rturn) && R.anchored)
check |= 2
if (UpdateNeighbors)
R.update_icon(0)
for (var/obj/structure/railing/R in get_step(src, Lturn))
if ((R.dir == src.dir) && R.anchored)
check |= 16
if (UpdateNeighbors)
R.update_icon(0)
for (var/obj/structure/railing/R in get_step(src, Rturn))
if ((R.dir == src.dir) && R.anchored)
check |= 1
if (UpdateNeighbors)
R.update_icon(0)
for (var/obj/structure/railing/R in get_step(src, (Lturn + src.dir)))
if ((R.dir == Rturn) && R.anchored)
check |= 64
if (UpdateNeighbors)
R.update_icon(0)
for (var/obj/structure/railing/R in get_step(src, (Rturn + src.dir)))
if ((R.dir == Lturn) && R.anchored)
check |= 4
if (UpdateNeighbors)
R.update_icon(0)
/obj/structure/railing/update_icon(var/UpdateNeighgors = 1)
NeighborsCheck(UpdateNeighgors)
overlays.Cut()
if (!check || !anchored)//|| !anchored
icon_state = "[icon_modifier]railing0"
else
icon_state = "[icon_modifier]railing1"
if (check & 32)
overlays += image ('hyperstation/icons/obj/railings.dmi', src, "[icon_modifier]corneroverlay")
if ((check & 16) || !(check & 32) || (check & 64))
overlays += image ('hyperstation/icons/obj/railings.dmi', src, "[icon_modifier]frontoverlay_l")
if (!(check & 2) || (check & 1) || (check & 4))
overlays += image ('hyperstation/icons/obj/railings.dmi', src, "[icon_modifier]frontoverlay_r")
if(check & 4)
switch (src.dir)
if (NORTH)
overlays += image ('hyperstation/icons/obj/railings.dmi', src, "[icon_modifier]mcorneroverlay", pixel_x = 32)
if (SOUTH)
overlays += image ('hyperstation/icons/obj/railings.dmi', src, "[icon_modifier]mcorneroverlay", pixel_x = -32)
if (EAST)
overlays += image ('hyperstation/icons/obj/railings.dmi', src, "[icon_modifier]mcorneroverlay", pixel_y = -32)
if (WEST)
overlays += image ('hyperstation/icons/obj/railings.dmi', src, "[icon_modifier]mcorneroverlay", pixel_y = 32)
@@ -10,7 +10,8 @@
death = FALSE
random = TRUE
mob_species = /datum/species/human
flavour_text = "<span class='big bold'>You and another have been stranded in this planet for quite some time now.</span><b> Each day you barely scrape by, and between the terrible \
short_desc = "You are lost."
flavour_text = "You and another have been stranded in this planet for quite some time now. Each day you barely scrape by, and between the terrible \
conditions of your makeshift shelter, the hostile creatures, and the ash drakes swooping down from the cloudless skies, all you can wish for is the feel of soft grass between your toes and \
the fresh air of Earth. These thoughts are dispelled by yet another recollection of how you and your friend got here... "
assignedrole = "Hermit"
@@ -58,6 +59,7 @@
death = FALSE
random = TRUE
mob_species = /datum/species/human
short_desc = "You've been left behind."
flavour_text = "As the last escape shuttle left the sector, you were left for dead, stranded in a cold hell where you make do, until hopefully someone finds you. \
Every day, you pause and recollect your memories from before it all happened... "
assignedrole = "Arctic Exile"
+16
View File
@@ -0,0 +1,16 @@
//not the most effient bot in the world, but it does its job.
/client/proc/discordmessage(input as message)
set category = "Special Verbs"
set name = "Hyperbot Message"
set desc = "Makes the local bot say something in general chat on discord."
if(input)
world.hypermessage(input)
message_admins("[key_name_admin(usr)] has made the Hyperbot post '[input]' in General.")
/world/proc/hypermessage(message)
fdel("Hyperbot/message.txt") //cleaning up old message
if(message)
var botmsg = "![message]"
text2file(botmsg,"Hyperbot/message.txt") //the bot on local reads a new text file and sends it to the discord.
+1 -1
View File
@@ -30,7 +30,7 @@
ventcrawler = 1
death_sound = 'sound/voice/ed209_20sec.ogg'
deathmessage = "lets out scream and its tentacles shrivel away..."
move_to_delay = 2
move_to_delay = 4
loot = list(/obj/effect/gibspawner/human)
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+56
View File
@@ -0,0 +1,56 @@
/mob/living/dancercaptain
name = "Captain Beats"
desc = "A captain cursed to dance for all eternity!"
icon = 'hyperstation/icons/mobs/dancer/captain.dmi'
icon_state = "idle"
var/danceaction = 1
var/lastaction = 0 //when the last action was!
var/actiontime = 4
var/list/dancefloor_turfs
var/list/dancefloor_turfs_types
var/dancefloor_exists = FALSE
/mob/living/dancercaptain/Move(atom/newloc, direct)
if(!danceaction)
if(!(world.time > lastaction))
return // no move for you!
animate(src, pixel_x, pixel_y = pixel_y + 10, time = 0.7, 0)
. = ..()
danceaction = 0 //you did your move
lastaction = world.time+actiontime //next action time
sleep(1)
animate(src, pixel_x, pixel_y = pixel_y - 10, time = 0.7, 0)
sleep(1)
LAZYINITLIST(dancefloor_turfs)
LAZYINITLIST(dancefloor_turfs_types)
if(dancefloor_exists) //remove the old one!
dancefloor_exists = FALSE
for(var/i in 1 to dancefloor_turfs.len)
var/turf/T = dancefloor_turfs[i]
T.ChangeTurf(dancefloor_turfs_types[i])
var/list/funky_turfs = RANGE_TURFS(2, src)
dancefloor_exists = TRUE
var/i = 1
dancefloor_turfs.len = funky_turfs.len
dancefloor_turfs_types.len = funky_turfs.len
for(var/t in funky_turfs)
if(!(istype(t, /turf/closed))) //dont change walls
var/turf/T = t
dancefloor_turfs[i] = T
dancefloor_turfs_types[i] = T.type
T.ChangeTurf((i % 2 == 0) ? /turf/open/floor/light/colour_cycle/dancefloor_a : /turf/open/floor/light/colour_cycle/dancefloor_b)
i++
/mob/living/dancercaptain/Initialize()
. = ..()
lastaction = round(world.time) //round to the nearest second! to keep in beat!
/mob/living/dancercaptain/proc/mtimer()
@@ -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
+90 -28
View File
@@ -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 ..()
+45
View File
@@ -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
+40 -4
View File
@@ -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")
+1
View File
@@ -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>"
+17
View File
@@ -0,0 +1,17 @@
/obj/item/ashtray
name = "ashtray"
icon = 'hyperstation/icons/obj/objects.dmi'
icon_state = "ashtray"
/obj/item/ashtray/attackby(obj/item/I, mob/user, params)
if (istype(I,/obj/item/clothing/mask/cigarette/))
var/obj/item/clothing/mask/cigarette/cig = I
if (cig.lit == 1)
src.visible_message("[user] crushes [cig] in \the [src], putting it out.")
else if (cig.lit == 0)
to_chat(user, "You place [cig] in [src].")
qdel(cig) //drop it in.
if (istype(I,/obj/item/cigbutt))
to_chat(user, "You place [I] in [src].")
qdel(I) //drop it in.
@@ -1,9 +1,10 @@
//Jay Sparrow
#define ROOMY = "ROOMY"
//Sorry jay, I killed it.
/obj/item/bluespace_thread
name = "Bluespace Sewing Kit"
desc = "Thread infused with bluespace dust to make your clothes a little more roomy."
desc = "Thread infused with bluespace dust to make your clothes a little more roomy. Current sewing technology already incorporates this, so thankfully, the days of needing these are long gone. Good souvenir though."
icon = 'hyperstation/icons/obj/bluespace_thread.dmi'
icon_state = "thread"
item_state = "thread"
@@ -32,4 +33,4 @@
time = 40
reqs = list(/obj/item/stack/ore/bluespace_crystal = 1,
/obj/item/stack/sheet/cloth = 3)
category = CAT_MISC
category = CAT_MISC
+1
View File
@@ -9,6 +9,7 @@
icon_state = "b_condom_wrapped"
var/unwrapped = 0
w_class = WEIGHT_CLASS_TINY
price = 1
obj/item/condom/Initialize()
create_reagents(300, DRAWABLE|NO_REACT)
+169
View File
@@ -0,0 +1,169 @@
//Hyper station economy. Because coding it yourself is easier than port sometimes.
/obj/machinery/atm
name = "automated teller machine"
desc = "a wall mounted electronic banking outlet for accessing your bank account."
icon = 'hyperstation/icons/obj/economy.dmi'
icon_state = "atm"
max_integrity = 250
integrity_failure = 100
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 30)
use_power = IDLE_POWER_USE
idle_power_usage = 0
active_power_usage = 0
power_channel = ENVIRON
resistance_flags = FIRE_PROOF
var/obj/item/card/held_card
var/user = ""
light_power = 0
light_range = 7
light_color = "#ff3232"
var/pin = 0
/obj/machinery/atm/ui_interact(mob/user)
. = ..()
var/dat = {""}
dat += "<p>"
dat += "<center><span class = 'big'><p>ATM</span></span></h1>"
dat += "<b><p>Welcome to Hyper Station 13's Automated Teller Service.</b>"
dat += "<p>"
if(!held_card)
dat += "<p>Welcome, please insert your ID to continue."
else
dat += "<p>Welcome user, <a href='byond://?src=[REF(src)];card=1'>[held_card ? user : "------"]</a><br><br>"
var/obj/item/card/id/idcard = held_card
if(idcard.registered_account)
dat += "<p>Account ID: <b>([idcard.registered_account.account_id])</b>"
else
dat += "<p>Error, this account number does not exsist, please contact your local administration.</b>"
if(idcard.registered_account)
if(!idcard.registered_account.account_pin || pin == idcard.registered_account.account_pin)
dat += "<p>Balance: <b>$[idcard.registered_account.account_balance]</b>"
//dat += "<p>Offstation Balance: <b()</b>"
dat += "<p>"
dat += "<a href='byond://?src=[REF(src)];withdraw=1'>Withdraw</A>"
dat += "<a href='byond://?src=[REF(src)];changepin=1'>Change Pin</A>"
//dat += "<a href='byond://?src=[REF(src)];settings=1'>Account Settings</A>"
dat += "<a href='byond://?src=[REF(src)];card=1'>Eject</A>"
else
dat += "<p>Please enter your bank pin to continue!"
dat += "<p>"
dat += "<a href='byond://?src=[REF(src)];pin=1'>[pin ? pin : "----"]</a><br><br>"
dat += "<p></center>"
dat += "<p>"
var/datum/browser/popup = new(user, "atm", "ATM")
popup.set_content(dat)
popup.set_title_image(user.browse_rsc_icon(icon, icon_state), 500,300)
popup.open()
/obj/machinery/atm/attackby(obj/item/I, mob/living/user)
if(istype(I, /obj/item/card)) //input id!
if(!held_card)
var/obj/item/card/id/idcard = I
if(!user.transferItemToLoc(I, src)) //check if you can put it in
return
held_card = idcard
user = idcard.registered_name
pin = ""
playsound(src, 'sound/machines/button.ogg', 50, FALSE)
src.ui_interact(usr)
if(istype(I, /obj/item/stack/credits)) //feed money back into the machine! dont need a pin to donate stuff.
if(held_card)
var/obj/item/stack/credits/cred = I
var/obj/item/card/id/idcard = held_card
idcard.registered_account.account_balance = (idcard.registered_account.account_balance+cred.amount)
to_chat(usr, "<span class='notice'>You insert [cred] into the ATM.</span>")
src.ui_interact(usr)
del(cred)
/obj/machinery/atm/Topic(href, href_list)
. = ..()
if(..())
return
if(href_list["card"])
if(held_card)
if(usr.CanReach(src))
playsound(src, 'sound/machines/button.ogg', 50, FALSE)
if(usr.put_in_hands(held_card))
to_chat(usr, "<span class='notice'>You take the ID out of the slot.</span>")
held_card = null
else
to_chat(usr, "<span class='warning'>The machine drops the ID onto the floor!</span>")
held_card = null
pin = ""
user = ""
if(href_list["pin"])
playsound(src, get_sfx("terminal_type"), 25, 1)
var/pininput = input(user, "Input pin", "Pin Number") as num|null
if(pininput)
if(pininput > 9999 || pininput < 1000)
to_chat(usr, "<span class='notice'>[src.name] buzzes, you must input a 4 digit number between 1000 and 9999.</span>")
return
pin = max(min( round(text2num(pininput)), 9999),1000) //4 numbers or less.
var/obj/item/card/id/idcard = held_card
if(pin == idcard.registered_account.account_pin)
to_chat(usr, "<span class='notice'>[src.name] beeps, accepting the pin.</span>")
else
to_chat(usr, "<span class='notice'>[src.name] buzzes, denying the pin.</span>")
if(href_list["changepin"])
playsound(src, get_sfx("terminal_type"), 25, 1)
var/pinchange = input(user, "Input pin", "Pin Number") as num|null
if(pinchange > 9999 || pinchange < 1000)
to_chat(usr, "<span class='warning'>[src.name], you must have a 4 digit number for a pin and be between 1000 and 9999.</span>")
return
if(pinchange)
var/pinchange2 = input(user, "Confirm pin", "Confirm pin") as num|null //time to confirm!
if(pinchange == pinchange2)
var/obj/item/card/id/idcard = held_card
idcard.registered_account.account_pin = pinchange
to_chat(usr, "<span class='notice'>[src.name] beeps, your pin has been changed to [pinchange]!.</span>")
else
to_chat(usr, "<span class='warning'>[src.name] buzzes, your pins did not match!</span>")
pin = ""
if(href_list["withdraw"])
playsound(src, get_sfx("terminal_type"), 25, 1)
if(held_card)
var/obj/item/card/id/idcard = held_card
if(idcard.registered_account)
var/amount = input(user, "Choose amount", "Withdraw") as num|null
if(amount>0)
amount = max(min( round(text2num(amount)), idcard.registered_account.account_balance),0) //make sure they aint taking out more then what they have
to_chat(usr, "<span class='notice'>The machine prints out [amount] credits.</span>")
idcard.registered_account.account_balance = (idcard.registered_account.account_balance-amount) //subtract the amount they took out.
var/obj/item/stack/credits/C = new /obj/item/stack/credits/(loc)
C.amount = amount
if(usr.put_in_hands(C))
to_chat(usr, "<span class='notice'>You take [C] out of the ATM.</span>")
src.ui_interact(usr)
//Money, Well, get back, I'm all right Jack, Keep your hands off of my stack.
//making our own currency, just to stop exploits (for now)
/obj/item/stack/credits
name = "credits"
singular_name = "credit"
desc = "Legal tender, a bundle of shiny metalic looking notes."
icon = 'hyperstation/icons/obj/economy.dmi'
icon_state = "cash"
amount = 1
max_amount = 99999999
throwforce = 0
throw_speed = 2
throw_range = 2
w_class = WEIGHT_CLASS_TINY
full_w_class = WEIGHT_CLASS_TINY
resistance_flags = FLAMMABLE
var/value = 1
+300
View File
@@ -0,0 +1,300 @@
//Hyperstation 13 fleshlight
//Humbley request this doesnt get ported to other code bases, we strive to make things unique on our server and we dont have alot of coders
//but if you absolutely must. please give us some credit~ <3
/obj/item/fleshlight
name = "fleshlight"
desc = "A sex toy disguised as a flashlight, used to stimulate someones penis, complete with colour changing sleeve."
icon = 'hyperstation/icons/obj/fleshlight.dmi'
icon_state = "fleshlight_base"
item_state = "fleshlight"
w_class = WEIGHT_CLASS_SMALL
var/sleevecolor = "#ffcbd4" //pink
price = 8
var/mutable_appearance/sleeve
var/inuse = 0
/obj/item/fleshlight/examine(mob/user)
. = ..()
. += "<span class='notice'>Alt-Click \the [src.name] to customize it.</span>"
/obj/item/fleshlight/Initialize()
. = ..()
sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "vagina")
sleeve.color = sleevecolor
add_overlay(sleeve)
/obj/item/fleshlight/AltClick(mob/user)
. = ..()
var/style = input(usr, "Choose style", "Customize Fleshlight", "vagina") in list("vagina", "anus")
var/new_color = input(user, "Choose color.", "Customize Fleshlight", sleevecolor) as color|null
if(new_color)
cut_overlays()
sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', style)
sleevecolor = new_color
sleeve.color = new_color
add_overlay(sleeve)
return TRUE
/obj/item/fleshlight/attack(mob/living/carbon/C, mob/living/user)
var/obj/item/organ/genital/penis/P = C.getorganslot("penis")
if(inuse == 1) //just to stop stacking and causing people to cum instantly
return
if(P&&P.is_exposed())
inuse = 1
if(!(C == user)) //if we are targeting someone else.
C.visible_message("<span class='userlove'>[user] is trying to use [src] on [C]'s penis.</span>", "<span class='userlove'>[user] is trying to use [src] on your penis.</span>")
if(!do_mob(user, C, 3 SECONDS)) //3 second delay
inuse = 0
return
//checked if not used on yourself, if not, carry on.
playsound(src, 'sound/lewd/slaps.ogg', 30, 1, -1) //slapping sound
inuse = 0
if(!(C == user)) //lewd flavour text
C.visible_message("<span class='userlove'>[user] pumps [src] on [C]'s penis.</span>", "<span class='userlove'>[user] pumps [src] up and down on your penis.</span>")
else
user.visible_message("<span class='userlove'>[user] pumps [src] on their penis.</span>", "<span class='userlove'>You pump the fleshlight on your penis.</span>")
if(prob(30)) //30% chance to make them moan.
C.emote("moan")
C.do_jitter_animation()
C.adjustArousalLoss(20) //make the target more aroused.
if (C.getArousalLoss() >= 100 && ishuman(C) && C.has_dna())
C.mob_climax(forced_climax=TRUE) //make them cum if they are over the edge.
return
else
to_chat(user, "<span class='notice'>You don't see anywhere to use this on.</span>")
inuse = 0
..()
//Hyperstation 13 portal fleshlight
//kinky!
/obj/item/portallight
name = "portal fleshlight"
desc = "A silver love(TM) fleshlight, used to stimulate someones penis, with bluespace tech that allows lovers to hump at a distance."
icon = 'hyperstation/icons/obj/fleshlight.dmi'
icon_state = "unpaired"
item_state = "fleshlight"
w_class = WEIGHT_CLASS_SMALL
var/partnercolor = "#ffcbd4"
var/partnerbase = "normal"
var/partnerorgan = "portal_vag"
price = 20
var/mutable_appearance/sleeve
var/mutable_appearance/organ
var/inuse = 0
var/paired = 0
var/obj/item/portalunderwear
var/useable = FALSE
var/option = ""
/obj/item/portallight/examine(mob/user)
. = ..()
if(!portalunderwear)
. += "<span class='notice'>The device is unpaired, to pair, swipe against a pair of portal panties(TM). </span>"
else
. += "<span class='notice'>The device is paired, and awaiting input. </span>"
/obj/item/portallight/attack(mob/living/carbon/C, mob/living/user) //use portallight! nearly the same as the fleshlight apart from you have a buddy!
var/obj/item/organ/genital/penis/P = C.getorganslot("penis")
if(inuse) //just to stop stacking and causing people to cum instantly
return
if(!useable)
to_chat(user, "<span class='notice'>It seems the device has failed or your partner is not wearing their device.</span>")
if(C == user)//if your using it on yourself, more options! otherwise, just fuck.
option = input(usr, "Choose action", "Portal Fleshlight", "Fuck") in list("Fuck", "Lick", "Touch")
else
option = "Fuck"
var/obj/item/organ/genital/vagina/V = portalunderwear.loc
if(!V)
return
var/mob/living/carbon/human/M = V.owner
if(option == "Fuck"&&!P.is_exposed()) //we are trying to fuck with no penis!
to_chat(user, "<span class='notice'>You don't see anywhere to use this on.</span>")
return
else //other options dont need checks
inuse = 1
if(!(C == user)) //if we are targeting someone else.
C.visible_message("<span class='userlove'>[user] is trying to use [src] on [C]'s penis.</span>", "<span class='userlove'>[user] is trying to use [src] on your penis.</span>")
if(!do_mob(user, C, 3 SECONDS)) //3 second delay
inuse = 0
return
//checked if not used on yourself, if not, carry on.
if(option == "Fuck")
playsound(src, 'sound/lewd/slaps.ogg', 30, 1, -1) //slapping sound for fuck.
inuse = 0
if(!(C == user))
C.visible_message("<span class='userlove'>[user] pumps [src] on [C]'s penis.</span>", "<span class='userlove'>[user] pumps [src] up and down on your penis.</span>")
else
if(option == "Fuck")
user.visible_message("<span class='userlove'>[user] pumps [src] on their penis.</span>", "<span class='userlove'>You pump the fleshlight on your penis.</span>")
if(option == "Lick")
user.visible_message("<span class='userlove'>[user] licks into [src].</span>", "<span class='userlove'>You lick into [src].</span>")
if(option == "Touch")
user.visible_message("<span class='userlove'>[user] touches softly against [src].</span>", "<span class='userlove'>You touch softly on [src].</span>")
if(prob(30)) //30% chance to make your partner moan.
M.emote("moan")
if(option == "Fuck")// normal fuck
to_chat(M, "<span class='love'>You feel a [P.shape] shaped penis pumping through the portal into your vagina.</span>")//message your partner and kinky!
if(prob(30)) //30% chance to make them moan.
C.emote("moan")
if(prob(30)) //30% chance to make your partner moan.
M.emote("moan")
C.adjustArousalLoss(20)
M.adjustArousalLoss(20)
M.do_jitter_animation() //make your partner shake too!
if(option == "Lick")
to_chat(M, "<span class='love'>You feel a tongue lick you through the portal against your vagina.</span>")
M.adjustArousalLoss(10)
if(option == "Touch")
to_chat(M, "<span class='love'>You feel someone touching your vagina through the portal.</span>")
M.adjustArousalLoss(5)
if (C.getArousalLoss() >= 100 && ishuman(C) && C.has_dna())
var/mob/living/carbon/human/O = C
O.mob_climax_partner(P, M, FALSE, FALSE, FALSE, TRUE) //climax with their partner remotely!
return
..()
/obj/item/portallight/proc/updatesleeve()
//get their looks and vagina colour!
cut_overlays()//remove current overlays
var/obj/item/organ/genital/vagina/V = portalunderwear.loc
var/mob/living/carbon/human/H = V.owner
if(H) //if the portal panties are on someone.
sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_normal")
if(H.dna.species.name == "Lizardperson") // lizard nerd
sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_lizard")
if(H.dna.species.name == "Slimeperson") // slime nerd
sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_slime")
if(H.dna.species.name == "Avian") // bird nerd
sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_avian")
sleeve.color = "#" + H.dna.features["mcolor"]
add_overlay(sleeve)
organ = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_vag")
organ.color = portalunderwear.loc.color
useable = TRUE
add_overlay(organ)
else
useable = FALSE
//Hyperstation 13 portal underwear
//can be attached to vagina, just like the vibrator, still requires pairing with the portallight
/obj/item/portalpanties
name = "portal panties"
desc = "A silver love(TM) pair of portal underwear, with bluespace tech allows lovers to hump at a distance. Needs to be paired with a portal fleshlight before use."
icon = 'hyperstation/icons/obj/fleshlight.dmi'
icon_state = "portalpanties"
item_state = "fleshlight"
w_class = WEIGHT_CLASS_SMALL
var/obj/item/portallight
var/attached = FALSE
/obj/item/portalpanties/examine(mob/user)
. = ..()
if(!portallight)
. += "<span class='notice'>The device is unpaired, to pair, swipe the fleshlight against this pair of portal panties(TM). </span>"
else
. += "<span class='notice'>The device is paired, and awaiting attachment. </span>"
/obj/item/portalpanties/attackby(obj/item/I, mob/living/user) //pairing
if(istype(I, /obj/item/portallight))
var/obj/item/portallight/P = I
if(!P.portalunderwear) //make sure it aint linked to someone else
portallight = P //pair the fleshlight
P.portalunderwear = src //pair the panties on the fleshlight.
P.icon_state = "paired" //we are paired!
playsound(src, 'sound/machines/ping.ogg', 50, FALSE)
to_chat(user, "<span class='notice'>[P] has been linked up successfully.</span>")
else
to_chat(user, "<span class='notice'>[P] has already been linked to another pair of underwear.</span>")
else
..() //just allows people to hit it with other objects, if they so wished.
/obj/item/portalpanties/attack(mob/living/carbon/C, mob/living/user)
if(!portallight) //we arent paired yet! noobie trap, let them know.
to_chat(user, "<span class='warning'>[src] can only be attached once paired with a portal fleshlight.</span>")
return
var/obj/item/organ/genital/picked_organ
var/mob/living/carbon/human/S = user
var/mob/living/carbon/human/T = C
picked_organ = S.target_genitals(T) //allowing to pick organ for anus down the line
if(picked_organ)
C.visible_message("<span class='warning'>[user] is trying to attach [src] to [T]!</span>",\
"<span class='warning'>[user] is trying to put [src] on you!</span>")
if(!do_mob(user, C, 5 SECONDS))//warn them and have a delay of 5 seconds to apply.
return
if(!(picked_organ.name == "vagina")) //only fits on a vagina
to_chat(user, "<span class='warning'>[src] can only be attached to a vagina.</span>")
return
if(!picked_organ.equipment)
to_chat(user, "<span class='love'>You wrap [src] around [T]'s [picked_organ.name].</span>")
else
to_chat(user, "<span class='notice'>They already have a [picked_organ.equipment.name] there.</span>")
return
if(!user.transferItemToLoc(src, picked_organ)) //check if you can put it in
return
src.attached = TRUE
picked_organ.equipment = src
var/obj/item/portallight/P = portallight
//now we need to send what they look like, but saddly if the person changes colour for what ever reason, it wont update. but dont tell people shh.
if(P) //just to make sure
P.updatesleeve()
else
to_chat(user, "<span class='notice'>You don't see anywhere to attach this.</span>")
/obj/item/portalpanties/proc/remove() //if taken off update it.
if(portallight)
var/obj/item/portallight/P = portallight
P.updatesleeve()
/obj/item/storage/box/portallight
name = "Portal Fleshlight and Underwear"
icon = 'hyperstation/icons/obj/fleshlight.dmi'
desc = "A small silver box with Silver Love Co embossed."
icon_state = "box"
price = 15
// portal fleshlight box
/obj/item/storage/box/portallight/PopulateContents()
new /obj/item/portallight/(src)
new /obj/item/portalpanties/(src)
new /obj/item/paper/fluff/portallight(src)
/obj/item/paper/fluff/portallight
name = "Portal Fleshlight Instructions"
info = "Thank you for purchasing the Silver Love Portal Fleshlight!<BR>To use, simply register your new portal fleshlight with the provided underwear to link them together. The ask your lover to wear the underwear.<BR>Have fun lovers,<BR><BR>Wilhelmina Steiner."
+34 -2
View File
@@ -6,12 +6,14 @@
icon = 'hyperstation/icons/obj/clothing/gloves.dmi'
alternate_worn_icon = 'hyperstation/icons/mobs/gloves.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
price = 5
/obj/item/clothing/gloves/latexsleeves/security
name = "security sleeves"
desc = "A pair of latex sleeves, with a band of red above the elbows denoting that the wearer is part of the security team."
icon_state = "latexsec"
item_state = "latexsec"
price = 5
/obj/item/clothing/head/dominatrixcap
name = "dominatrix cap"
@@ -29,9 +31,39 @@
item_state = "highheels"
icon = 'hyperstation/icons/obj/clothing/shoes.dmi'
alternate_worn_icon = 'hyperstation/icons/mobs/feet.dmi'
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/shoes/highheels/Initialize()
. = ..()
AddComponent(/datum/component/squeak, list('sound/effects/footstep/highheel1.ogg' = 1,'sound/effects/footstep/highheel2.ogg' = 1), 20)
//the classic click clack
//the classic click clack
obj/item/clothing/neck/stole
name = "white boa"
desc = "Fluffy neck wear to keep you warm, and attract others."
icon = 'hyperstation/icons/obj/clothing/neck.dmi'
w_class = WEIGHT_CLASS_SMALL
icon_state = "stole"
item_state = "" //no inhands
price = 3
obj/item/clothing/neck/stole/black
name = "black boa"
desc = "Fluffy neck wear to keep you warm, and attract others."
icon = 'hyperstation/icons/obj/clothing/neck.dmi'
w_class = WEIGHT_CLASS_SMALL
icon_state = "stole"
item_state = "" //no inhands
color = "#3d3d3d"
price = 3
/obj/item/clothing/suit/fluffyhalfcrop
name = "fluffy half-crop jacket"
desc = "A fluffy synthetic fur half-cropped jacket, less about warmth, more about style!"
icon_state = "fluffy"
item_state = "fluffy"
icon = 'hyperstation/icons/obj/clothing/suits.dmi'
alternate_worn_icon = 'hyperstation/icons/mobs/suits.dmi'
body_parts_covered = CHEST|LEGS|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
mutantrace_variation = NO_MUTANTRACE_VARIATION
+63 -1
View File
@@ -53,7 +53,9 @@
H.update_disabled_bodyparts()
H.bleed_rate += 5
H.emote("scream")
new /obj/item/helfiretincture(src.loc) //Eventually a pick, with different items.
var/obj/item/lunar = pick(/obj/item/helfiretincture,
/obj/item/instrument/guitar/biggerukulele)
new lunar(src.loc)
visible_message("<span class='warning'>As you blink, cracks appear on the altar and a flash of lunar light reaches its surface. A gift?</span>")
message_admins("[ADMIN_LOOKUPFLW(user)] has sacrificed their [bodypart] on the lunar altar at [AREACOORD(src)].")
icon_state = "sacrificealtar-blue"
@@ -90,3 +92,63 @@
icon_state = "helfire_tincture"
update_icon()
to_chat(user, "<span class='warning'>The tincture vibrates with power once again.</span>")
/obj/item/instrument/guitar/biggerukulele
name = "bigger ukulele"
desc = "...and his music was electric."
icon_state = "biggerukulele"
item_state = "guitar"
instrumentExt = "ogg"
attack_verb = list("played a sick solo on", "electrified", "crashed", "smashed")
hitsound = 'sound/weapons/stringsmash.ogg'
instrumentId = "guitar"
siemens_coefficient = -1
hit_reaction_chance = 100
var/tesla_power = 25000
var/tesla_range = 20
var/tesla_flags = TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE
var/legacy = FALSE
var/legacy_dmg = 30
var/reactive_cooldown_duration = 20
var/reactive_cooldown = 0
var/firstpickup = TRUE
/obj/item/instrument/guitar/biggerukulele/dropped(mob/user)
..()
if(istype(user))
user.flags_1 &= ~TESLA_IGNORE_1
/obj/item/instrument/guitar/biggerukulele/pickup(mob/user)
..()
if(istype(user))
user.flags_1 |= TESLA_IGNORE_1
if(firstpickup)
SEND_SOUND(user, sound('hyperstation/sound/misc/biggerukulelepickup.ogg', volume = 100))
firstpickup = FALSE
/obj/item/instrument/guitar/biggerukulele/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(owner.flags_1 & TESLA_IGNORE_1)
//Do literally nothing. Checking for absence of flags doesn't work for whatever reason, so if !TESLA_IGNORE_1 is not an option.
else if (owner.flags_1)
owner.flags_1 |= TESLA_IGNORE_1 //Sometimes picking up the item doesn't grant the user the flag. This is a way to go around that. Thank you, DM Code.
if(prob(hit_reaction_chance))
if(world.time < reactive_cooldown)
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 electric strings of [owner]'s bigger ukulele! The instrument 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)
playsound(src.loc, 'sound/weapons/emitter2.ogg', 100, 1, extrarange = 10)
else
for(var/mob/living/M in view(7, 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)
reactive_cooldown = world.time + reactive_cooldown_duration
return TRUE
+51 -15
View File
@@ -29,20 +29,7 @@
squeak_override = list('sound/weapons/plasma_cutter.ogg' = 1) // The sound the crusher uses is the same as the plasma cutter :P
/obj/item/toy/plush/slimeplushie/tania
desc = "An adorable stuffed toy of a slimegirl. She seems oddly damp..." // Milky slime
icon = 'hyperstation/icons/obj/plushes.dmi'
icon_state = "tania"
item_state = "tania"
attack_verb = list("hugged", "cuddled", "embraced")
squeak_override = list('sound/weapons/thudswoosh.ogg' = 1)
/obj/item/toy/plush/slimeplushie/tania/love(obj/item/toy/plush/Kisser, mob/living/user)
/* if (istype(Kisser, /obj/item/toy/plush/vladin) ) // Vladin plushie isn't real, Vladin plushie cannot hug you ;-;
..()
else */
user.show_message("<span class='notice'>[src] hugs [Kisser]!</span>", 1,
"<span class='notice'>[src] hugs [Kisser]!</span>", 0)
//society has progressed past the need for Tania
/obj/item/toy/plush/mammal/grug
name = "Grug S. Cavemannington Plushie"
@@ -51,4 +38,53 @@
icon_state = "grug"
item_state = "grug"
attack_verb = list("thomped", "ook'd", "stoned")
squeak_override = list('sound/voice/gorillaplush.ogg' = 1)
squeak_override = list('sound/voice/gorillaplush.ogg' = 1)
/obj/item/toy/plush/mammal/winterdawn
name = "hyena plushie"
desc = "An adorable stuffed toy of a mammal that seems to resemble a crew member! She's a little yeen in a big labcoat."
gender = FEMALE //probably a girl
icon = 'hyperstation/icons/obj/plushes.dmi'
icon_state = "lyricalpaws"
item_state = "lyricalpaws"
attack_verb = list("hugged", "cuddled", "embraced")
squeak_override = list(
'modular_citadel/sound/voice/bark1.ogg' = 1,
'modular_citadel/sound/voice/bark2.ogg' = 1
)
/obj/item/toy/plush/mammal/chemlight
desc = "An adorable stuffed toy of a mammal that seems to resemble a crew member! It looks to glow and sport four arms."
gender = MALE //he's a boy, right?
icon = 'hyperstation/icons/obj/plushes.dmi'
icon_state = "chemlight"
item_state = "chemlight"
light_color = "#CCFF33"
light_power = 0.25
light_range = 1.4
attack_verb = list("bapped", "slapped", "bonked")
//Vladplush containment starts here
/obj/item/toy/plush/nukeplushie/vladin
name = "elite operative plushie"
desc = "A stuffed toy that resembles an elite syndicate nuclear operative. He has a little wedding band!"
gender = MALE //he's a boy, there is no doubt here
young = TRUE //he's not actually young, but i refuse to have a plush that is not loyal to his partner. this is the only way i could figure out.
icon = 'hyperstation/icons/obj/plushes.dmi'
icon_state = "vladin"
item_state = "vladin"
attack_verb = list("nuked", "detonated", "CQC'd", "robusted")
squeak_override = list('sound/effects/hit_punch.ogg' = 1, 'sound/effects/hit_kick.ogg' = 1, 'sound/weapons/cqchit1.ogg' = 1, 'sound/weapons/cqchit2.ogg' = 1)
//I can't figure out how to make him loyal to a specific type of plush. If anyone figures that out, there will be more. Until then, this is the end of the vladplush.
//Enzo_Leon patron stuff
/obj/item/toy/plush/mammal/enzo_leon
name = "rat plushie"
desc = "An stuffed toy of a mammal that seems to resemble a crew member! Iconically it has a squeaker as you'd expect."
gender = MALE //It's a boy!
icon = 'hyperstation/icons/obj/plushes.dmi'
icon_state = "enzor"
item_state = "enzor"
attack_verb = list("tail bapped", "whomped", "squeaked")
squeak_override = list('sound/effects/mousesqueek.ogg'= 1)
//End
+93
View File
@@ -0,0 +1,93 @@
//hyperstation 13 stripper pole! about time?
/obj/structure/pole
name = "stripper pole"
desc = "A pole fastened to the ceiling and floor, used to show of ones goods to company."
icon = 'hyperstation/icons/obj/pole.dmi'
icon_state = "pole"
density = TRUE
anchored = TRUE
var/icon_state_inuse
layer = 4 //make it the same layer as players.
pseudo_z_axis = 9 //stepping onto the pole makes you raise upwards!
density = 0 //easy to step up on
/obj/structure/pole/attack_hand(mob/living/user)
. = ..()
if(.)
return
if(obj_flags & IN_USE)
to_chat(user, "It's already in use - wait a bit.")
return
else
obj_flags |= IN_USE
user.setDir(SOUTH)
user.Stun(100)
user.forceMove(src.loc)
user.visible_message("<B>[user] dances on [src]!</B>")
animatepole(user)
user.layer = layer //set them to the poles layer
obj_flags &= ~IN_USE
user.pixel_y = 0
user.pixel_z = pseudo_z_axis //incase we are off it when we jump on!
icon_state = initial(icon_state)
/obj/structure/pole/proc/animatepole(mob/living/user)
return
/obj/structure/pole/animatepole(mob/living/user)
if (user.loc != src.loc)
return
animate(user,pixel_x = -6, pixel_y = 0, time = 10)
sleep(20)
user.dir = 4
animate(user,pixel_x = -6,pixel_y = 24, time = 10)
sleep(12)
src.layer = 4.01 //move the pole infront for now. better to move the pole, because the character moved behind people sitting above otherwise
animate(user,pixel_x = 6,pixel_y = 12, time = 5)
user.dir = 8
sleep(6)
animate(user,pixel_x = -6,pixel_y = 4, time = 5)
user.dir = 4
src.layer = 4 // move it back.
sleep(6)
user.dir = 1
animate(user,pixel_x = 0, pixel_y = 0, time = 3)
sleep(6)
user.do_jitter_animation()
sleep(6)
user.dir = 2
/obj/item/polepack
name = "stripper pole flatpack"
desc = "A wrench is required to construct."
icon = 'hyperstation/icons/obj/pole_small.dmi'
throwforce = 0
icon_state = "pole_base"
var/unwrapped = 0
w_class = WEIGHT_CLASS_HUGE
/obj/item/polepack/attackby(obj/item/P, mob/user, params) //erecting a pole here.
add_fingerprint(user)
if(istype(P, /obj/item/wrench))
if (!(item_flags & IN_INVENTORY))
to_chat(user, "<span class='notice'>You start to fasten the frame to the floor and celing...</span>")
if(P.use_tool(src, user, 8 SECONDS, volume=50))
to_chat(user, "<span class='notice'>You construct the stripper pole!</span>")
var/obj/structure/pole/C = new
C.loc = loc
del(src)
return
/obj/structure/pole/attackby(obj/item/P, mob/user, params) //un-erecting a pole. :(
add_fingerprint(user)
if(istype(P, /obj/item/wrench))
to_chat(user, "<span class='notice'>You start to unfastening the frame...</span>")
if(P.use_tool(src, user, 8 SECONDS, volume=50))
to_chat(user, "<span class='notice'>You take down the stripper pole!</span>")
var/obj/item/polepack/C = new
C.loc = loc
del(src)
return
+110 -1
View File
@@ -34,7 +34,6 @@
icon_state = "luwethtrench"
item_state = "luwethtrench"
mutantrace_variation = NO_MUTANTRACE_VARIATION
roomy = TRUE
/obj/item/clothing/gloves/ring/luweth
name = "Luweths Wedding Band"
@@ -89,3 +88,113 @@
/obj/item/storage/pill_bottle/betablock/PopulateContents()
for(var/i in 1 to 7)
new /obj/item/reagent_containers/pill/betablock(src)
/obj/item/clothing/head/crystalline
name = "crystalline shards"
icon = 'hyperstation/icons/obj/rewards.dmi'
desc = "A handful of blue crystals. They look like they came from some sort of cave."
alternate_worn_icon = 'hyperstation/icons/mobs/rewards.dmi'
icon_state = "crystalline"
/obj/item/clothing/mask/keaton
name = "keaton mask"
desc = "A mask made to look like the mythical Keaton."
icon = 'hyperstation/icons/obj/rewards.dmi'
alternate_worn_icon = 'hyperstation/icons/mobs/rewards.dmi'
icon_state = "keaton"
flags_inv = HIDEFACE|HIDEFACIALHAIR
w_class = WEIGHT_CLASS_SMALL
/obj/item/clothing/suit/chloe
name = "Fleet Commander's Overcoat"
desc = "Custom tailored to warm the cold commanding hearts of the Syndicate's feared XIV'th battle group. Its armour plating has been removed."
icon_state = "commissar_greatcoat"
item_state = "commissar_greatcoat"
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/screwdriver, /obj/item/crowbar, /obj/item/wrench, /obj/item/stack/cable_coil, /obj/item/weldingtool, /obj/item/multitool)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
body_parts_covered = CHEST|GROIN|ARMS|LEGS
mutantrace_variation = MUTANTRACE_VARIATION
tauric = TRUE
/obj/item/clothing/head/chloe
name = "Fleet Commander's Beret"
desc = "A beret bearing a worn golden symbol that stikes fear in the hearts of many. It smells faintly of plasma and gunpowder."
icon = 'hyperstation/icons/obj/clothing/rewards.dmi'
alternate_worn_icon = 'hyperstation/icons/mobs/rewards.dmi'
icon_state = "commissar_beret"
item_state = "commissar_beret"
/obj/item/clothing/under/touchinfuzzy
name = "provocative jumpsuit"
desc = "A form fitting jumpsuit with a golden trim zipper! Smells faintly of succubus milk."
icon_state = "touchinfuzzyuni"
item_state = "touchinfuzzyuni"
body_parts_covered = CHEST|GROIN|ARMS|LEGS
fitted = NO_FEMALE_UNIFORM
/obj/item/toy/sword/chloesabre
name = "Fleet Commander's Sabre"
desc = "An elegant weapon, similar in design to the Captain's Sabre, but with a syndicate twist."
icon = 'icons/obj/custom.dmi'
alternate_worn_icon = 'icons/mob/custom_w.dmi'
icon_state = "darksabre"
item_state = "darksabre"
force = 5
throwforce = 5
hitsound = 'sound/weapons/rapierhit.ogg'
lefthand_file = 'modular_citadel/icons/mob/inhands/stunsword_left.dmi'
righthand_file = 'modular_citadel/icons/mob/inhands/stunsword_right.dmi'
obj_flags = UNIQUE_RENAME
attack_verb = list("slashed", "cut")
/obj/item/toy/sword/chloesabre/get_belt_overlay()
return mutable_appearance('icons/obj/custom.dmi', "darksheath-darksabre")
/obj/item/toy/sword/chloesabre/get_worn_belt_overlay(icon_file)
return mutable_appearance(icon_file, "darksheath-darksabre")
/obj/item/mialasscale
name = "Miala's Scale"
desc = "A bright, and familiar, cyan scale from an equally familiar snake being."
icon = 'hyperstation/icons/obj/rewards.dmi'
icon_state = "m_scale"
item_state = "m_scale"
w_class = WEIGHT_CLASS_SMALL
/obj/item/bong/kiseru
name = "black lacquered kiseru"
desc = "it is a black lacquered kiseru with a ornate silver head and mouthpiece, you can feel it's old age as you hold it"
icon = 'hyperstation/icons/obj/rewards.dmi'
icon_state = null
item_state = null
w_class = WEIGHT_CLASS_NORMAL
light_color = "#FFCC66"
icon_off = "pipe"
icon_on = "pipe_lit"
/obj/item/clothing/suit/hooded/occultrobes
name = "Occult Robes"
desc = "I didn't even know they made these in XXS..."
icon_state = "coatwinter"
item_state = "coatwinter"
body_parts_covered = CHEST|GROIN|ARMS
cold_protection = CHEST|GROIN|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 10, "rad" = 0, "fire" = 0, "acid" = 0)
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
/obj/item/clothing/suit/hooded/occultrobes
name = "occult robes"
desc = "I didn't even know they made these in XXS..."
icon_state = "occultrobes"
hoodtype = /obj/item/clothing/head/hooded/occultrobeshood
mutantrace_variation = NO_MUTANTRACE_VARIATION
/obj/item/clothing/head/hooded/occultrobeshood
name = "occult hood"
icon_state = "occultrobeshood"
body_parts_covered = HEAD
cold_protection = HEAD
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
flags_inv = HIDEHAIR
mutantrace_variation = NO_MUTANTRACE_VARIATION
+1
View File
@@ -10,6 +10,7 @@
item_state = "rope" //This sprite is in restraints.dmi until I figure out how to refrence somewhere else
cuffsound = 'sound/weapons/cablecuff.ogg'
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
price = 2
/mob/living/proc/rope_add(source) //Check to see if the rope is on, and then add effects
var/mob/living/carbon/M = source
+14
View File
@@ -0,0 +1,14 @@
/obj/item/reagent_containers/food/drinks/prospacillin
name = "Prospacillin Bottle"
desc = "An incredibly expensive bottle used by Kinaris command. It has golden engravings and reeks of corporate greed."
w_class = WEIGHT_CLASS_TINY
icon_state = "prospacillin"
list_reagents = list(/datum/reagent/growthchem = 15)
/obj/item/reagent_containers/food/drinks/diminicillin
name = "Diminicillin Bottle"
desc = "An incredibly expensive bottle used by Kinaris command. It has golden engravings and reeks of corporate greed."
w_class = WEIGHT_CLASS_TINY
icon_state = "diminicillin"
list_reagents = list(/datum/reagent/shrinkchem = 15)
+1
View File
@@ -6,6 +6,7 @@
icon_state = "sounding_wrapped"
var/unwrapped = 0
w_class = WEIGHT_CLASS_TINY
price = 1
/obj/item/sounding/attack_self(mob/user)
if(!istype(user))
+159
View File
@@ -0,0 +1,159 @@
//Hyperstation 13 vibrator
//For all them subs/bottoms out there, that wanna give someone the power to make them cum remotely.
/obj/item/electropack/vibrator
name = "remote vibrator"
desc = "A remote device that can deliver pleasure at a fair. It has three intensities that can be set by twisting the base."
icon = 'hyperstation/icons/obj/vibrator.dmi'
icon_state = "vibe"
item_state = "vibe"
w_class = WEIGHT_CLASS_SMALL
slot_flags = ITEM_SLOT_DENYPOCKET //no more pocket shockers
var/mode = 1
var/style = "long"
var/inside = FALSE
var/last = 0
price = 3
/obj/item/electropack/vibrator/Initialize() //give the device its own code
. = ..()
code = rand(1,30)
/obj/item/electropack/vibrator/small //can go anywhere
name = "small remote vibrator"
style = "small"
icon_state = "vibesmall"
item_state = "vibesmall"
/obj/item/electropack/vibrator/AltClick(mob/living/user)
var/dat = {"
<TT>
<B>Frequency/Code</B> for vibrator:<BR>
Frequency:
[format_frequency(src.frequency)]
<A href='byond://?src=[REF(src)];set=freq'>Set</A><BR>
Code:
[src.code]
<A href='byond://?src=[REF(src)];set=code'>Set</A><BR>
</TT>"}
user << browse(dat, "window=radio")
onclose(user, "radio")
return
/obj/item/electropack/shockcollar/security
name = "security shock collar"
desc = "A reinforced security collar. It has two electrodes that press against the neck, for disobedient pets."
icon_state = "shockseccollar"
item_state = "shockseccollar"
/obj/item/electropack/vibrator/attack_self(mob/user)
if(!istype(user))
return
if(isliving(user))
playsound(user, 'sound/effects/clock_tick.ogg', 50, 1, -1)
switch(mode)
if(1)
mode = 2
to_chat(user, "<span class='notice'>You twist the bottom of [src], setting it to the medium setting.</span>")
return
if(2)
mode = 3
to_chat(user, "<span class='warning'>You twist the bottom of [src], setting it to the high setting.</span>")
return
if(3)
mode = 1
to_chat(user, "<span class='notice'>You twist the bottom of [src], setting it to the low setting.</span>")
return
/obj/item/electropack/vibrator/attack(mob/living/carbon/C, mob/living/user)
var/obj/item/organ/genital/picked_organ
var/mob/living/carbon/human/S = user
var/mob/living/carbon/human/T = C
picked_organ = S.target_genitals(T)
if(picked_organ)
C.visible_message("<span class='warning'>[user] is trying to attach [src] to [T]!</span>",\
"<span class='warning'>[user] is trying to put [src] on you!</span>")
if(!do_mob(user, C, 5 SECONDS))//warn them and have a delay of 5 seconds to apply.
return
if(style == "long" && !(picked_organ.name == "vagina")) //long vibrators dont fit on anything but vaginas, but small ones fit everywhere
to_chat(user, "<span class='warning'>[src] is too big to fit there, use a smaller version.</span>")
return
if(!picked_organ.equipment)
if(!(style == "long"))
to_chat(user, "<span class='love'>You attach [src] to [T]'s [picked_organ.name].</span>")
else
to_chat(user, "<span class='love'>You insert [src] into [T]'s [picked_organ.name].</span>")
else
to_chat(user, "<span class='notice'>They already have a [picked_organ.equipment.name] there.</span>")
return
if(!user.transferItemToLoc(src, picked_organ)) //check if you can put it in
return
src.inside = TRUE
picked_organ.equipment = src
else
to_chat(user, "<span class='notice'>You don't see anywhere to attach this.</span>")
/obj/item/electropack/vibrator/receive_signal(datum/signal/signal)
if(!signal || signal.data["code"] != code)
return
if(last > world.time)
return
last = world.time + 3 SECONDS //lets stop spam.
if(inside)
var/obj/item/organ/genital/G = src.loc
var/mob/living/carbon/U = G.owner
if(G)
switch(G.name) //just being fancy
if("penis")
to_chat(U, "<span class='love'>[src] vibrates against your [G.name]!</span>")
if("breasts")
to_chat(U, "<span class='love'>[src] vibrates against your nipples!</span>")
if("vagina")
to_chat(U, "<span class='love'>[src] vibrates inside you!</span>")
var/intencity = 6*mode
U.adjustArousalLoss(intencity) //give pleasure
playsound(U.loc, 'sound/lewd/vibrate.ogg', (intencity+5), 1, -1) //vibe intencity scaled up abit for sound
switch(mode)
if(1) //low, setting for RP, it wont force your character to do anything.
to_chat(U, "<span class='love'>You feel pleasure surge through your [G.name]</span>")
U.do_jitter_animation() //do animation without heartbeat
if(2) //med, can make you cum
to_chat(U, "<span class='love'>You feel intense pleasure surge through your [G.name]</span>")
U.do_jitter_animation()
if (U.getArousalLoss() >= 100 && ishuman(U) && U.has_dna())
U.mob_climax(forced_climax=TRUE)
if(3) //high, makes you stun
to_chat(U, "<span class='userdanger'>You feel overpowering pleasure surge through your [G.name]</span>")
U.Jitter(3)
U.Stun(30)
if (U.getArousalLoss() >= 100 && ishuman(U) && U.has_dna())
U.mob_climax(forced_climax=TRUE)
if(prob(50))
U.emote("moan")
playsound(src, 'sound/lewd/vibrate.ogg', 40, 1, -1)
if(style == "long") //haha vibrator go brrrrrrr
icon_state = "vibing"
sleep(30)
icon_state = "vibe"
else
icon_state = "vibingsmall"
sleep(30)
icon_state = "vibesmall"