CONflicts

This commit is contained in:
MMMiracles
2015-12-18 16:34:06 -05:00
43 changed files with 1555 additions and 1208 deletions
+8
View File
@@ -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"
+21 -12
View File
@@ -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
+39 -34
View File
@@ -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.
+7 -1
View File
@@ -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
+2 -1
View File
@@ -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>"
+1
View File
@@ -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
+5 -1
View File
@@ -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
+1
View File
@@ -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
+20 -5
View File
@@ -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)]"
+14 -6
View File
@@ -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
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
+17 -1
View File
@@ -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"
+7 -2
View File
@@ -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"
+14 -7
View File
@@ -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
+28
View File
@@ -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////////////////////////////////////////////////
+1
View File
@@ -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()
+16 -1
View File
@@ -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()
..()
+2
View File
@@ -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
+1 -1
View File
@@ -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
+73
View File
@@ -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
+5
View File
@@ -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>
+6
View File
@@ -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."
Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 40 KiB

+3 -1
View File
@@ -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