mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-18 19:44:58 +01:00
CONflicts
This commit is contained in:
@@ -132,9 +132,12 @@ var/obj/machinery/gateway/centerstation/the_gateway = null
|
||||
|
||||
//okay, here's the good teleporting stuff
|
||||
/obj/machinery/gateway/centerstation/Bumped(atom/movable/M as mob|obj)
|
||||
if(!ready) return
|
||||
if(!active) return
|
||||
if(!awaygate) return
|
||||
if(!ready)
|
||||
return
|
||||
if(!active)
|
||||
return
|
||||
if(!awaygate || qdeleted(awaygate))
|
||||
return
|
||||
|
||||
if(awaygate.calibrated)
|
||||
M.loc = get_step(awaygate.loc, SOUTH)
|
||||
@@ -154,6 +157,7 @@ var/obj/machinery/gateway/centerstation/the_gateway = null
|
||||
user << "\black The gate is already calibrated, there is no work for you to do here."
|
||||
return
|
||||
|
||||
|
||||
/////////////////////////////////////Away////////////////////////
|
||||
|
||||
|
||||
@@ -232,8 +236,12 @@ var/obj/machinery/gateway/centerstation/the_gateway = null
|
||||
|
||||
|
||||
/obj/machinery/gateway/centeraway/Bumped(atom/movable/M as mob|obj)
|
||||
if(!ready) return
|
||||
if(!active) return
|
||||
if(!ready)
|
||||
return
|
||||
if(!active)
|
||||
return
|
||||
if(!stationgate || qdeleted(stationgate))
|
||||
return
|
||||
if(istype(M, /mob/living/carbon))
|
||||
for(var/obj/item/weapon/implant/exile/E in M)//Checking that there is an exile implant in the contents
|
||||
if(E.imp_in == M)//Checking that it's actually implanted vs just in their pocket
|
||||
@@ -251,4 +259,4 @@ var/obj/machinery/gateway/centerstation/the_gateway = null
|
||||
else
|
||||
user << "<span class='boldnotice'>Recalibration successful!</span>: \black This gate's systems have been fine tuned. Travel to this gate will now be on target."
|
||||
calibrated = 1
|
||||
return
|
||||
return
|
||||
|
||||
+1137
-1127
File diff suppressed because it is too large
Load Diff
@@ -178,6 +178,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["chat_toggles"] >> chat_toggles
|
||||
S["toggles"] >> toggles
|
||||
S["ghost_form"] >> ghost_form
|
||||
S["ghost_orbit"] >> ghost_orbit
|
||||
S["preferred_map"] >> preferred_map
|
||||
S["ignoring"] >> ignoring
|
||||
|
||||
@@ -194,6 +195,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
default_slot = sanitize_integer(default_slot, 1, max_save_slots, initial(default_slot))
|
||||
toggles = sanitize_integer(toggles, 0, 65535, initial(toggles))
|
||||
ghost_form = sanitize_inlist(ghost_form, ghost_forms, initial(ghost_form))
|
||||
ghost_orbit = sanitize_inlist(ghost_orbit, ghost_orbits, initial(ghost_orbit))
|
||||
|
||||
return 1
|
||||
|
||||
@@ -215,6 +217,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
||||
S["toggles"] << toggles
|
||||
S["chat_toggles"] << chat_toggles
|
||||
S["ghost_form"] << ghost_form
|
||||
S["ghost_orbit"] << ghost_orbit
|
||||
S["preferred_map"] << preferred_map
|
||||
S["ignoring"] << ignoring
|
||||
|
||||
|
||||
@@ -205,7 +205,7 @@
|
||||
src.ambience_playing = 0
|
||||
feedback_add_details("admin_verb", "SAmbi") //If you are copy-pasting this, I bet you read this comment expecting to see the same thing :^)
|
||||
|
||||
var/list/ghost_forms = list("ghost","ghostking","ghostian2","skeleghost","ghost_red","ghost_black", \
|
||||
var/global/list/ghost_forms = list("ghost","ghostking","ghostian2","skeleghost","ghost_red","ghost_black", \
|
||||
"ghost_blue","ghost_yellow","ghost_green","ghost_pink", \
|
||||
"ghost_cyan","ghost_dblue","ghost_dred","ghost_dgreen", \
|
||||
"ghost_dcyan","ghost_grey","ghost_dyellow","ghost_dpink", "ghost_purpleswirl","ghost_funkypurp","ghost_pinksherbert","ghost_blazeit",\
|
||||
@@ -222,6 +222,22 @@ var/list/ghost_forms = list("ghost","ghostking","ghostian2","skeleghost","ghost_
|
||||
if(istype(mob,/mob/dead/observer))
|
||||
mob.icon_state = new_form
|
||||
|
||||
var/global/list/ghost_orbits = list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOST_ORBIT_SQUARE,GHOST_ORBIT_HEXAGON,GHOST_ORBIT_PENTAGON)
|
||||
|
||||
/client/verb/pick_ghost_orbit()
|
||||
set name = "Choose Ghost Orbit"
|
||||
set category = "Preferences"
|
||||
set desc = "Choose your preferred ghostly orbit."
|
||||
if(!is_content_unlocked())
|
||||
return
|
||||
var/new_orbit = input(src, "Thanks for supporting BYOND - Choose your ghostly orbit:","Thanks for supporting BYOND",null) as null|anything in ghost_orbits
|
||||
if(new_orbit)
|
||||
prefs.ghost_orbit = new_orbit
|
||||
prefs.save_preferences()
|
||||
if(istype(mob, /mob/dead/observer))
|
||||
var/mob/dead/observer/O = mob
|
||||
O.ghost_orbit = new_orbit
|
||||
|
||||
/client/verb/toggle_intent_style()
|
||||
set name = "Toggle Intent Selection Style"
|
||||
set category = "Preferences"
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
|
||||
/obj/item/clothing/head/rabbitears
|
||||
name = "rabbit ears"
|
||||
desc = "Wearing these makes you looks useless, and only good for your sex appeal."
|
||||
desc = "Wearing these makes you look useless, and only good for your sex appeal."
|
||||
icon_state = "bunny"
|
||||
|
||||
/obj/item/clothing/head/flatcap
|
||||
@@ -240,4 +240,9 @@
|
||||
/obj/item/clothing/head/rice_hat
|
||||
name = "rice hat"
|
||||
desc = "Welcome to the rice fields, motherfucker."
|
||||
icon_state = "rice_hat"
|
||||
icon_state = "rice_hat"
|
||||
|
||||
/obj/item/clothing/head/lizard
|
||||
name = "lizardskin cloche hat"
|
||||
desc = "How many lizards died to make this hat? Not enough."
|
||||
icon_state = "lizard"
|
||||
|
||||
@@ -200,10 +200,6 @@
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/item/clothing/suit/armor/reactive/stealth
|
||||
name = "reactive stealth armor"
|
||||
|
||||
@@ -221,10 +217,21 @@
|
||||
owner.alpha = initial(owner.alpha)
|
||||
return 1
|
||||
|
||||
/obj/item/clothing/suit/armor/reactive/tesla
|
||||
name = "reactive tesla armor"
|
||||
|
||||
|
||||
|
||||
|
||||
/obj/item/clothing/suit/armor/reactive/tesla/hit_reaction(mob/living/carbon/human/owner, attack_text)
|
||||
if(!active)
|
||||
return 0
|
||||
if(prob(hit_reaction_chance))
|
||||
owner.visible_message("<span class='danger'>The [src] blocks the [attack_text], sending out arcs of lightning!</span>")
|
||||
for(var/mob/living/M in view(6, owner))
|
||||
if(M == owner)
|
||||
continue
|
||||
owner.Beam(M,icon_state="purple_lightning",icon='icons/effects/effects.dmi',time=5)
|
||||
M.adjustFireLoss(25)
|
||||
playsound(M, 'sound/machines/defib_zap.ogg', 50, 1, -1)
|
||||
return 1
|
||||
//All of the armor below is mostly unused
|
||||
|
||||
|
||||
|
||||
@@ -81,6 +81,22 @@
|
||||
parts = list(/obj/item/weapon/stock_parts/cell = 1)
|
||||
category = CAT_WEAPON
|
||||
|
||||
/datum/table_recipe/tailclub
|
||||
name = "Tail Club"
|
||||
result = /obj/item/weapon/tailclub
|
||||
reqs = list(/obj/item/organ/severedtail = 1,
|
||||
/obj/item/stack/sheet/metal = 1)
|
||||
time = 80
|
||||
category = CAT_WEAPON
|
||||
|
||||
/datum/table_recipe/tailwhip
|
||||
name = "Liz O' Nine Tails"
|
||||
result = /obj/item/weapon/melee/chainofcommand/tailwhip
|
||||
reqs = list(/obj/item/organ/severedtail = 1,
|
||||
/obj/item/stack/cable_coil = 1)
|
||||
time = 80
|
||||
category = CAT_WEAPON
|
||||
|
||||
/datum/table_recipe/ed209
|
||||
name = "ED209"
|
||||
result = /mob/living/simple_animal/bot/ed209
|
||||
@@ -261,3 +277,15 @@
|
||||
/datum/reagent/water/holywater = 10)
|
||||
parts = list(/obj/item/device/camera = 1)
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/table_recipe/lizardhat
|
||||
name = "Lizard Cloche Hat"
|
||||
result = /obj/item/clothing/head/lizard
|
||||
time = 20
|
||||
reqs = list(/obj/item/organ/severedtail = 1)
|
||||
|
||||
/datum/table_recipe/lizardhat_alternate
|
||||
name = "Lizard Cloche Hat"
|
||||
result = /obj/item/clothing/head/lizard
|
||||
time = 20
|
||||
reqs = list(/obj/item/stack/sheet/animalhide/lizard = 1)
|
||||
|
||||
@@ -119,6 +119,11 @@
|
||||
desc = "Vegan meat, on a stick."
|
||||
bonus_reagents = list("nutriment" = 1)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/kebab/tail
|
||||
name = "lizard-tail kebab"
|
||||
desc = "Severed lizard tail on a stick."
|
||||
bonus_reagents = list("nutriment" = 1, "vitamin" = 4)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/monkeycube
|
||||
name = "monkey cube"
|
||||
desc = "Just add water!"
|
||||
|
||||
@@ -29,6 +29,15 @@
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/kebab/tofu
|
||||
category = CAT_FOOD
|
||||
|
||||
/datum/table_recipe/tailkebab
|
||||
name = "Lizard tail kebab"
|
||||
reqs = list(
|
||||
/obj/item/stack/rods = 1,
|
||||
/obj/item/organ/severedtail = 1
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/kebab/tail
|
||||
category = CAT_FOOD
|
||||
|
||||
// see code/module/crafting/table.dm
|
||||
|
||||
////////////////////////////////////////////////FISH////////////////////////////////////////////////
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
icon_state = client.prefs.ghost_form
|
||||
if (ghostimage)
|
||||
ghostimage.icon_state = src.icon_state
|
||||
ghost_orbit = client.prefs.ghost_orbit
|
||||
|
||||
updateghostimages()
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi
|
||||
var/seedarkness = 1
|
||||
var/ghost_hud_enabled = 1 //did this ghost disable the on-screen HUD?
|
||||
var/data_hud_seen = 0 //this should one of the defines in __DEFINES/hud.dm
|
||||
var/ghost_orbit = GHOST_ORBIT_CIRCLE
|
||||
|
||||
/mob/dead/observer/New(mob/body)
|
||||
sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF
|
||||
@@ -225,7 +226,21 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
if(orbiting != target)
|
||||
src << "<span class='notice'>Now orbiting [target].</span>"
|
||||
|
||||
orbit(target,orbitsize,0)
|
||||
var/rot_seg
|
||||
|
||||
switch(ghost_orbit)
|
||||
if(GHOST_ORBIT_TRIANGLE)
|
||||
rot_seg = 3
|
||||
if(GHOST_ORBIT_SQUARE)
|
||||
rot_seg = 4
|
||||
if(GHOST_ORBIT_PENTAGON)
|
||||
rot_seg = 5
|
||||
if(GHOST_ORBIT_HEXAGON)
|
||||
rot_seg = 6
|
||||
else //Circular
|
||||
rot_seg = 36 //360/10 bby, smooth enough aproximation of a circle
|
||||
|
||||
orbit(target,orbitsize, FALSE, 20, rot_seg)
|
||||
|
||||
/mob/dead/observer/orbit()
|
||||
..()
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
density = 0
|
||||
anchored = 1
|
||||
invisibility = 60
|
||||
burn_state = LAVA_PROOF
|
||||
|
||||
|
||||
obj/effect/dummy/slaughter/relaymove(mob/user, direction)
|
||||
if (!src.canmove || !direction) return
|
||||
|
||||
@@ -676,6 +676,8 @@
|
||||
else
|
||||
facial_hair_style = "Shaved"
|
||||
hair_style = pick("Bedhead", "Bedhead 2", "Bedhead 3")
|
||||
dna.species.mutant_bodyparts = dna.species.mutant_bodyparts_buffer.Copy()
|
||||
dna.features = dna.features_buffer.Copy()
|
||||
underwear = "Nude"
|
||||
update_body()
|
||||
update_hair()
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
var/say_mod = "says" // affects the speech message
|
||||
var/list/default_features = list() // Default mutant bodyparts for this species. Don't forget to set one for every mutant bodypart you allow this species to have.
|
||||
var/list/mutant_bodyparts = list() // Parts of the body that are diferent enough from the standard human model that they cause clipping with some equipment
|
||||
var/list/mutant_bodyparts_buffer = list() // A copy of mutant_bodyparts() that allows cloned people to keep their snowflake bodyparts upon cloning, should they be changed
|
||||
|
||||
var/speedmod = 0 // this affects the race's speed. positive numbers make it move slower, negative numbers make it move faster
|
||||
var/armor = 0 // overall defense for the race... or less defense, if it's negative.
|
||||
@@ -380,9 +381,9 @@
|
||||
var/icon_string
|
||||
|
||||
if(S.gender_specific)
|
||||
icon_string = "[id]_[g]_[bodypart]_[S.icon_state]_[layer]"
|
||||
icon_string = "[g]_[bodypart]_[S.icon_state]_[layer]"
|
||||
else
|
||||
icon_string = "[id]_m_[bodypart]_[S.icon_state]_[layer]"
|
||||
icon_string = "m_[bodypart]_[S.icon_state]_[layer]"
|
||||
|
||||
I = image("icon" = 'icons/mob/mutant_bodyparts.dmi', "icon_state" = icon_string, "layer" =- layer)
|
||||
|
||||
@@ -406,9 +407,9 @@
|
||||
|
||||
if(S.hasinner)
|
||||
if(S.gender_specific)
|
||||
icon_string = "[id]_[g]_[bodypart]inner_[S.icon_state]_[layer]"
|
||||
icon_string = "[g]_[bodypart]inner_[S.icon_state]_[layer]"
|
||||
else
|
||||
icon_string = "[id]_m_[bodypart]inner_[S.icon_state]_[layer]"
|
||||
icon_string = "m_[bodypart]inner_[S.icon_state]_[layer]"
|
||||
|
||||
I = image("icon" = 'icons/mob/mutant_bodyparts.dmi', "icon_state" = icon_string, "layer" =- layer)
|
||||
|
||||
|
||||
@@ -8,12 +8,14 @@
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 5
|
||||
a_intent = "harm"
|
||||
attacktext = "gores"
|
||||
maxHealth = 100
|
||||
health = 100
|
||||
speed = 0
|
||||
faction = list("illusion")
|
||||
var/life_span = INFINITY //how long until they despawn
|
||||
var/mob/living/parent_mob
|
||||
var/multiply_chance = 0 //if we multiply on hit
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/illusion/Life()
|
||||
@@ -22,11 +24,15 @@
|
||||
death()
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/illusion/proc/Copy_Parent(mob/living/original, life = 50)
|
||||
/mob/living/simple_animal/hostile/illusion/proc/Copy_Parent(mob/living/original, life = 50, health = 100, damage = 0, replicate = 0 )
|
||||
appearance = original.appearance
|
||||
parent_mob = original
|
||||
dir = original.dir
|
||||
life_span = world.time+life //5 seconds
|
||||
life_span = world.time+life
|
||||
melee_damage_lower = damage
|
||||
melee_damage_upper = damage
|
||||
multiply_chance = replicate
|
||||
faction -= "neutral"
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/illusion/death()
|
||||
@@ -42,6 +48,17 @@
|
||||
return ..()
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/illusion/AttackingTarget()
|
||||
..()
|
||||
if(istype(target, /mob/living) && prob(multiply_chance))
|
||||
var/mob/living/L = target
|
||||
if(L.stat == DEAD)
|
||||
return
|
||||
var/mob/living/simple_animal/hostile/illusion/M = new(loc)
|
||||
M.faction = faction.Copy()
|
||||
M.Copy_Parent(parent_mob, life_span, health/2, melee_damage_upper, multiply_chance)
|
||||
M.GiveTarget(L)
|
||||
|
||||
///////Actual Types/////////
|
||||
|
||||
/mob/living/simple_animal/hostile/illusion/escape
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
var/last_failed_movement = 0//Will not move in the same dir if it couldnt before, will help with the getting stuck on fields thing
|
||||
var/last_warning
|
||||
var/consumedSupermatter = 0 //If the singularity has eaten a supermatter shard and can go to stage six
|
||||
burn_state = LAVA_PROOF
|
||||
|
||||
/obj/singularity/New(loc, var/starting_energy = 50, var/temp = 0)
|
||||
//CARN: admin-alert for chuckle-fuckery.
|
||||
|
||||
@@ -131,4 +131,26 @@
|
||||
var/mob/living/carbon/human/H = target
|
||||
H.drip(100)
|
||||
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
|
||||
//penetrator ammo
|
||||
/obj/item/ammo_box/magazine/sniper_rounds/penetrator
|
||||
name = "sniper rounds (penetrator)"
|
||||
desc = "An extremely powerful round capable of passing straight through cover and anyone unfortunate enough to be behind it."
|
||||
ammo_type = /obj/item/ammo_casing/penetrator
|
||||
max_ammo = 5
|
||||
|
||||
/obj/item/ammo_casing/penetrator
|
||||
desc = "A .50 caliber penetrator round casing."
|
||||
caliber = ".50"
|
||||
projectile_type = /obj/item/projectile/bullet/sniper/penetrator
|
||||
icon_state = ".50"
|
||||
|
||||
/obj/item/projectile/bullet/sniper/penetrator
|
||||
name = "penetrator round"
|
||||
damage = 60
|
||||
forcedodge = 1
|
||||
stun = 0
|
||||
weaken = 0
|
||||
breakthings = FALSE
|
||||
@@ -5,7 +5,7 @@
|
||||
//SURGERY STEPS
|
||||
|
||||
/datum/surgery_step/replace
|
||||
name = "sever muscules"
|
||||
name = "sever muscles"
|
||||
implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/wirecutters = 55)
|
||||
time = 32
|
||||
|
||||
|
||||
@@ -68,7 +68,12 @@
|
||||
max_damage = 75
|
||||
body_part = LEG_RIGHT
|
||||
|
||||
|
||||
/obj/item/organ/severedtail
|
||||
name = "tail"
|
||||
desc = "A severed tail."
|
||||
icon_state = "severedtail"
|
||||
color = "#161"
|
||||
var/markings = "Smooth"
|
||||
|
||||
//Applies brute and burn damage to the organ. Returns 1 if the damage-icon states changed at all.
|
||||
//Damage will not exceed max_damage using this proc
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
// The detachment and attachment of lizard tails
|
||||
// Dismemberment lite; can/should be generalized aka augs when we get more mutant parts and/or for actual dismemberment
|
||||
|
||||
// TAIL REMOVAL
|
||||
|
||||
/datum/surgery/tail_removal
|
||||
name = "tail removal"
|
||||
steps = list(/datum/surgery_step/sever_tail, /datum/surgery_step/close)
|
||||
species = list(/mob/living/carbon/human)
|
||||
possible_locs = list("groin")
|
||||
|
||||
/datum/surgery/tail_removal/can_start(mob/user, mob/living/carbon/target)
|
||||
var/mob/living/carbon/human/L = target
|
||||
if(("tail_lizard" in L.dna.species.mutant_bodyparts) || ("waggingtail_lizard" in L.dna.species.mutant_bodyparts))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/datum/surgery_step/sever_tail
|
||||
name = "sever tail"
|
||||
implements = list(/obj/item/weapon/scalpel = 100, /obj/item/weapon/circular_saw = 100, /obj/item/weapon/melee/energy/sword/cyborg/saw = 100, /obj/item/weapon/melee/arm_blade = 80, /obj/item/weapon/twohanded/required/chainsaw = 80, /obj/item/weapon/mounted_chainsaw = 80, /obj/item/weapon/twohanded/fireaxe = 50, /obj/item/weapon/hatchet = 40, /obj/item/weapon/kitchen/knife/butcher = 25)
|
||||
time = 64
|
||||
|
||||
/datum/surgery_step/sever_tail/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
user.visible_message("[user] begins to sever [target]'s tail!", "<span class='notice'>You begin to sever [target]'s tail...</span>")
|
||||
|
||||
/datum/surgery_step/sever_tail/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/mob/living/carbon/human/L = target
|
||||
user.visible_message("[user] severs [L]'s tail!", "<span class='notice'>You sever [L]'s tail.</span>")
|
||||
if("tail_lizard" in L.dna.species.mutant_bodyparts)
|
||||
L.dna.species.mutant_bodyparts -= "tail_lizard"
|
||||
else if("waggingtail_lizard" in L.dna.species.mutant_bodyparts)
|
||||
L.dna.species.mutant_bodyparts -= "waggingtail_lizard"
|
||||
if("spines" in L.dna.features)
|
||||
L.dna.features -= "spines"
|
||||
var/obj/item/organ/severedtail/S = new(get_turf(target))
|
||||
S.color = "#[L.dna.features["mcolor"]]"
|
||||
S.markings = "[L.dna.features["tail"]]"
|
||||
L.update_body()
|
||||
return 1
|
||||
|
||||
// TAIL ATTACHMENT
|
||||
|
||||
/datum/surgery/tail_attachment
|
||||
name = "tail attachment"
|
||||
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/replace, /datum/surgery_step/attach_tail, /datum/surgery_step/close)
|
||||
species = list(/mob/living/carbon/human)
|
||||
possible_locs = list("groin")
|
||||
|
||||
/datum/surgery/tail_attachment/can_start(mob/user, mob/living/carbon/target)
|
||||
var/mob/living/carbon/human/L = target
|
||||
if(!("tail_lizard" in L.dna.species.mutant_bodyparts) && !("waggingtail_lizard" in L.dna.species.mutant_bodyparts))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/datum/surgery_step/attach_tail
|
||||
name = "attach tail"
|
||||
implements = list(/obj/item/organ/severedtail = 100)
|
||||
time = 64
|
||||
|
||||
/datum/surgery_step/attach_tail/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
user.visible_message("[user] begins to attach a tail to [target]!", "<span class='notice'>You begin to attach the tail to [target]...</span>")
|
||||
|
||||
/datum/surgery_step/attach_tail/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
var/mob/living/carbon/human/L = target
|
||||
user.visible_message("[user] gives [L] a tail!", "<span class='notice'>You give [L] a tail. It adjusts to [L]'s melanin.</span>") // fluff for color
|
||||
if(!(L.dna.features["mcolor"]))
|
||||
L.dna.features["mcolor"] = tool.color
|
||||
var/obj/item/organ/severedtail/T = tool
|
||||
L.dna.features["tail_lizard"] = T.markings
|
||||
L.dna.species.mutant_bodyparts += "tail_lizard"
|
||||
qdel(tool)
|
||||
L.update_body()
|
||||
return 1
|
||||
Reference in New Issue
Block a user