CONflicts
@@ -310,3 +310,11 @@ var/list/bloody_footprints_cache = list()
|
||||
#define FIRE_PROOF -1
|
||||
#define FLAMMABLE 0
|
||||
#define ON_FIRE 1
|
||||
|
||||
|
||||
//Ghost orbit types:
|
||||
#define GHOST_ORBIT_CIRCLE "circle"
|
||||
#define GHOST_ORBIT_TRIANGLE "triangle"
|
||||
#define GHOST_ORBIT_HEXAGON "hexagon"
|
||||
#define GHOST_ORBIT_SQUARE "square"
|
||||
#define GHOST_ORBIT_PENTAGON "pentagon"
|
||||
|
||||
@@ -3,15 +3,24 @@
|
||||
Turn(.) //BYOND handles cases such as -270, 360, 540 etc. DOES NOT HANDLE 180 TURNS WELL, THEY TWEEN AND LOOK LIKE SHIT
|
||||
|
||||
|
||||
/atom/proc/SpinAnimation(speed = 10, loops = -1)
|
||||
var/matrix/m120 = matrix(transform)
|
||||
m120.Turn(120)
|
||||
var/matrix/m240 = matrix(transform)
|
||||
m240.Turn(240)
|
||||
var/matrix/m360 = matrix(transform)
|
||||
speed /= 3 //Gives us 3 equal time segments for our three turns.
|
||||
//Why not one turn? Because byond will see that the start and finish are the same place and do nothing
|
||||
//Why not two turns? Because byond will do a flip instead of a turn
|
||||
animate(src, transform = m120, time = speed, loops)
|
||||
animate(transform = m240, time = speed)
|
||||
animate(transform = m360, time = speed)
|
||||
/atom/proc/SpinAnimation(speed = 10, loops = -1, clockwise = 1, segments = 3)
|
||||
if(!segments)
|
||||
return
|
||||
var/segment = 360/segments
|
||||
if(!clockwise)
|
||||
segment = -segment
|
||||
var/list/matrices = list()
|
||||
for(var/i in 1 to segments-1)
|
||||
var/matrix/M = matrix(transform)
|
||||
M.Turn(segment*i)
|
||||
matrices += M
|
||||
var/matrix/last = matrix(transform)
|
||||
matrices += last
|
||||
|
||||
speed /= segments
|
||||
|
||||
animate(src, transform = matrices[1], time = speed, loops)
|
||||
for(var/i in 2 to segments) //2 because 1 is covered above
|
||||
animate(transform = matrices[i], time = speed)
|
||||
//doesn't have an object argument because this is "Stacking" with the animate call above
|
||||
//3 billion% intentional
|
||||
|
||||
@@ -377,7 +377,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
|
||||
|
||||
for(var/mob/M in mobs)
|
||||
if(skip_mindless && (!M.mind && !M.ckey))
|
||||
if(!isbot(M))
|
||||
if(!isbot(M) && !istype(M, /mob/camera/))
|
||||
continue
|
||||
var/name = M.name
|
||||
if (name in names)
|
||||
@@ -1192,51 +1192,56 @@ B --><-- A
|
||||
//orbit() can run without it (swap orbiting for A)
|
||||
//but then you can never stop it and that's just silly.
|
||||
/atom/movable/var/atom/orbiting = null
|
||||
//we raise this each time orbit is called to prevent mutiple calls in a short time frame from breaking things
|
||||
/atom/movable/var/orbitid = 0
|
||||
|
||||
/atom/movable/proc/orbit(atom/A, radius = 10, clockwise = 1, angle_increment = 15, lockinorbit = 0)
|
||||
//A: atom to orbit
|
||||
//radius: range to orbit at, radius of the circle formed by orbiting
|
||||
//clockwise: whether you orbit clockwise or anti clockwise
|
||||
//rotation_speed: how fast to rotate
|
||||
//rotation_segments: the resolution of the orbit circle, less = a more block circle, this can be used to produce hexagons (6 segments) triangles (3 segments), and so on, 36 is the best default.
|
||||
//pre_rotation: Chooses to rotate src 90 degress towards the orbit dir (clockwise/anticlockwise), useful for things to go "head first" like ghosts
|
||||
//lockinorbit: Forces src to always be on A's turf, otherwise the orbit cancels when src gets too far away (eg: ghosts)
|
||||
|
||||
/atom/movable/proc/orbit(atom/A, radius = 10, clockwise = FALSE, rotation_speed = 20, rotation_segments = 36, pre_rotation = TRUE, lockinorbit = FALSE)
|
||||
if(!istype(A))
|
||||
return
|
||||
orbitid++
|
||||
var/myid = orbitid
|
||||
if (orbiting)
|
||||
stop_orbit()
|
||||
//sadly this is the only way to ensure the original orbit proc stops
|
||||
//and resets the atom's transform before we continue.
|
||||
//time is based on the sleep in the loop and the time for the final animation of initial_transform.
|
||||
sleep(2.6+world.tick_lag)
|
||||
if (orbiting || !istype(A) || orbitid != myid) //post sleep re-check
|
||||
return
|
||||
orbiting = A
|
||||
var/lastloc = loc
|
||||
var/angle = 0
|
||||
var/matrix/initial_transform = matrix(transform)
|
||||
|
||||
while(orbiting && orbiting.loc && orbitid == myid)
|
||||
if(orbiting)
|
||||
stop_orbit()
|
||||
sleep(2.6+world.tick_lag) //the 2 second delay at the end of the existing orbit() call, plus some lag slack.
|
||||
|
||||
orbiting = A
|
||||
var/matrix/initial_transform = matrix(transform)
|
||||
var/lastloc = loc
|
||||
|
||||
//Head first!
|
||||
if(pre_rotation)
|
||||
var/matrix/M = matrix(transform)
|
||||
var/pre_rot = 90
|
||||
if(!clockwise)
|
||||
pre_rot = -90
|
||||
M.Turn(pre_rot)
|
||||
transform = M
|
||||
|
||||
var/matrix/shift = matrix(transform)
|
||||
shift.Translate(0,radius)
|
||||
transform = shift
|
||||
|
||||
SpinAnimation(rotation_speed, -1, clockwise, rotation_segments)
|
||||
while(orbiting && orbiting.loc)
|
||||
var/targetloc = get_turf(orbiting)
|
||||
if (!lockinorbit && loc != lastloc && loc != targetloc)
|
||||
if(!lockinorbit && loc != lastloc && loc != targetloc)
|
||||
break
|
||||
loc = targetloc
|
||||
lastloc = loc
|
||||
angle += angle_increment
|
||||
sleep(0.6)
|
||||
|
||||
animate(src,transform = initial_transform, time = 2) //2 second delay
|
||||
SpinAnimation(0,0)
|
||||
|
||||
var/matrix/shift = matrix(initial_transform)
|
||||
shift.Translate(radius,0)
|
||||
if(clockwise)
|
||||
shift.Turn(angle)
|
||||
else
|
||||
shift.Turn(-angle)
|
||||
animate(src, transform = shift, 2)
|
||||
sleep(0.6) //the effect breaks above 0.6 delay
|
||||
animate(src, transform = initial_transform, 2)
|
||||
orbiting = null
|
||||
|
||||
|
||||
/atom/movable/proc/stop_orbit()
|
||||
if(orbiting)
|
||||
loc = get_turf(orbiting)
|
||||
orbiting = null
|
||||
orbiting = null
|
||||
|
||||
|
||||
//Center's an image.
|
||||
|
||||
@@ -73,4 +73,10 @@
|
||||
|
||||
//usually called via datum/subsystem/New() when replacing a subsystem (i.e. due to a recurring crash)
|
||||
//should attempt to salvage what it can from the old instance of subsystem
|
||||
/datum/subsystem/proc/Recover()
|
||||
/datum/subsystem/proc/Recover()
|
||||
|
||||
//this is so the subsystem doesn't rapid fire to make up missed ticks causing more lag
|
||||
/datum/subsystem/on_varedit(edited_var)
|
||||
if (edited_var == "can_fire" && can_fire)
|
||||
next_fire = world.time + wait
|
||||
|
||||
|
||||
@@ -247,7 +247,8 @@ datum/proc/on_varedit(modified_var) //called whenever a var is edited
|
||||
body += "<option value='?_src_=holder;adminplayerobservefollow=\ref[D]'>Follow</option>"
|
||||
else
|
||||
var/atom/A = D
|
||||
body += "<option value='?_src_=holder;adminplayerobservecoodjump=1;X=[A.x];Y=[A.y];Z=[A.z]'>Jump to</option>"
|
||||
if(istype(A))
|
||||
body += "<option value='?_src_=holder;adminplayerobservecoodjump=1;X=[A.x];Y=[A.y];Z=[A.z]'>Jump to</option>"
|
||||
|
||||
body += "<option value>---</option>"
|
||||
|
||||
|
||||
@@ -88,6 +88,7 @@
|
||||
density = 0
|
||||
anchored = 1
|
||||
invisibility = 60
|
||||
burn_state = LAVA_PROOF
|
||||
|
||||
/obj/effect/dummy/spell_jaunt/Destroy()
|
||||
// Eject contents if deleted somehow
|
||||
|
||||
@@ -409,7 +409,11 @@ var/list/uplink_items = list()
|
||||
desc = "A 5-round magazine of haemorrhage ammo designed for use in the syndicate sniper rifle, causes heavy bleeding in the target."
|
||||
item = /obj/item/ammo_box/magazine/sniper_rounds/haemorrhage
|
||||
|
||||
|
||||
/datum/uplink_item/ammo/sniper/penetrator
|
||||
name = "Sniper Magazine - Penetrator Rounds"
|
||||
desc = "A 5-round magazine of penetrator ammo designed for use in the syndicate sniper rifle. Can pierce walls and multiple enemies."
|
||||
item = /obj/item/ammo_box/magazine/sniper_rounds/penetrator
|
||||
cost = 5
|
||||
|
||||
// STEALTHY WEAPONS
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
var/blood_type
|
||||
var/datum/species/species = new /datum/species/human() //The type of mutant race the player is if applicable (i.e. potato-man)
|
||||
var/list/features = list("FFF") //first value is mutant color
|
||||
var/list/features_buffer = list() // A copy of features, used for cloning --
|
||||
var/real_name //Stores the real name of the person who originally got this dna datum. Used primarely for changelings,
|
||||
var/list/mutations = list() //All mutations are from now on here
|
||||
var/list/temporary_mutations = list() //Timers for temporary mutations
|
||||
|
||||
@@ -411,3 +411,26 @@
|
||||
if(src == user.get_active_hand()) //update inhands
|
||||
user.update_inv_l_hand()
|
||||
user.update_inv_r_hand()
|
||||
|
||||
|
||||
//GREY TIDE
|
||||
/obj/item/weapon/twohanded/spear/grey_tide
|
||||
icon_state = "spearglass0"
|
||||
name = "\improper Grey Tide"
|
||||
desc = "Recovered from the aftermath of a revolt aboard Defense Outpost Theta Aegis, in which a seemingly endless tide of Assistants caused heavy casualities among Nanotrasen military forces."
|
||||
force_unwielded = 15
|
||||
force_wielded = 25
|
||||
throwforce = 20
|
||||
throw_speed = 4
|
||||
attack_verb = list("gored")
|
||||
|
||||
/obj/item/weapon/twohanded/spear/grey_tide/afterattack(atom/movable/AM, mob/living/user, proximity)
|
||||
..()
|
||||
user.faction |= "greytide(\ref[user])"
|
||||
if(istype(AM, /mob/living))
|
||||
var/mob/living/L = AM
|
||||
if(!L.stat && prob(50))
|
||||
var/mob/living/simple_animal/hostile/illusion/M = new(user.loc)
|
||||
M.faction = user.faction.Copy()
|
||||
M.Copy_Parent(user, 100, user.health/2.5, 12, 30)
|
||||
M.GiveTarget(L)
|
||||
|
||||
@@ -287,3 +287,20 @@
|
||||
sharpness = IS_SHARP
|
||||
attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
|
||||
hitsound = "sound/weapons/chainsawhit.ogg"
|
||||
|
||||
/obj/item/weapon/tailclub
|
||||
name = "tail club"
|
||||
desc = "For the beating to death of lizards with their own tails."
|
||||
icon_state = "tailclub"
|
||||
force = 14
|
||||
throwforce = 1 // why are you throwing a club do you even weapon
|
||||
throw_speed = 1
|
||||
throw_range = 1
|
||||
attack_verb = list("clubbed", "bludgeoned")
|
||||
|
||||
/obj/item/weapon/melee/chainofcommand/tailwhip
|
||||
name = "liz o' nine tails"
|
||||
desc = "A whip fashioned from the severed tails of lizards."
|
||||
icon_state = "tailwhip"
|
||||
origin_tech = "combat=1"
|
||||
needs_permit = 0
|
||||
|
||||
@@ -218,20 +218,35 @@
|
||||
/obj/structure/flora/rock
|
||||
name = "rock"
|
||||
desc = "a rock"
|
||||
icon_state = "rock1"
|
||||
icon_state = "rock"
|
||||
icon = 'icons/obj/flora/rocks.dmi'
|
||||
anchored = 1
|
||||
burn_state = FIRE_PROOF
|
||||
density = 1
|
||||
|
||||
/obj/structure/flora/rock/New()
|
||||
..()
|
||||
icon_state = "rock[rand(1,5)]"
|
||||
icon_state = "[icon_state][rand(1,5)]"
|
||||
|
||||
/obj/structure/flora/rock/pile
|
||||
name = "rocks"
|
||||
desc = "some rocks"
|
||||
icon_state = "rockpile1"
|
||||
icon_state = "rockpile"
|
||||
density = 0
|
||||
|
||||
/obj/structure/flora/rock/pile/New()
|
||||
|
||||
/obj/structure/flora/rock/volcanic
|
||||
icon_state = "basalt"
|
||||
desc = "A volcanic rock"
|
||||
|
||||
|
||||
/obj/structure/flora/rock/volcanic/New()
|
||||
..()
|
||||
icon_state = "rockpile[rand(1,5)]"
|
||||
icon_state = "[icon_state][rand(1,3)]"
|
||||
|
||||
/obj/structure/flora/rock/pile/volcanic
|
||||
icon_state = "lavarocks"
|
||||
|
||||
/obj/structure/flora/rock/pile/volcanic/New()
|
||||
..()
|
||||
icon_state = "[icon_state][rand(1,3)]"
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -83,6 +83,11 @@
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">lanterns no longer turn into flashlights when you pick them up.</li>
|
||||
</ul>
|
||||
<h3 class="author">bgobandit updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="rscadd">Lizard tails can now be severed by surgeons with a circular saw and cautery, and attached the same way augmented limbs are.</li>
|
||||
<li class="rscadd">The Animal Rights Consortium is horrified by Nanotrasen stations' sudden rise of illegal lizard tail trade, with such atrocities as lizardskin hats, lizard whips, lizard clubs and even lizard kebab!</li>
|
||||
</ul>
|
||||
<h3 class="author">neersighted updated:</h3>
|
||||
<ul class="changes bgimages16">
|
||||
<li class="tweak">NanoUI should now load much faster, as the filesize and file count have been reduced</li>
|
||||
|
||||
@@ -2940,6 +2940,12 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
|
||||
- tweak: Shields have a bonus against blocking thrown projectiles.
|
||||
Swankcookie:
|
||||
- rscadd: lanterns no longer turn into flashlights when you pick them up.
|
||||
bgobandit:
|
||||
- rscadd: Lizard tails can now be severed by surgeons with a circular saw and cautery,
|
||||
and attached the same way augmented limbs are.
|
||||
- rscadd: The Animal Rights Consortium is horrified by Nanotrasen stations' sudden
|
||||
rise of illegal lizard tail trade, with such atrocities as lizardskin hats,
|
||||
lizard whips, lizard clubs and even lizard kebab!
|
||||
neersighted:
|
||||
- tweak: NanoUI should now load much faster, as the filesize and file count have
|
||||
been reduced
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
author: Remie
|
||||
delete-after: True
|
||||
changes:
|
||||
- rscadd: "Byond members can now choose how their ghost orbits things, their choices are: Circle, Triangle, Square, Pentagon and Hexagon!"
|
||||
- tweak: "orbit() should be much cheaper for clients now, allowing those of you with potato PCs to survive mega ghost swirling better."
|
||||
@@ -0,0 +1,5 @@
|
||||
author: Kor
|
||||
delete-after: True
|
||||
changes:
|
||||
- rscadd: "Adds reactive tesla armour. Adminspawn only."
|
||||
- rscadd: "Adds the legendary spear, Grey Tide. Admin only."
|
||||
@@ -0,0 +1,4 @@
|
||||
author: Kor
|
||||
delete-after: True
|
||||
changes:
|
||||
- rscadd: "Nuke Ops can now purchase penetrator rounds for their sniper rifles."
|
||||
|
Before Width: | Height: | Size: 136 KiB After Width: | Height: | Size: 136 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 40 KiB |
@@ -916,6 +916,7 @@
|
||||
#include "code\modules\awaymissions\mission_code\blackmarketpackers.dm"
|
||||
#include "code\modules\awaymissions\mission_code\centcomAway.dm"
|
||||
#include "code\modules\awaymissions\mission_code\challenge.dm"
|
||||
#include "code\modules\awaymissions\mission_code\snowdin.dm"
|
||||
#include "code\modules\awaymissions\mission_code\spacebattle.dm"
|
||||
#include "code\modules\awaymissions\mission_code\stationCollision.dm"
|
||||
#include "code\modules\awaymissions\mission_code\wildwest.dm"
|
||||
@@ -1446,6 +1447,7 @@
|
||||
#include "code\modules\procedural mapping\mapGeneratorModules\helpers.dm"
|
||||
#include "code\modules\procedural mapping\mapGeneratorModules\nature.dm"
|
||||
#include "code\modules\procedural mapping\mapGenerators\asteroid.dm"
|
||||
#include "code\modules\procedural mapping\mapGenerators\cellular.dm"
|
||||
#include "code\modules\procedural mapping\mapGenerators\nature.dm"
|
||||
#include "code\modules\procedural mapping\mapGenerators\shuttle.dm"
|
||||
#include "code\modules\procedural mapping\mapGenerators\syndicate.dm"
|
||||
@@ -1573,6 +1575,7 @@
|
||||
#include "code\modules\surgery\remove_embedded_object.dm"
|
||||
#include "code\modules\surgery\surgery.dm"
|
||||
#include "code\modules\surgery\surgery_step.dm"
|
||||
#include "code\modules\surgery\tail_modification.dm"
|
||||
#include "code\modules\surgery\tools.dm"
|
||||
#include "code\modules\surgery\organs\augments_external.dm"
|
||||
#include "code\modules\surgery\organs\augments_eyes.dm"
|
||||
@@ -1593,4 +1596,3 @@
|
||||
#include "interface\stylesheet.dm"
|
||||
#include "interface\skin.dmf"
|
||||
// END_INCLUDE
|
||||
|
||||
|
||||