mirror of
https://github.com/KabKebab/GS13.git
synced 2026-07-13 17:08:53 +01:00
Update with master
This commit is contained in:
@@ -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
|
||||
@@ -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
|
||||
@@ -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>")
|
||||
@@ -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"
|
||||
|
||||
@@ -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.
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -7,26 +7,13 @@
|
||||
. = ..()
|
||||
var/dat = {"<B>Genitals</B><BR><HR>"}
|
||||
|
||||
//List genitals
|
||||
var/obj/item/organ/genital/penis/P = user.getorganslot("penis")
|
||||
if (P) //they have a pp
|
||||
dat += "<a href='byond://?src=[REF(src)];hidepenis=1'>[P.mode == "hidden" ? "Penis <font color='red'>(Hidden)</font>" : (P.mode == "clothes" ? "Penis <font color='yellow'>(Hidden by Clothes)</font>" : (P.mode == "visable" ? "Penis <font color='green'>(Visable)</font>" : "Penis <font color='green'>(Visable)</font>"))]</a><BR>"
|
||||
|
||||
var/obj/item/organ/genital/testicles/T = user.getorganslot("testicles")
|
||||
if (T) //they have teabags
|
||||
if(!T.internal)
|
||||
dat += "<a href='byond://?src=[REF(src)];hidetesticles=1'>[T.mode == "hidden" ? "Testicles <font color='red'>(Hidden)</font>" : (T.mode == "clothes" ? "Testicles <font color='yellow'>(Hidden by Clothes)</font>" : (T.mode == "visable" ? "Testicles <font color='green'>(Visable)</font>" : "Testicles <font color='green'>(Visable)</font>"))]</a><BR>"
|
||||
else //internal balls
|
||||
dat += "<a href='byond://?src=[REF(src)];na=1'>Internal Testicles</A><BR>"
|
||||
var/obj/item/organ/genital/vagina/V = user.getorganslot("vagina")
|
||||
if (V) //they have a vjay
|
||||
dat += "<a href='byond://?src=[REF(src)];hidevagina=1'>[V.mode == "hidden" ? "Vagina <font color='red'>(Hidden)</font>" : (V.mode == "clothes" ? "Vagina <font color='yellow'>(Hidden by Clothes)</font>" : (V.mode == "visable" ? "Vagina <font color='green'>(Visable)</font>" : "Vagina <font color='green'>(Visable)</font>"))]</a><BR>"
|
||||
|
||||
var/obj/item/organ/genital/breasts/B = user.getorganslot("breasts")
|
||||
if (B) //they have a boobiedoo
|
||||
dat += "<a href='byond://?src=[REF(src)];hidebreasts=1'>[B.mode == "hidden" ? "Breasts <font color='red'>(Hidden)</font>" : (B.mode == "clothes" ? "Breasts <font color='yellow'>(Hidden by Clothes)</font>" : (B.mode == "visable" ? "Breasts <font color='green'>(Visable)</font>" : "Breasts <font color='green'>(Visable)</font>"))]</a><BR>"
|
||||
var/mob/living/carbon/U = user
|
||||
for(var/obj/item/organ/genital/G in U.internal_organs)
|
||||
if(!G.dontlist)
|
||||
dat += "<a href='byond://?src=[REF(src)];hide[G.name]=1'>[G.mode == "hidden" ? "[G.name] <font color='red'>(Hidden)</font>" : (G.mode == "clothes" ? "[G.name] <font color='yellow'>(Hidden by Clothes)</font>" : (G.mode == "visable" ? "[G.name] <font color='green'>(Visable)</font>" : "[G.name] <font color='green'>(Visable)</font>"))]</a><BR>"
|
||||
|
||||
dat += {"<BR><B>Contexual Options</B><BR><HR>"}
|
||||
var/obj/item/organ/genital/penis/P = user.getorganslot("penis")
|
||||
//Options
|
||||
dat += "<a href='byond://?src=[REF(src)];masturbate=1'>Masturbate</A>"
|
||||
dat += "(Stimulate a sexual organ with your hands.)<BR>"
|
||||
@@ -37,13 +24,22 @@
|
||||
dat += "<a href='byond://?src=[REF(src)];container=1'>Fill container</A>"
|
||||
dat += "(Use a container in your hand to collect your seminal fluid.)<BR>"
|
||||
|
||||
var/mob/living/carbon/human/C = usr
|
||||
if(C && C.w_uniform || C.wear_suit) //if they are wearing cloths
|
||||
dat += "<a href='byond://?src=[REF(src)];clothesplosion=1'>Explode out of clothes</A>"
|
||||
dat += "(Flex your body to cause your clothes to burst apart.)<BR>"
|
||||
|
||||
if(user.pulling)
|
||||
dat += "<a href='byond://?src=[REF(src)];kiss=1'>Kiss [user.pulling]</A>"
|
||||
dat += "(Kiss a partner, or object.)<BR>"
|
||||
else
|
||||
dat += "<span class='linkOff'>Kiss</span></A>"
|
||||
dat += "(Requires a partner)<BR>"
|
||||
|
||||
|
||||
if(user.pulling)
|
||||
dat += "<a href='byond://?src=[REF(src)];climaxover=1'>Climax over [user.pulling]</A>" //you can cum on objects if you really want...
|
||||
dat += "(Orgasm over a person or object.)<BR>"
|
||||
|
||||
if(isliving(user.pulling))
|
||||
if(iscarbon(user.pulling))
|
||||
dat += "<a href='byond://?src=[REF(src)];climaxwith=1'>Climax with [user.pulling]</A>"
|
||||
@@ -51,15 +47,24 @@
|
||||
|
||||
var/mob/living/carbon/human/H = user.pulling
|
||||
if(H.breedable && P && H)
|
||||
dat += "<a href='byond://?src=[REF(src)];impreg=1'>Impregnate [user.pulling]</A>"
|
||||
dat += "(Climax inside another person, knocking them up.)<BR>"
|
||||
dat += "<a href='byond://?src=[REF(src)];impreg=1'>Impregnate [U.pulling] ([clamp(U.impregchance,0,100)]%)</A>"
|
||||
dat += "(Climax inside another person, and attempt to knock them up.)<BR>"
|
||||
else
|
||||
dat += "<span class='linkOff'>Climax over</span></A>"
|
||||
dat += "(Requires a partner)<BR>"
|
||||
dat += "<span class='linkOff'>Climax with</span></A>"
|
||||
dat += "(Requires a partner)<BR>"
|
||||
|
||||
|
||||
if(P) // They have a dick (make sure to check or this will break everything)
|
||||
//old code needs to be cleaned
|
||||
if(P)
|
||||
if(P.condom == 1)
|
||||
dat += "<a href='byond://?src=[REF(src)];removecondom=1'>Remove Condom</A><BR>"
|
||||
dat += "<a href='byond://?src=[REF(src)];removecondom=1'>Remove condom (penis)</A><BR>"
|
||||
if(P.sounding == 1)
|
||||
dat += "<a href='byond://?src=[REF(src)];removesound=1'>Remove Sounding Rod</A><BR>"
|
||||
dat += "<a href='byond://?src=[REF(src)];removesound=1'>Remove sounding rod (penis)</A><BR>"
|
||||
for(var/obj/item/organ/genital/G in U.internal_organs)
|
||||
if(G.equipment) //they have equipment
|
||||
dat += "<a href='byond://?src=[REF(src)];removeequipment[G.name]=1;'>Remove [G.equipment.name] ([G.name])</A><BR>"
|
||||
|
||||
dat += {"<HR>"}//Newline for the objects
|
||||
//bottom options
|
||||
dat += "<a href='byond://?src=[REF(src)];refresh=1'>Refresh</A>"
|
||||
@@ -74,6 +79,9 @@
|
||||
popup.open()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/screen/arousal/Topic(href, href_list)
|
||||
. = ..() //Sanity checks.
|
||||
if(..())
|
||||
@@ -106,6 +114,11 @@
|
||||
var/picked_visibility = input(usr, "Choose visibility", "Expose/Hide genitals", "Hidden by clothes") in list("Always visible", "Hidden by clothes", "Always hidden")
|
||||
B.toggle_visibility(picked_visibility)
|
||||
|
||||
if(href_list["hidebelly"])
|
||||
var/obj/item/organ/genital/belly/E = usr.getorganslot("belly")
|
||||
var/picked_visibility = input(usr, "Choose visibility", "Expose/Hide genitals", "Hidden by clothes") in list("Always visible", "Hidden by clothes", "Always hidden")
|
||||
E.toggle_visibility(picked_visibility)
|
||||
|
||||
if(href_list["hidetesticles"])
|
||||
var/obj/item/organ/genital/testicles/T = usr.getorganslot("testicles")
|
||||
var/picked_visibility = input(usr, "Choose visibility", "Expose/Hide genitals", "Hidden by clothes") in list("Always visible", "Hidden by clothes", "Always hidden")
|
||||
@@ -127,6 +140,14 @@
|
||||
to_chat(usr, "<span class='warning'>You aren't aroused enough for that! </span>")
|
||||
return
|
||||
|
||||
if(href_list["clothesplosion"])
|
||||
if (H.arousalloss >= (H.max_arousal / 100) * 33) //Requires 33% arousal.
|
||||
H.clothesplosion()
|
||||
return
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>You aren't aroused enough for that! </span>")
|
||||
return
|
||||
|
||||
if(href_list["climax"])
|
||||
if (H.arousalloss >= (H.max_arousal / 100) * 33) //requires 33% arousal.
|
||||
H.climaxalone(FALSE)
|
||||
@@ -172,6 +193,34 @@
|
||||
if(href_list["removesound"])
|
||||
H.menuremovesounding()
|
||||
|
||||
if(href_list["removeequipmentpenis"])
|
||||
var/obj/item/organ/genital/penis/O = usr.getorganslot("penis")
|
||||
var/obj/item/I = O.equipment
|
||||
usr.put_in_hands(I)
|
||||
O.equipment = null
|
||||
|
||||
if(href_list["removeequipmentbreasts"])
|
||||
var/obj/item/organ/genital/breasts/O = usr.getorganslot("breasts")
|
||||
var/obj/item/I = O.equipment
|
||||
usr.put_in_hands(I)
|
||||
O.equipment = null
|
||||
|
||||
|
||||
if(href_list["removeequipmentvagina"])
|
||||
var/obj/item/organ/genital/vagina/O = usr.getorganslot("vagina")
|
||||
var/obj/item/I = O.equipment
|
||||
usr.put_in_hands(I)
|
||||
if(istype(I, /obj/item/portalpanties))
|
||||
var/obj/item/portalpanties/P = I
|
||||
P.remove()
|
||||
O.equipment = null
|
||||
|
||||
if(href_list["removeequipmentbelly"])
|
||||
var/obj/item/organ/genital/belly/O = usr.getorganslot("belly")
|
||||
var/obj/item/I = O.equipment
|
||||
usr.put_in_hands(I)
|
||||
O.equipment = null
|
||||
|
||||
if(href_list["omenu"])
|
||||
usr << browse(null, "window=arousal") //closes the window
|
||||
H.mob_climax()
|
||||
@@ -268,8 +317,6 @@ obj/screen/arousal/proc/kiss()
|
||||
src.visible_message("<span class='notice'>[src] is about to kiss [L]!</span>", \
|
||||
"<span class='notice'>You're attempting to kiss [L]!</span>", \
|
||||
"<span class='notice'>You're attempting to kiss with something!</span>")
|
||||
if(!do_mob(src, L, 2 SECONDS)) //I think two seconds is enough time to pull away if its unwanted.
|
||||
return
|
||||
SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "kissed", /datum/mood_event/kiss) //how cute, affection is nice.
|
||||
//Well done you kissed it/them!
|
||||
src.visible_message("<span class='notice'>[src] kisses [L]!</span>", \
|
||||
@@ -288,7 +335,6 @@ obj/screen/arousal/proc/kiss()
|
||||
to_chat(src, "<span class='warning'>You cannot climax without choosing genitals.</span>")
|
||||
return
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/climaxwith(mob/living/T)
|
||||
|
||||
var/mob/living/carbon/human/L = pick_partner()
|
||||
@@ -313,6 +359,8 @@ obj/screen/arousal/proc/kiss()
|
||||
to_chat(src, "<span class='warning'>You cannot climax without choosing genitals.</span>")
|
||||
return
|
||||
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/climaxover(mob/living/T)
|
||||
|
||||
var/mob/living/carbon/human/L = T
|
||||
@@ -337,6 +385,20 @@ obj/screen/arousal/proc/kiss()
|
||||
to_chat(src, "<span class='warning'>You cannot climax without choosing genitals.</span>")
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/proc/clothesplosion()
|
||||
if(usr.restrained(TRUE))
|
||||
to_chat(usr, "<span class='warning'>You can't do that while restrained!</span>")
|
||||
return
|
||||
var/mob/living/carbon/human/H = src
|
||||
var/items = H.get_contents()
|
||||
for(var/obj/item/W in items)
|
||||
if(W == H.w_uniform || W == H.wear_suit)
|
||||
H.dropItemToGround(W, TRUE)
|
||||
playsound(H.loc, 'sound/items/poster_ripped.ogg', 50, 1)
|
||||
H.visible_message("<span class='boldnotice'>[H] explodes out of their clothes!'</span>")
|
||||
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/impregwith(mob/living/T)
|
||||
|
||||
var/mob/living/carbon/human/L = pick_partner()
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
/datum/export/sweatshop/stool
|
||||
cost = 850
|
||||
unit_name = "custom stool"
|
||||
export_types = list(/obj/item/processed/wood/stool)
|
||||
|
||||
/datum/export/sweatshop/cushion
|
||||
cost = 300
|
||||
unit_name = "cloth cushion"
|
||||
export_types = list(/obj/item/cushion)
|
||||
|
||||
/datum/export/sweatshop/cushionsilk
|
||||
cost = 500
|
||||
unit_name = "silk cushion"
|
||||
export_types = list(/obj/item/cushion)
|
||||
|
||||
/datum/export/sweatshop/stool/cushioncloth
|
||||
cost = 1800
|
||||
unit_name = "cushioned stool (cloth)"
|
||||
export_types = list(/obj/item/processed/wood/stoolcloth)
|
||||
|
||||
/datum/export/sweatshop/stool/cushionsilk
|
||||
cost = 2400
|
||||
unit_name = "cushioned stool (cloth)"
|
||||
export_types = list(/obj/item/processed/wood/stoolsilk)
|
||||
@@ -0,0 +1,7 @@
|
||||
/datum/supply_pack/service/stripperpole
|
||||
name = "Stripper Pole Crate"
|
||||
desc = "No private bar is complete without a stripper pole, show off the goods! Comes with a ready-to-assemble stripper pole, and a complementary wrench to get things set up!"
|
||||
cost = 3550
|
||||
contains = list(/obj/item/polepack/,
|
||||
/obj/item/wrench/)
|
||||
crate_name = "stripper pole crate"
|
||||
@@ -0,0 +1,6 @@
|
||||
/obj/item/processed/metal
|
||||
name = "Heated Metal"
|
||||
desc = "A malleable metal, able to be cut into nails."
|
||||
icon = 'hyperstation/icons/obj/cargo/sweatshop/metal.dmi'
|
||||
icon_state = "metal"
|
||||
sharpness = TRUE
|
||||
@@ -0,0 +1,256 @@
|
||||
//THE TOOLS
|
||||
/obj/item/carpentry
|
||||
name = "carpentry"
|
||||
desc = "You shouldn't be seeing this!"
|
||||
icon = 'hyperstation/icons/obj/cargo/sweatshop/sweatshop.dmi'
|
||||
usesound = list('sound/effects/picaxe1.ogg', 'sound/effects/picaxe2.ogg', 'sound/effects/picaxe3.ogg')
|
||||
|
||||
/obj/item/carpentry/handsaw
|
||||
name = "handsaw"
|
||||
desc = "A shoddy tool used to process wood into smaller segments."
|
||||
icon_state = "handsaw"
|
||||
slot_flags = ITEM_SLOT_BACK
|
||||
force = 8
|
||||
sharpness = TRUE
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
materials = list(MAT_METAL=50)
|
||||
attack_verb = list("slashed", "sawed")
|
||||
|
||||
/obj/item/carpentry/hammer
|
||||
name = "hammer"
|
||||
desc = "A tool used to manually bash nails into place."
|
||||
icon_state = "hammer"
|
||||
slot_flags = ITEM_SLOT_BELT
|
||||
force = 7
|
||||
sharpness = FALSE
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
materials = list(MAT_METAL=100)
|
||||
attack_verb = list("bonked", "nailed")
|
||||
|
||||
/obj/item/carpentry/glue
|
||||
name = "glue"
|
||||
desc = "Used to haphazardly stick things together; secured by the toughest Monkey Glue(TM)."
|
||||
icon_state = "glue"
|
||||
force = 0
|
||||
sharpness = FALSE
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
materials = list(MAT_PLASTIC=25)
|
||||
attack_verb = list("glued", "coughed")
|
||||
|
||||
/obj/item/carpentry/borer
|
||||
name = "manual borer"
|
||||
desc = "An incredibly awful tool used to manually drill holes into something... Surely there's a better option."
|
||||
icon_state = "borer"
|
||||
force = 3
|
||||
sharpness = TRUE
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
materials = list(MAT_METAL=25)
|
||||
attack_verb = list("bored", "drilled")
|
||||
|
||||
/obj/item/carpentry/sandpaper
|
||||
name = "sandpaper strip"
|
||||
desc = "A strip of sandpaper, commonly used for sanding down rough surfaces into a more smooth shape."
|
||||
icon_state = "sandpaper"
|
||||
force = 1
|
||||
sharpness = FALSE
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
materials = list(MAT_GLASS=1) //lmao
|
||||
attack_verb = list("sanded", "licked")
|
||||
|
||||
/obj/item/nails
|
||||
name = "metal nails"
|
||||
desc = "A bunch of nails, used for hammering into things."
|
||||
icon = 'hyperstation/icons/obj/cargo/sweatshop/sweatshop.dmi'
|
||||
icon_state = "nails"
|
||||
force = 0
|
||||
sharpness = TRUE
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
materials = list(MAT_METAL=10)
|
||||
attack_verb = list("nailed", "screwed")
|
||||
|
||||
/obj/item/cushion
|
||||
name = "basic cushion"
|
||||
desc = "Beats sitting on the floor."
|
||||
icon = 'hyperstation/icons/obj/cargo/sweatshop/cloth.dmi'
|
||||
icon_state = "clothcushion"
|
||||
force = 0
|
||||
sharpness = FALSE
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
attack_verb = list("thomped", "thwacked")
|
||||
|
||||
/obj/item/cushion/silk
|
||||
name = "silk cushion"
|
||||
desc = "How'd it turn red?!"
|
||||
icon_state = "silkcushion"
|
||||
|
||||
//BASIC RECIPES - To do, add sound. As well as refactor everything in a more smart way so we can add the possibility of multiple wood types in the future.
|
||||
//saw a plank into two platforms
|
||||
/obj/item/processed/wood/plank/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/carpentry/handsaw))
|
||||
to_chat(user,"<span class='notice'> You begin to saw [src] in half...</span>")
|
||||
if(do_after(user, 40) && isturf(loc))
|
||||
new src.sawobj(loc)
|
||||
new src.sawobj(loc) //send help i dont know how to make two in the same line lmfao
|
||||
to_chat(user, "<span class='notice'> You saw [src] in half.</span>")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to hold still to saw [src]!</span>")
|
||||
else
|
||||
..()
|
||||
//saw a platform into four blocks
|
||||
/obj/item/processed/wood/platform/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/carpentry/handsaw))
|
||||
to_chat(user,"<span class='notice'> You begin cut [src] into smaller pieces...</span>")
|
||||
if(do_after(user, 20) && isturf(loc))
|
||||
new src.sawobj(loc)
|
||||
new src.sawobj(loc)
|
||||
new src.sawobj(loc)
|
||||
new src.sawobj(loc)
|
||||
to_chat(user, "<span class='notice'> You cut [src] into four pieces.</span>")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to hold still to saw [src]!</span>")
|
||||
else
|
||||
..()
|
||||
//sand a block into a peg
|
||||
/obj/item/processed/wood/block/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/carpentry/sandpaper))
|
||||
to_chat(user,"<span class='notice'> You carefully begin to sand down [src]...</span>")
|
||||
if(do_after(user, 50) && isturf(loc))
|
||||
new src.sandobj(loc)
|
||||
to_chat(user, "<span class='notice'> You smooth [src] into a peg.</span>")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to hold still to sand [src]!</span>")
|
||||
else
|
||||
..()
|
||||
//cut heated metal into nails
|
||||
/obj/item/processed/metal/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/wirecutters))
|
||||
to_chat(user,"<span class='notice'> You tediously begin to cut [src] into several nails...</span>")
|
||||
if(do_after(user, 80) && isturf(loc))
|
||||
new /obj/item/nails(loc)
|
||||
new /obj/item/nails(loc)
|
||||
to_chat(user, "<span class='notice'> You make some crude metal nails.</span>")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to hold still to process [src]!</span>")
|
||||
else
|
||||
..()
|
||||
|
||||
//Covered in glue
|
||||
//cover a wooden block in glue
|
||||
/obj/item/processed/wood/block/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/carpentry/glue))
|
||||
to_chat(user,"<span class='notice'> You begin to glue down one end of [src]...</span>")
|
||||
if(do_after(user, 10) && isturf(loc))
|
||||
new src.glueobj(loc)
|
||||
to_chat(user, "<span class='notice'> You slap some glue onto [src].</span>")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to hold still to glue [src]!</span>")
|
||||
else
|
||||
..()
|
||||
//cover a wooden peg in glue
|
||||
/obj/item/processed/wood/peg/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/carpentry/glue))
|
||||
to_chat(user,"<span class='notice'> You begin to glue down one end of the [src]...</span>")
|
||||
if(do_after(user, 10) && isturf(loc))
|
||||
new src.glueobj(loc)
|
||||
to_chat(user, "<span class='notice'> You slap some glue onto [src].</span>")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to hold still to glue [src]!</span>")
|
||||
else
|
||||
..()
|
||||
|
||||
//Seats
|
||||
//bore a platform into a seat
|
||||
/obj/item/processed/wood/platform/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/carpentry/borer))
|
||||
to_chat(user,"<span class='notice'> You begin to cut four holes into [src]...</span>")
|
||||
if(do_after(user, 40) && isturf(loc))
|
||||
new src.boreobj(loc)
|
||||
to_chat(user, "<span class='notice'> You drill four holes into [src].</span>")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to hold still to refine [src]!</span>")
|
||||
else
|
||||
..()
|
||||
|
||||
//Stools - Further crafting
|
||||
/obj/item/processed/wood/stool1/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/nails))
|
||||
to_chat(user,"<span class='notice'> You place nails into [src]...</span>")
|
||||
if(do_after(user, 20) && isturf(loc))
|
||||
new /obj/item/processed/wood/stool2(loc)
|
||||
to_chat(user, "<span class='notice'> The nails are ready to be hammered.</span>")
|
||||
qdel(src)
|
||||
qdel(I)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to hold still to refine [src]!</span>")
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/processed/wood/stool2/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/carpentry/hammer))
|
||||
to_chat(user,"<span class='notice'> You begin to hammer the [src]...</span>")
|
||||
if(do_after(user, 30) && isturf(loc))
|
||||
new /obj/item/processed/wood/stool3(loc)
|
||||
to_chat(user, "<span class='notice'> The nails are hammered into place.</span>")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to hold still to refine [src]!</span>")
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/processed/wood/stool3/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/carpentry/sandpaper))
|
||||
to_chat(user,"<span class='notice'> You begin to sand the [src]...</span>")
|
||||
if(do_after(user, 30) && isturf(loc))
|
||||
new /obj/item/processed/wood/stool4(loc)
|
||||
to_chat(user, "<span class='notice'> You sand down the [src].</span>")
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to hold still to refine [src]!</span>")
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/processed/wood/stool4/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/processed/wood/glueblock))
|
||||
to_chat(user,"<span class='notice'> You add some finishing touches to the [src]...</span>")
|
||||
if(do_after(user, 30) && isturf(loc))
|
||||
new /obj/item/processed/wood/stool(loc)
|
||||
to_chat(user, "<span class='notice'> You complete the [src].</span>")
|
||||
qdel(src)
|
||||
qdel(I)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to hold still to refine [src]!</span>")
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/processed/wood/stool/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/cushion))
|
||||
to_chat(user,"<span class='notice'> You secure a cloth cushion to [src]...</span>")
|
||||
if(do_after(user, 30) && isturf(loc))
|
||||
new /obj/item/processed/wood/stoolcloth(loc)
|
||||
to_chat(user, "<span class='notice'> You add a cushion to [src].</span>")
|
||||
qdel(src)
|
||||
qdel(I)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to hold still to detail [src]!</span>")
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/processed/wood/stool/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/cushion/silk))
|
||||
to_chat(user,"<span class='notice'> You secure a silk cushion to [src]...</span>")
|
||||
if(do_after(user, 30) && isturf(loc))
|
||||
new /obj/item/processed/wood/stoolsilk(loc)
|
||||
to_chat(user, "<span class='notice'> You add a cushion to [src].</span>")
|
||||
qdel(src)
|
||||
qdel(I)
|
||||
else
|
||||
to_chat(user, "<span class='warning'>You need to hold still to detail [src]!</span>")
|
||||
else
|
||||
..()
|
||||
@@ -0,0 +1,128 @@
|
||||
//WOODEN COMPONENTS. honestly i need to move some shit around to allow for easier material swapping, but that's for a later date.
|
||||
|
||||
/obj/item/processed/wood
|
||||
name = "Wooden Processed Item"
|
||||
desc = "You shouldn't see this!"
|
||||
icon = 'hyperstation/icons/obj/cargo/sweatshop/wooden.dmi'
|
||||
sharpness = FALSE
|
||||
attack_verb = list("slapped", "thunked")
|
||||
var/sawobj = /obj/item/condom
|
||||
var/glueobj = /obj/item/dildo
|
||||
var/sandobj = /obj/item/carpentry/sandpaper
|
||||
var/boreobj = /obj/item/carpentry/borer
|
||||
|
||||
/obj/item/processed/wood/plank
|
||||
name = "processable wooden plank"
|
||||
desc = "A somewhat sturdy refined plank. This can be used in various applications."
|
||||
icon_state = "plank"
|
||||
force = 3
|
||||
w_class = WEIGHT_CLASS_HUGE
|
||||
sawobj = /obj/item/processed/wood/platform
|
||||
|
||||
/obj/item/processed/wood/platform
|
||||
name = "wood platform"
|
||||
desc = "A somewhat sturdy cropping of a plank. This one is an alright foundation for chairs and stools."
|
||||
icon_state = "platform"
|
||||
force = 3
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
sawobj = /obj/item/processed/wood/block
|
||||
boreobj = /obj/item/processed/wood/seat
|
||||
|
||||
/obj/item/processed/wood/block
|
||||
name = "wood block"
|
||||
desc = "A chopped platform into a wooden block. This one can be used for sanded into pegs, or used as a base on it's own."
|
||||
icon_state = "block"
|
||||
force = 2
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
sandobj = /obj/item/processed/wood/peg
|
||||
glueobj = /obj/item/processed/wood/glueblock
|
||||
|
||||
/obj/item/processed/wood/peg
|
||||
name = "wood peg"
|
||||
desc = "A wooden peg. Useful for fitting into holes."
|
||||
icon_state = "peg"
|
||||
force = 1
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
attack_verb = list("donked", "thunked")
|
||||
glueobj = /obj/item/processed/wood/gluepeg
|
||||
|
||||
//glue
|
||||
|
||||
/obj/item/processed/wood/gluepeg
|
||||
name = "glued wood peg"
|
||||
desc = "A wooden peg. With a bunch of glue used for securing."
|
||||
icon_state = "gluepeg"
|
||||
force = 1
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
attack_verb = list("pegged", "thunked")
|
||||
|
||||
/obj/item/processed/wood/glueblock
|
||||
name = "glued wood block"
|
||||
desc = "A wooden block. With a bunch of glue used for securing."
|
||||
icon_state = "glueblock"
|
||||
force = 2
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
attack_verb = list("blocked", "thunked")
|
||||
|
||||
//seat
|
||||
/obj/item/processed/wood/seat
|
||||
name = "wood seat"
|
||||
desc = "A baseline for crafting seats. Not exactly that comfortable to sit on..."
|
||||
icon_state = "seat"
|
||||
force = 2
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
attack_verb = list("slapped", "thunked")
|
||||
|
||||
|
||||
//Stool steps. There's probably an easier way to do this, but I cannot be assed rn, I'll refine after PR
|
||||
/obj/item/processed/wood/stool1
|
||||
name = "stool base"
|
||||
desc = "A haphazardly made base for a stool. It's not even secured with any nails."
|
||||
icon_state = "stool1"
|
||||
force = 4
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
|
||||
/obj/item/processed/wood/stool2
|
||||
name = "nailed stool base"
|
||||
desc = "Nails are in position"
|
||||
icon_state = "stool2"
|
||||
force = 4
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
|
||||
/obj/item/processed/wood/stool3
|
||||
name = "hammered stool base"
|
||||
desc = "A vaguely stool-shaped... Thing. Could use some sandpaper."
|
||||
icon_state = "stool3"
|
||||
force = 4
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
|
||||
/obj/item/processed/wood/stool4
|
||||
name = "bland stool"
|
||||
desc = "A rather bland stool."
|
||||
icon_state = "stool4"
|
||||
force = 4
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
|
||||
//The finished product
|
||||
/obj/item/processed/wood/stool
|
||||
name = "custom stool"
|
||||
desc = "An intricite, custom stool."
|
||||
icon_state = "stool"
|
||||
force = 10
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
|
||||
//Let's make it soft and more expensive
|
||||
|
||||
/obj/item/processed/wood/stoolcloth
|
||||
name = "cloth-cushioned stool"
|
||||
desc = "A custom stool with a cloth cushion."
|
||||
icon_state = "stoolcloth"
|
||||
force = 10
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
|
||||
/obj/item/processed/wood/stoolsilk
|
||||
name = "cloth-cushioned stool"
|
||||
desc = "A custom stool with a silk cushion."
|
||||
icon_state = "stoolsilk"
|
||||
force = 11 //lol
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
@@ -0,0 +1,13 @@
|
||||
/obj/item/clothing/gloves/guncaster
|
||||
name = "fingerless leather gloves"
|
||||
desc = "Sturdy leather gloves with no fingertips, buckled at the wrist."
|
||||
icon_state = "guncaster"
|
||||
item_state = "guncaster"
|
||||
icon = 'hyperstation/icons/obj/clothing/gloves.dmi'
|
||||
alternate_worn_icon = 'hyperstation/icons/mobs/gloves.dmi'
|
||||
item_color = null //So they don't wash.
|
||||
transfer_prints = TRUE
|
||||
strip_delay = 40
|
||||
equip_delay_other = 20
|
||||
cold_protection = HANDS
|
||||
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
|
||||
@@ -37,3 +37,133 @@
|
||||
SEND_SOUND(user, sound('hyperstation/sound/halflife/hevsuit_firstpickup.ogg', volume = 50))
|
||||
SEND_SOUND(user, sound('hyperstation/sound/halflife/anomalous_materials.ogg', volume = 50))
|
||||
return
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/shielded/goldenpa
|
||||
name = "Kinaris Power Armor"
|
||||
desc = "An advanced armor with built in energy shielding, developed by Kinaris via unknown means. It belongs by only few exclusive members of the corporation."
|
||||
icon_state = "golden_pa"
|
||||
item_state = "golden_pa"
|
||||
max_charges = 4
|
||||
current_charges = 4
|
||||
recharge_delay = 15
|
||||
armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
|
||||
strip_delay = 130
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/goldenpa
|
||||
slowdown = 0
|
||||
tauric = TRUE //Citadel Add for tauric hardsuits
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/shielded/goldenpa/Initialize()
|
||||
jetpack = new /obj/item/tank/jetpack/suit(src)
|
||||
. = ..()
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/shielded/goldenpa
|
||||
name = "Kinaris Power Helmet"
|
||||
desc = "An advanced armor helmet with built in energy shielding, developed by Kinaris via unknown means. It belongs by only few exclusive members of the corporation."
|
||||
icon_state = "hardsuit0-goldenpa"
|
||||
item_state = "hardsuit0-goldenpa"
|
||||
item_color = "goldenpa"
|
||||
armor = list("melee" = 80, "bullet" = 80, "laser" = 50, "energy" = 50, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100)
|
||||
strip_delay = 130
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/teslapa
|
||||
name = "Tesla Power Armor"
|
||||
desc = "An advanced power armor, with built-in tesla technology. You're sure this will fry whoever dares attack in close quarters."
|
||||
icon_state = "tesla_pa"
|
||||
item_state = "tesla_pa"
|
||||
item_color = "tesla_pa"
|
||||
armor = list("melee" = 70, "bullet" = 70, "laser" = 90, "energy" = 90, "bomb" = 70, "bio" = 100, "rad" = 40, "fire" = 100, "acid" = 100)
|
||||
strip_delay = 300
|
||||
equip_delay_self = 300
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/teslapahelmet
|
||||
slowdown = 1
|
||||
siemens_coefficient = -1
|
||||
blood_overlay_type = "armor"
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
hit_reaction_chance = 50
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
var/teslapa_cooldown = 20
|
||||
var/teslapa_cooldown_duration = 10
|
||||
var/tesla_power = 20000
|
||||
var/tesla_range = 4
|
||||
var/tesla_flags = TESLA_MOB_DAMAGE | TESLA_OBJ_DAMAGE
|
||||
var/legacy = FALSE
|
||||
var/legacy_dmg = 35
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/teslapa/Initialize()
|
||||
jetpack = new /obj/item/tank/jetpack/suit(src)
|
||||
. = ..()
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/teslapa/dropped(mob/user)
|
||||
..()
|
||||
if(istype(user))
|
||||
user.flags_1 &= ~TESLA_IGNORE_1
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/teslapa/equipped(mob/user, slot)
|
||||
..()
|
||||
if(slot_flags & slotdefine2slotbit(slot)) //Was equipped to a valid slot for this item?
|
||||
user.flags_1 |= TESLA_IGNORE_1
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/teslapa/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
|
||||
if(prob(hit_reaction_chance))
|
||||
if(world.time < teslapa_cooldown_duration)
|
||||
var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
|
||||
sparks.set_up(1, 1, src)
|
||||
sparks.start()
|
||||
owner.visible_message("<span class='danger'>The tesla capacitors on [owner]'s Tesla Power Armor are still recharging! The armor merely emits some sparks.</span>")
|
||||
return
|
||||
owner.visible_message("<span class='danger'>[src] blocks [attack_text], sending out arcs of lightning!</span>")
|
||||
if(!legacy)
|
||||
tesla_zap(owner, tesla_range, tesla_power, tesla_flags)
|
||||
else
|
||||
for(var/mob/living/M in view(2, owner))
|
||||
if(M == owner)
|
||||
continue
|
||||
owner.Beam(M,icon_state="purple_lightning",icon='icons/effects/effects.dmi',time=5)
|
||||
M.adjustFireLoss(legacy_dmg)
|
||||
playsound(M, 'sound/machines/defib_zap.ogg', 50, 1, -1)
|
||||
teslapa_cooldown = world.time + teslapa_cooldown_duration
|
||||
return TRUE
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/teslapahelmet
|
||||
name = "Tesla Power Armor Helmet"
|
||||
desc = "An advanced power armor, with built-in tesla technology. You're sure this will fry whoever dares attack in close quarters."
|
||||
icon_state = "teslaup"
|
||||
item_state = "teslaup"
|
||||
armor = list("melee" = 70, "bullet" = 70, "laser" = 90, "energy" = 90, "bomb" = 70, "bio" = 100, "rad" = 10, "fire" = 100, "acid" = 100)
|
||||
strip_delay = 130
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/advancedpa
|
||||
name = "Advanced Power Armor"
|
||||
desc = "An advanced power armor. You're sure this is near to impossible to penetrate in close quarters."
|
||||
icon_state = "advanced_pa"
|
||||
item_state = "advanced_pa"
|
||||
item_color = "advanced_pa"
|
||||
armor = list("melee" = 95, "bullet" = 95, "laser" = 70, "energy" = 80, "bomb" = 70, "bio" = 100, "rad" = 40, "fire" = 100, "acid" = 100)
|
||||
strip_delay = 300 //chonky armor means chonky strip
|
||||
equip_delay_self = 300
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/advancedpahelmet
|
||||
slowdown = 0
|
||||
blood_overlay_type = "armor"
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/advancedpa/Initialize()
|
||||
jetpack = new /obj/item/tank/jetpack/suit(src)
|
||||
. = ..()
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/advancedpahelmet
|
||||
name = "Advanced Power Armor Helmet"
|
||||
desc = "An advanced power armor. You're sure this is almost impenetrable in close quarters."
|
||||
icon_state = "adv_pa"
|
||||
item_state = "adv_pa"
|
||||
armor = list("melee" = 95, "bullet" = 90, "laser" = 70, "energy" = 80, "bomb" = 70, "bio" = 100, "rad" = 40, "fire" = 100, "acid" = 100)
|
||||
strip_delay = 300
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
|
||||
@@ -5,5 +5,20 @@
|
||||
item_state = "kaminacape"
|
||||
body_parts_covered = 0
|
||||
icon = 'hyperstation/icons/obj/clothing/suits.dmi'
|
||||
alternate_worn_icon = 'hyperstation/icons/mob/suit.dmi'
|
||||
alternate_worn_icon = 'hyperstation/icons/mobs/suits.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/suit/gcvest
|
||||
name = "\improper Guncaster's Vest"
|
||||
desc = "An open leather vest with battlescarred metal shoulderpads, perfect for hunting interdimensional wazards. Smells of gunpowder and plasma."
|
||||
icon_state = "guncaster"
|
||||
item_state = "guncaster"
|
||||
icon = 'hyperstation/icons/obj/clothing/suits.dmi'
|
||||
alternate_worn_icon = 'hyperstation/icons/mobs/suits.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
/obj/item/clothing/suit/gcvest/alt
|
||||
name = "\improper Hellraider's Vest"
|
||||
desc = "An open leather vest with battlescarred metal shoulderpads, discovered in a dimensional anomaly. Smells of gunpowder and plasma."
|
||||
icon_state = "guncaster_alt"
|
||||
item_state = "guncaster_alt"
|
||||
@@ -0,0 +1,9 @@
|
||||
/obj/item/clothing/under/lumberjack
|
||||
name = "lumberjack outfit"
|
||||
desc = "I am a lumberjack and I am ok, I sleep all night and I work all day."
|
||||
icon = 'hyperstation/icons/obj/clothing/suits.dmi'
|
||||
alternate_worn_icon = 'hyperstation/icons/mobs/suits.dmi'
|
||||
icon_state = "lumberjack"
|
||||
item_state = "lumberjack"
|
||||
can_adjust = FALSE
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
@@ -9,3 +9,38 @@
|
||||
name = "Penis Milking Machine"
|
||||
reqs = list(/obj/item/stack/cable_coil = 5, /obj/item/stack/rods = 1, /obj/item/stack/sheet/cardboard = 1, /obj/item/reagent_containers/glass/beaker/large = 1, /obj/item/stock_parts/manipulator = 1)
|
||||
result = /obj/item/milking_machine/penis
|
||||
|
||||
//to do: put carpentry in it's own crafting tab
|
||||
/datum/crafting_recipe/weak_metal
|
||||
name = "Heated Metal"
|
||||
reqs = list(/obj/item/stack/sheet/metal = 5)
|
||||
tools = list(TOOL_WELDER)
|
||||
category = CAT_MISC
|
||||
result = /obj/item/processed/metal
|
||||
|
||||
/datum/crafting_recipe/processed_wood
|
||||
name = "Processable Wood"
|
||||
reqs = list(/obj/item/stack/sheet/mineral/wood = 5)
|
||||
tools = list(TOOL_WIRECUTTER, TOOL_WELDER)
|
||||
category = CAT_MISC
|
||||
result = /obj/item/processed/wood/plank
|
||||
|
||||
/datum/crafting_recipe/stool_base
|
||||
name = "Stool Base"
|
||||
reqs = list(/obj/item/processed/wood/seat = 1, /obj/item/processed/wood/gluepeg = 4)
|
||||
category = CAT_MISC
|
||||
result = /obj/item/processed/wood/stool1
|
||||
|
||||
/datum/crafting_recipe/clothcushion
|
||||
name = "Cloth Cushion"
|
||||
reqs = list(/obj/item/stack/sheet/cloth = 2, /obj/item/stack/sheet/cotton = 5)
|
||||
tools = list(TOOL_WIRECUTTER)
|
||||
category = CAT_MISC
|
||||
result = /obj/item/cushion
|
||||
|
||||
/datum/crafting_recipe/silkcushion
|
||||
name = "Silk Cushion"
|
||||
reqs = list(/obj/item/stack/sheet/silk = 2, /obj/item/stack/sheet/cotton = 5)
|
||||
tools = list(TOOL_WIRECUTTER)
|
||||
category = CAT_MISC
|
||||
result = /obj/item/cushion/silk
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
#define DUMPTIME 3000
|
||||
|
||||
/datum/bank_account
|
||||
var/account_holder = "Some pleb"
|
||||
var/account_balance = 0
|
||||
var/account_offstation_balance = 0
|
||||
var/account_pin = 0
|
||||
var/account_dna = ""
|
||||
var/datum/job/account_job
|
||||
var/list/bank_cards = list()
|
||||
var/add_to_accounts = TRUE
|
||||
var/transferable = TRUE
|
||||
var/account_id
|
||||
var/withdrawDelay = 0
|
||||
|
||||
/datum/bank_account/New(newname, job)
|
||||
if(add_to_accounts)
|
||||
if(!SSeconomy)
|
||||
log_world("Wack")
|
||||
SSeconomy.bank_accounts += src
|
||||
account_holder = newname
|
||||
account_job = job
|
||||
account_id = rand(111111,999999)
|
||||
|
||||
/datum/bank_account/Destroy()
|
||||
if(add_to_accounts)
|
||||
SSeconomy.bank_accounts -= src
|
||||
return ..()
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
/obj/item/pen/attack(mob/living/M, mob/user,stealth)
|
||||
if(!istype(M))
|
||||
return
|
||||
|
||||
if(!force)
|
||||
if(M.can_inject(user, 1))
|
||||
if(user.a_intent == "harm") //old poke requires harm intent.
|
||||
to_chat(user, "<span class='warning'>You stab [M] with the pen.</span>")
|
||||
if(!stealth)
|
||||
to_chat(M, "<span class='danger'>You feel a tiny prick!</span>")
|
||||
. = 1
|
||||
|
||||
else //writing time
|
||||
var/mob/living/carbon/human/T = M
|
||||
if(!T) //not human.
|
||||
return
|
||||
if(!T.is_chest_exposed())
|
||||
to_chat(user, "<span class='warning'>You cannot write on someone with their clothes on.</span>")
|
||||
return
|
||||
|
||||
var/writting = input(user, "Add writing, doesn't replace current text", "Writing on [T]") as text|null
|
||||
if(!writting)
|
||||
return
|
||||
|
||||
var/obj/item/bodypart/BP = T.get_bodypart(user.zone_selected)
|
||||
|
||||
if(!(user==T))
|
||||
src.visible_message("<span class='notice'>[user] begins to write on [T]'s [BP.name].</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You begin to write on your [BP.name].</span>")
|
||||
|
||||
if(do_mob(user, T, 4 SECONDS))
|
||||
if((length(BP.writtentext))+(length(writting)) < 100) //100 character limmit to stop spamming.
|
||||
BP.writtentext += html_encode(writting) //you can add to text, not remove it.
|
||||
else
|
||||
to_chat(user, "<span class='notice'>There isnt enough space to write that on [T]'s [BP.name].</span>")
|
||||
return
|
||||
|
||||
if(!(user==T))
|
||||
to_chat(user, "<span class='notice'>You write on [T]'s [BP.name].</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You write on your [BP.name].</span>")
|
||||
else
|
||||
. = ..()
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
/datum/reagent/consumable/alienhoney //for players who want bee character bewbs that produce honey.
|
||||
name = "alien honey"
|
||||
description = "Sweet honey that came from a alien source. This honey doesn't possess the same healing or nutrition properties as earth-bound bee honey."
|
||||
color = "#d3a308"
|
||||
value = 3 //plentiful, so wouldnt be worth as much.
|
||||
nutriment_factor = 5 * REAGENTS_METABOLISM
|
||||
metabolization_rate = 1 * REAGENTS_METABOLISM
|
||||
taste_description = "sweetness"
|
||||
|
||||
/datum/reagent/consumable/alienhoney/on_mob_life(mob/living/carbon/M)
|
||||
..()
|
||||
@@ -0,0 +1,294 @@
|
||||
/*
|
||||
* If you ever decide to add more reactions, please remember to keep these
|
||||
* in alphabetical order, according to reagent names and not their datums.
|
||||
* It could be hard to find reactions when code diving.
|
||||
* Due note, unlike before this change, that subtypes will apply to the tray the same as their parents
|
||||
* -DT
|
||||
*/
|
||||
|
||||
#define DEFAULT_ACT_MUTAGEN switch(rand(100)){\
|
||||
if(91 to 100){\
|
||||
T.adjustHealth(-10);\
|
||||
to_chat(user, "<span class='warning'>The plant shrivels and burns.</span>");}\
|
||||
if(81 to 90)\
|
||||
T.mutatespecie();\
|
||||
if(66 to 80)\
|
||||
T.hardmutate();\
|
||||
if(41 to 65)\
|
||||
T.mutate();\
|
||||
if(21 to 41)\
|
||||
to_chat(user, "<span class='notice'>The plants don't seem to react...</span>");\
|
||||
if(11 to 20)\
|
||||
T.mutateweed();\
|
||||
if(1 to 10)\
|
||||
T.mutatepest(user);\
|
||||
else\
|
||||
to_chat(user, "<span class='notice'>Nothing happens...</span>");}
|
||||
|
||||
//Ammonia
|
||||
/datum/reagent/ammonia/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustHealth(round(volume * 0.5))
|
||||
T.adjustNutri(round(volume * 1))
|
||||
if(..())
|
||||
T.myseed.adjust_yield(round(volume * 0.01))
|
||||
return 1
|
||||
|
||||
//Ash
|
||||
/datum/reagent/ash/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
// Ash is used IRL in gardening, as a fertilizer enhancer and weed killer
|
||||
T.adjustHealth(round(volume * 0.25))
|
||||
T.adjustNutri(round(volume * 0.5))
|
||||
T.adjustWeeds(-round(volume / 10))
|
||||
return 1
|
||||
|
||||
//Beer
|
||||
/datum/reagent/consumable/ethanol/beer/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
// Beer is a chemical composition of alcohol and various other things. It's a shitty nutrient but hey, it's still one. Also alcohol is bad, mmmkay?
|
||||
T.adjustHealth(-round(volume * 0.05))
|
||||
T.adjustNutri(round(volume * 0.25))
|
||||
T.adjustWater(round(volume * 0.7))
|
||||
return 1
|
||||
|
||||
//Blood
|
||||
/datum/reagent/blood/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustNutri(round(volume * 0.6))
|
||||
T.adjustHealth(-round(volume))
|
||||
T.adjustPests(rand(2,4)) //they HUNGER
|
||||
return 1
|
||||
|
||||
//Charcoal
|
||||
/datum/reagent/medicine/charcoal/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustToxic(-round(volume * 2)) //Antitoxin binds shit pretty well. So the tox goes significantly down
|
||||
return 1
|
||||
|
||||
//Chlorine
|
||||
/datum/reagent/chlorine/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustHealth(-round(volume * 1))
|
||||
T.adjustToxic(round(volume * 1.5))
|
||||
T.adjustWater(-round(volume * 0.5))
|
||||
T.adjustWeeds(-rand(1,volume * 0.125))
|
||||
return 1
|
||||
|
||||
//Diethylamine
|
||||
/datum/reagent/diethylamine/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
//Corrosive to pests, but not to plants
|
||||
if(..())
|
||||
T.myseed.adjust_yield(round(volume * 0.02))
|
||||
T.adjustHealth(round(volume))
|
||||
T.adjustNutri(round(volume * 2))
|
||||
T.adjustPests(-rand(1,round(volume / 30)))
|
||||
return 1
|
||||
|
||||
//Earthsblood
|
||||
/datum/reagent/medicine/earthsblood/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.self_sufficiency_progress += volume
|
||||
if(T.self_sufficiency_progress >= T.self_sufficiency_req)
|
||||
T.become_self_sufficient()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[T] warms as it might on a spring day under a genuine Sun.</span>")
|
||||
return 1
|
||||
|
||||
//Enduro-Grow
|
||||
/datum/reagent/plantnutriment/endurogrow/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
if(!..())
|
||||
return -1
|
||||
T.myseed.adjust_potency(-round(volume / 10))
|
||||
T.myseed.adjust_yield(-round(volume / 30))
|
||||
T.myseed.adjust_endurance(round(volume / 30))
|
||||
return 1
|
||||
|
||||
//E-Z Nutrient
|
||||
/datum/reagent/plantnutriment/eznutriment/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.yieldmod = 1
|
||||
T.mutmod = 1
|
||||
return ..()
|
||||
|
||||
//Flourine
|
||||
/datum/reagent/fluorine/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
// Fluorine one of the most corrosive and deadly gasses
|
||||
T.adjustHealth(-round(volume * 2))
|
||||
T.adjustToxic(round(volume * 2.5))
|
||||
T.adjustWater(-round(volume * 0.5))
|
||||
T.adjustWeeds(-rand(1, volume * 0.25))
|
||||
return 1
|
||||
|
||||
//Fluorosulfuric acid
|
||||
/datum/reagent/toxin/acid/fluacid/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustHealth(-round(volume * 2))
|
||||
T.adjustToxic(round(volume * 3))
|
||||
T.adjustWeeds(-rand(1,volume * 0.5))
|
||||
return 1
|
||||
|
||||
//Holy Water
|
||||
/datum/reagent/water/holywater/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
//Mostly the same as water, it also heals the plant a little with the power of the spirits~
|
||||
T.adjustWater(round(volume))
|
||||
T.adjustHealth(round(volume * 0.1))
|
||||
return 1
|
||||
|
||||
//Left-4-Zed
|
||||
/datum/reagent/plantnutriment/left4zednutriment/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.yieldmod = 0
|
||||
T.mutmod = 2
|
||||
return ..()
|
||||
|
||||
//Liquid Earthquake
|
||||
/datum/reagent/plantnutriment/liquidearthquake/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
if(!..())
|
||||
return -1
|
||||
T.myseed.adjust_weed_chance(round(volume / 10))
|
||||
T.myseed.adjust_weed_rate(round(volume / 30))
|
||||
T.myseed.adjust_production(-round(volume / 30))
|
||||
return 1
|
||||
|
||||
//Milk
|
||||
/datum/reagent/consumable/milk/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustNutri(round(volume * 0.2))
|
||||
T.adjustWater(round(volume * 0.5))
|
||||
if(..()) // Milk is good for humans, but bad for plants. The sugars canot be used by plants, and the milk fat fucks up growth.
|
||||
if(!T.myseed.get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism)) //Not shrooms though
|
||||
T.adjustHealth(-round(volume / 2))
|
||||
return 1
|
||||
|
||||
//Napalm
|
||||
/datum/reagent/napalm/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
if(..())
|
||||
if(T.myseed.resistance_flags & FIRE_PROOF)
|
||||
return 1
|
||||
T.adjustHealth(-round(volume * 6))
|
||||
T.adjustToxic(round(volume * 7))
|
||||
T.adjustWeeds(-rand(5,9))
|
||||
return 1
|
||||
|
||||
//Nutriment
|
||||
/datum/reagent/consumable/nutriment/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
//Compost, effectively
|
||||
T.adjustHealth(round(volume * 0.5))
|
||||
T.adjustNutri(round(volume))
|
||||
return 1
|
||||
|
||||
//Pest Killer
|
||||
/datum/reagent/toxin/pestkiller/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustToxic(round(volume * 0.5))
|
||||
T.adjustPests(-rand(1,volume / 5))
|
||||
return 1
|
||||
|
||||
//Phosphorus
|
||||
/datum/reagent/phosphorus/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
// White Phosphorous + water -> phosphoric acid. That's not a good thing really.
|
||||
// Phosphoric salts are beneficial though. And even if the plant suffers, in the long run the tray gets some nutrients. The benefit isn't worth that much.
|
||||
T.adjustHealth(-round(volume * 0.75))
|
||||
T.adjustNutri(round(volume * 0.1))
|
||||
T.adjustWater(-round(volume * 0.5))
|
||||
T.adjustWeeds(-rand(1, volume * 0.1))
|
||||
return 1
|
||||
|
||||
//Plant-B-Gone
|
||||
/datum/reagent/toxin/plantbgone/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustHealth(-round(volume * 5))
|
||||
T.adjustToxic(round(volume * 6))
|
||||
T.adjustWeeds(-rand(4,8))
|
||||
return 1
|
||||
|
||||
//Plant Base
|
||||
//For subtypes of /datum/reagent/plantnutriment/
|
||||
/datum/reagent/plantnutriment/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustNutri(round(volume))
|
||||
return ..()
|
||||
|
||||
//Radium
|
||||
/datum/reagent/radium/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
if(volume >= 10)
|
||||
DEFAULT_ACT_MUTAGEN
|
||||
else if(volume >= 5)
|
||||
T.hardmutate()
|
||||
else if(volume >= 2)
|
||||
T.mutate()
|
||||
|
||||
T.adjustHealth(-round(volume))
|
||||
T.adjustToxic(round(volume * 3)) // Radium is harsher (OOC: also easier to produce)
|
||||
return 1
|
||||
|
||||
//Robust Harvest
|
||||
/datum/reagent/plantnutriment/robustharvestnutriment/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.yieldmod = 1.3
|
||||
T.mutmod = 0
|
||||
return ..()
|
||||
|
||||
//Saltpetre
|
||||
/datum/reagent/saltpetre/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
// Saltpetre is used for gardening IRL. To simplify highly, it speeds up growth and strengthens plants
|
||||
T.adjustHealth(round(volume * 0.25))
|
||||
if (..())
|
||||
T.myseed.adjust_production(-round(volume/100)-prob(volume%100))
|
||||
T.myseed.adjust_potency(round(volume*0.5))
|
||||
return 1
|
||||
|
||||
//Soda Water
|
||||
/datum/reagent/consumable/sodawater/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
// A variety of nutrients are dissolved in club soda, without sugar.
|
||||
// These nutrients include carbon, oxygen, hydrogen, phosphorous, potassium, sulfur and sodium, all of which are needed for healthy plant growth.
|
||||
T.adjustWater(round(volume) * 0.9)
|
||||
T.adjustHealth(round(volume * 0.1))
|
||||
T.adjustNutri(round(volume * 0.1))
|
||||
return 1
|
||||
|
||||
//Sugar
|
||||
/datum/reagent/consumable/sugar/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustWeeds(round(rand(1, volume / 5)))
|
||||
T.adjustPests(round(rand(1, volume / 5)))
|
||||
return 1
|
||||
|
||||
//Sulphuric Acid
|
||||
/datum/reagent/toxin/acid/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustHealth(-round(volume * 1))
|
||||
T.adjustToxic(round(volume * 1.5))
|
||||
T.adjustWeeds(-rand(1,volume * 0.25))
|
||||
return 1
|
||||
|
||||
//Toxin
|
||||
/datum/reagent/toxin/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustToxic(round(volume * 2))
|
||||
return 1
|
||||
|
||||
//Unstable Mutagen
|
||||
/datum/reagent/toxin/mutagen/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
if(volume >= 5)
|
||||
DEFAULT_ACT_MUTAGEN
|
||||
else if(volume >= 2)
|
||||
T.hardmutate()
|
||||
else if(volume >= 1)
|
||||
T.mutate()
|
||||
return 1
|
||||
|
||||
//Uranium
|
||||
/datum/reagent/uranium/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
if(volume >= 10)
|
||||
DEFAULT_ACT_MUTAGEN
|
||||
else if(volume >= 5)
|
||||
T.hardmutate()
|
||||
else if(volume >= 2)
|
||||
T.mutate()
|
||||
|
||||
T.adjustHealth(-round(volume))
|
||||
T.adjustToxic(round(volume * 2))
|
||||
return 1
|
||||
|
||||
//Virus Food
|
||||
/datum/reagent/toxin/mutagen/mutagenvirusfood/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustNutri(round(volume * 0.5))
|
||||
T.adjustHealth(-round(volume * 0.5))
|
||||
return 1
|
||||
|
||||
//Water
|
||||
/datum/reagent/water/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustWater(round(volume))
|
||||
return 1
|
||||
|
||||
//Weed Killer
|
||||
/datum/reagent/toxin/plantbgone/weedkiller/on_tray(obj/machinery/hydroponics/T, volume, mob/user)
|
||||
T.adjustToxic(round(volume / 2))
|
||||
T.adjustWeeds(-rand(1,volume / 5))
|
||||
return 1
|
||||
|
||||
#undef DEFAULT_ACT_MUTAGEN
|
||||
@@ -0,0 +1,34 @@
|
||||
//This action is technically a duplicate of /action/small_sprite
|
||||
//However, we do our own things...
|
||||
|
||||
/datum/action/sizecode_resize
|
||||
name = "Toggle Giant Sprite"
|
||||
desc = "Others will continue to see you giant."
|
||||
icon_icon = 'icons/mob/screen_gen_old.dmi'
|
||||
button_icon_state = "health1" //You can change this if you want
|
||||
background_icon_state = "bg_alien" //But keep this as a distinct background
|
||||
var/small = FALSE
|
||||
var/image/small_icon
|
||||
|
||||
/datum/action/sizecode_resize/Grant(mob/M, safety=FALSE)
|
||||
if(ishuman(M) && !safety) //this probably gets called before a person gets overlays on roundstart, so try again
|
||||
if(!LAZYLEN(M.overlays))
|
||||
addtimer(CALLBACK(src, .proc/Grant, M, TRUE), 5) //https://www.youtube.com/watch?v=QQ-aYZzlDeo
|
||||
return
|
||||
|
||||
..()
|
||||
if(!owner)
|
||||
return
|
||||
var/image/I = image(icon=owner.icon,icon_state=owner.icon_state,loc=owner,layer=owner.layer,pixel_x=owner.pixel_x,pixel_y=owner.pixel_y)
|
||||
I.overlays += owner.overlays
|
||||
I.override = TRUE
|
||||
small_icon = I
|
||||
|
||||
/datum/action/sizecode_resize/Trigger()
|
||||
..()
|
||||
if(!small)
|
||||
owner.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic, "sizecode_smallsprite", small_icon)
|
||||
else
|
||||
owner.remove_alt_appearance("sizecode_smallsprite")
|
||||
small = !small
|
||||
return TRUE
|
||||
@@ -13,6 +13,8 @@ var/const/RESIZE_MICRO = 0.25
|
||||
var/size_multiplier = 1 //multiplier for the mob's icon size atm
|
||||
var/previous_size = 1
|
||||
|
||||
//Cyanosis - Action that resizes the sprite for the client but nobody else. Say goodbye to attacking yourself when someone's above you lmao
|
||||
var/datum/action/sizecode_resize/small_sprite
|
||||
|
||||
#define MOVESPEED_ID_SIZE "SIZECODE"
|
||||
#define MOVESPEED_ID_STOMP "STEPPY"
|
||||
@@ -44,7 +46,7 @@ mob/living/get_effective_size()
|
||||
if(size_multiplier == previous_size)
|
||||
return 1
|
||||
src.update_transform() //WORK DAMN YOU
|
||||
src.update_mobsize()
|
||||
src.update_mobsize()
|
||||
//Going to change the health and speed values too
|
||||
src.remove_movespeed_modifier(MOVESPEED_ID_SIZE)
|
||||
src.add_movespeed_modifier(MOVESPEED_ID_SIZE, multiplicative_slowdown = (abs(size_multiplier - 1) * 0.8 ))
|
||||
@@ -60,6 +62,13 @@ mob/living/get_effective_size()
|
||||
//if(src.size_multiplier >= RESIZE_A_HUGEBIG || src.size_multiplier <= RESIZE_A_TINYMICRO) Will remove clothing when too big or small. Will do later.
|
||||
previous_size = size_multiplier //And, change this now that we are finally done.
|
||||
|
||||
//Now check if the mob can get the size action
|
||||
if(!small_sprite)
|
||||
small_sprite = new(src)
|
||||
small_sprite.Remove(src)
|
||||
if(size_multiplier >= 1.25) //Anything bigger will start to block things
|
||||
small_sprite.Grant(src)
|
||||
|
||||
//handle the big steppy, except nice
|
||||
/mob/living/proc/handle_micro_bump_helping(var/mob/living/tmob)
|
||||
if(ishuman(src))
|
||||
@@ -67,7 +76,7 @@ mob/living/get_effective_size()
|
||||
|
||||
if(tmob.pulledby == H)
|
||||
return 0
|
||||
|
||||
|
||||
//Micro is on a table.
|
||||
var/turf/steppyspot = tmob.loc
|
||||
for(var/thing in steppyspot.contents)
|
||||
@@ -91,6 +100,7 @@ mob/living/get_effective_size()
|
||||
tmob.visible_message("<span class='notice'>[src] carefully slithers around [tmob].</span>", "<span class='notice'>[src]'s huge tail slithers besides you.</span>")
|
||||
else
|
||||
tmob.visible_message("<span class='notice'>[src] carefully steps over [tmob].</span>", "<span class='notice'>[src] steps over you carefully.</span>")
|
||||
|
||||
return 1
|
||||
|
||||
//Smaller person stepping under a larger person
|
||||
@@ -133,7 +143,20 @@ mob/living/get_effective_size()
|
||||
tmob.visible_message("<span class='danger'>[src] carefully rolls their tail over [tmob]!</span>", "<span class='danger'>[src]'s huge tail rolls over you!</span>")
|
||||
else
|
||||
tmob.visible_message("<span class='danger'>[src] carefully steps on [tmob]!</span>", "<span class='danger'>[src] steps onto you with force!</span>")
|
||||
return 1
|
||||
|
||||
//horny traits
|
||||
|
||||
if(HAS_TRAIT(src, TRAIT_MICROPHILE))
|
||||
src.adjustArousalLoss(8)
|
||||
if (src.getArousalLoss() >= 100 && ishuman(tmob) && tmob.has_dna())
|
||||
src.mob_climax(forced_climax=TRUE)
|
||||
|
||||
if(HAS_TRAIT(tmob, TRAIT_MACROPHILE))
|
||||
tmob.adjustArousalLoss(10)
|
||||
if (tmob.getArousalLoss() >= 100 && ishuman(tmob) && tmob.has_dna())
|
||||
tmob.mob_climax(forced_climax=TRUE)
|
||||
|
||||
return 1
|
||||
|
||||
if(H.a_intent == "harm" && H.canmove && !H.buckled)
|
||||
now_pushing = 0
|
||||
@@ -149,6 +172,19 @@ mob/living/get_effective_size()
|
||||
tmob.visible_message("<span class='danger'>[src] mows down [tmob] under their tail!</span>", "<span class='userdanger'>[src] plows their tail over you mercilessly!</span>")
|
||||
else
|
||||
tmob.visible_message("<span class='danger'>[src] slams their foot down on [tmob], crushing them!</span>", "<span class='userdanger'>[src] crushes you under their foot!</span>")
|
||||
|
||||
//horny traits
|
||||
|
||||
if(HAS_TRAIT(src, TRAIT_MICROPHILE))
|
||||
src.adjustArousalLoss((get_effective_size()/tmob.get_effective_size()*3))
|
||||
if (src.getArousalLoss() >= 100 && ishuman(tmob) && tmob.has_dna())
|
||||
src.mob_climax(forced_climax=TRUE)
|
||||
|
||||
if(HAS_TRAIT(tmob, TRAIT_MACROPHILE))
|
||||
tmob.adjustArousalLoss((get_effective_size()/tmob.get_effective_size()*3))
|
||||
if (tmob.getArousalLoss() >= 100 && ishuman(tmob) && tmob.has_dna())
|
||||
tmob.mob_climax(forced_climax=TRUE)
|
||||
|
||||
return 1
|
||||
|
||||
if(H.a_intent == "grab" && H.canmove && !H.buckled)
|
||||
@@ -215,7 +251,7 @@ mob/living/get_effective_size()
|
||||
mob_size = 2 //the default human size
|
||||
if(size_multiplier > 1)
|
||||
mob_size = 3
|
||||
|
||||
|
||||
//Proc for instantly grabbing valid size difference. Code optimizations soon(TM)
|
||||
/*
|
||||
/mob/living/proc/sizeinteractioncheck(var/mob/living/tmob)
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
//Sizechem reaction
|
||||
/datum/chemical_reaction/sizechem
|
||||
name = "Cell-Volume Altering Base"
|
||||
id = "sizechem"
|
||||
id = /datum/reagent/sizechem
|
||||
mix_message = "the reaction rapidly alters in size!"
|
||||
required_reagents = list(/datum/reagent/growthserum = 0.15, /datum/reagent/medicine/clonexadone = 0.15, /datum/reagent/gold = 0.15, /datum/reagent/acetone = 0.15)
|
||||
results = list(/datum/reagent/sizechem = 0.3)
|
||||
@@ -48,7 +48,7 @@
|
||||
//Growthchem reaction
|
||||
/datum/chemical_reaction/growthchem
|
||||
name = "Prospacillin"
|
||||
id = "growthchem"
|
||||
id = /datum/reagent/growthchem
|
||||
mix_message = "the reaction appears to grow!"
|
||||
required_reagents = list(/datum/reagent/sizechem = 0.15, /datum/reagent/consumable/condensedcapsaicin = 0.15, /datum/reagent/drug/aphrodisiac = 0.30)
|
||||
results = list(/datum/reagent/growthchem = 0.25)
|
||||
@@ -97,9 +97,9 @@
|
||||
//Shrinchem reaction
|
||||
/datum/chemical_reaction/shrinkchem
|
||||
name = "Diminicillin"
|
||||
id = "shrinkchem"
|
||||
id = /datum/reagent/shrinkchem
|
||||
mix_message = "the reaction appears to shrink!"
|
||||
required_reagents = list(/datum/reagent/sizechem = 0.15, /datum/reagent/consumable/frostoil = 0.15, /datum/reagent/drug = 0.30)
|
||||
required_reagents = list(/datum/reagent/sizechem = 0.15, /datum/reagent/consumable/frostoil = 0.15, /datum/reagent/drug/aphrodisiac = 0.30)
|
||||
results = list(/datum/reagent/shrinkchem = 0.25)
|
||||
required_temp = 1
|
||||
OptimalTempMin = 100 // Lower area of bell curve for determining heat based rate reactions
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
/obj/item/organ/cyberimp/arm/mblade
|
||||
name = "arm-mounted scytheblade"
|
||||
desc = "An extremely dangerous implant which can be used in a variety of ways. Mostly killing."
|
||||
contents = newlist(/obj/item/melee/mblade)
|
||||
|
||||
/obj/item/organ/cyberimp/arm/mblade/l
|
||||
zone = BODY_ZONE_L_ARM
|
||||
|
||||
/obj/item/melee/mblade
|
||||
name = "mounted scytheblade"
|
||||
desc = "An extremely dangerous implant which can be used in a variety of ways. Mostly killing."
|
||||
icon = 'icons/obj/items_and_weapons.dmi'
|
||||
icon_state = "mblade"
|
||||
item_state = "mblade"
|
||||
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
|
||||
force = 45
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
throwforce = 45
|
||||
block_chance = 70
|
||||
armour_penetration = 80
|
||||
flags_1 = CONDUCT_1
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
sharpness = IS_SHARP_ACCURATE
|
||||
attack_verb = list("slashed", "cut")
|
||||
@@ -5,6 +5,7 @@
|
||||
name = "Extra productive genitals"
|
||||
desc = "Your lower bits produce more and hold more than normal."
|
||||
value = 0
|
||||
category = CATEGORY_SEXUAL
|
||||
mob_trait = TRAIT_CUM_PLUS
|
||||
gain_text = "<span class='notice'>You feel pressure in your groin.</span>"
|
||||
lose_text = "<span class='notice'>You feel a weight lifted from your groin.</span>"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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."
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -34,7 +34,6 @@
|
||||
icon_state = "luwethtrench"
|
||||
item_state = "luwethtrench"
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
roomy = TRUE
|
||||
|
||||
/obj/item/clothing/gloves/ring/luweth
|
||||
name = "Luweth’s 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
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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"
|
||||
Reference in New Issue
Block a user