12/21 modernizations from TG live (#103)

* sync (#3)

* shuttle auto call

* Merge /vore into /master (#39)

* progress

* Compile errors fixed

No idea if it's test worthy tho as conflicts with race overhaul and
narky removal.

* Update admins.txt

* efforts continue

Fuck grab code, seriously

* grab code is cancer

* Execute the Narkism

Do not hesitate.

Show no mercy.

* holy shit grab code is awful

* have I bitched about grab code

My bitching, let me show you it

* código de agarre es una mierda

No really it is

* yeah I don't even know anymore.

* Lolnope. Fuck grab code

* I'm not even sure what to fix anymore

* Self eating is not an acceptable fate

* Taste the void, son.

* My code doesn't pass it's own sanity check.

Maybe it's a sign of things to come.

* uncommented and notes

* It Works and I Don't Know Why (#38)

* shuttle auto call

* it works and I don't know why

* Subsystem 12/21

Most Recent TG subsystem folder

* globalvars 12/21

Tossed out the flavor_misc and parallax files

* Onclick 12/21

as well as .dme updates

* _defines 12/21

ommited old _MC.dm

* _HELPERS 12/21

Preserved snowflake placement of furry sprites

* _defeines/genetics

reapplied narkism holdover for snowflake races.

* Oops forgot mutant colors

* modules porting 12/21 + Sounds/icons

Admin, Client and most of mob life files ommitted

* enviroment file

* Admin optimizations

ahelp log system kept

* Mob ports 12/21

Flavor text preserved

* datums ported 12/21

* Game ported 12/21

* batch of duplicate fixes/dogborg work

Dogborgs need to be modernized to refractored borg standards.

* moar fixes

* Maps and futher compile fixes
This commit is contained in:
Poojawa
2016-12-22 03:57:55 -06:00
committed by GitHub
parent f5e143a452
commit cf59ac1c3d
2215 changed files with 707445 additions and 87041 deletions
+2 -2
View File
@@ -6,6 +6,7 @@
force = 40
throwforce = 20
armour_penetration = 50
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
var/datum/effect_system/spark_spread/spark_system
/obj/item/weapon/katana/energy/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
@@ -37,7 +38,7 @@
/obj/item/weapon/katana/energy/proc/returnToOwner(mob/living/carbon/human/user, doSpark = 1, caught = 0)
if(!istype(user))
return
loc = get_turf(src)
forceMove(get_turf(user))
if(doSpark)
spark_system.start()
@@ -50,7 +51,6 @@
else if(user.equip_to_slot_if_possible(src, slot_belt, 0, 1, 1))
msg = "Your Energy Katana teleports back to you, sheathing itself as it does so!</span>"
else
loc = get_turf(user)
msg = "Your Energy Katana teleports to your location!"
if(caught)
+3 -3
View File
@@ -14,7 +14,7 @@ Contents:
typepath = /datum/round_event/ghost_role/ninja
max_occurrences = 1
earliest_start = 30000 // 1 hour
min_players = 15
/datum/round_event/ghost_role/ninja
var/success_spawn = 0
@@ -55,7 +55,7 @@ Contents:
if(!candidates.len)
return NOT_ENOUGH_PLAYERS
var/mob/dead/selected_candidate = popleft(candidates)
var/mob/dead/selected_candidate = pick_n_take(candidates)
var/key = selected_candidate.key
//Prepare ninja player mind
@@ -66,7 +66,7 @@ Contents:
var/list/possible_targets = list()
for(var/datum/mind/M in ticker.minds)
if(M.current && M.current.stat != DEAD)
if(istype(M.current,/mob/living/carbon/human))
if(ishuman(M.current))
if(M.special_role)
possible_targets[M] = 0 //bad-guy
else if(M.assigned_role in command_positions)
+2 -1
View File
@@ -31,6 +31,7 @@
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
strip_delay = 120
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
var/draining = 0
var/candrain = 0
var/mindrain = 200
@@ -40,7 +41,7 @@
/obj/item/clothing/gloves/space_ninja/Touch(atom/A,proximity)
if(!candrain || draining)
return 0
if(!istype(loc, /mob/living/carbon/human))
if(!ishuman(loc))
return 0 //Only works while worn
var/mob/living/carbon/human/H = loc
+4 -3
View File
@@ -5,7 +5,8 @@
name = "ninja hood"
icon_state = "s-ninja"
item_state = "s-ninja_mask"
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 25)
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 25, fire = 100, acid = 100)
strip_delay = 12
unacidable = 1
blockTracking = 1//Roughly the only unique thing about this helmet.
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
blockTracking = 1//Roughly the only unique thing about this helmet.
flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
+1
View File
@@ -16,3 +16,4 @@ Contents:
icon_state = "s-ninja"
item_state = "s-ninja_mask"
strip_delay = 120
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
@@ -3,7 +3,7 @@ It will teleport people to a holding facility after 30 seconds. (Check the proce
It is possible to destroy the net by the occupant or someone else.
*/
/obj/effect/energy_net
/obj/structure/energy_net
name = "energy net"
desc = "It's a net made of green energy."
icon = 'icons/effects/effects.dmi'
@@ -14,27 +14,21 @@ It is possible to destroy the net by the occupant or someone else.
mouse_opacity = 1//So you can hit it with stuff.
anchored = 1//Can't drag/grab the trapped mob.
layer = ABOVE_ALL_MOB_LAYER
var/health = 25//How much health it has.
obj_integrity = 25//How much health it has.
max_integrity = 25
var/mob/living/affecting = null//Who it is currently affecting, if anyone.
var/mob/living/master = null//Who shot web. Will let this person know if the net was successful or failed.
/obj/effect/energy_net/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1)
/obj/structure/energy_net/play_attack_sound(damage, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
if(BRUTE)
if(sound_effect)
playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
if(BURN)
if(sound_effect)
playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
else
return
health -= damage
if(health <=0)
qdel(src)
playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
/obj/effect/energy_net/Destroy()
/obj/structure/energy_net/Destroy()
if(affecting)
var/mob/living/carbon/M = affecting
M.anchored = 0
@@ -44,7 +38,7 @@ It is possible to destroy the net by the occupant or someone else.
master << "<span class='userdanger'>ERROR</span>: unable to initiate transport protocol. Procedure terminated."
return ..()
/obj/effect/energy_net/process(mob/living/carbon/M)
/obj/structure/energy_net/process(mob/living/carbon/M)
var/check = 30//30 seconds before teleportation. Could be extended I guess.
var/mob_name = affecting.name//Since they will report as null if terminated before teleport.
//The person can still try and attack the net when inside.
@@ -67,37 +61,33 @@ It is possible to destroy the net by the occupant or someone else.
density = 0//Make the net pass-through.
invisibility = INVISIBILITY_ABSTRACT//Make the net invisible so all the animations can play out.
health = INFINITY//Make the net invincible so that an explosion/something else won't kill it while, spawn() is running.
resistance_flags |= INDESTRUCTIBLE //Make the net invincible so that an explosion/something else won't kill it while, spawn() is running.
for(var/obj/item/W in M)
if(istype(M,/mob/living/carbon/human))
if(W==M:w_uniform)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(W == H.w_uniform)
continue//So all they're left with are shoes and uniform.
if(W==M:shoes)
if(W == H.shoes)
continue
M.unEquip(W)
spawn(0)
playsound(M.loc, 'sound/effects/sparks4.ogg', 50, 1)
anim(M.loc,M,'icons/mob/mob.dmi',,"phaseout",,M.dir)
playsound(M.loc, 'sound/effects/sparks4.ogg', 50, 1)
PoolOrNew(/obj/effect/overlay/temp/dir_setting/ninja/phase/out, list(get_turf(M), M.dir))
M.loc = pick(holdingfacility)//Throw mob in to the holding facility.
visible_message("[M] suddenly vanishes!")
M.forceMove(pick(holdingfacility)) //Throw mob in to the holding facility.
M << "<span class='danger'>You appear in a strange place!</span>"
spawn(0)
var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(5, 0, M.loc)
spark_system.start()
playsound(M.loc, 'sound/effects/phasein.ogg', 25, 1)
playsound(M.loc, 'sound/effects/sparks2.ogg', 50, 1)
anim(M.loc,M,'icons/mob/mob.dmi',,"phasein",,M.dir)
qdel(src)//Wait for everything to finish, delete the net. Else it will stop everything once net is deleted, including the spawn(0).
for(var/mob/O in viewers(src, 3))
O.show_message("[M] vanishes!", 1, "<span class='italics'>You hear sparks flying!</span>", 2)
if(!isnull(master))//As long as they still exist.
master << "<span class='notice'><b>SUCCESS</b>: transport procedure of \the [affecting] complete.</span>"
M.notransform = 0
var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(5, 0, M.loc)
spark_system.start()
playsound(M.loc, 'sound/effects/phasein.ogg', 25, 1)
playsound(M.loc, 'sound/effects/sparks2.ogg', 50, 1)
PoolOrNew(/obj/effect/overlay/temp/dir_setting/ninja/phase, list(get_turf(M), M.dir))
qdel(src)
else//And they are free.
M << "<span class='notice'>You are free of the net!</span>"
@@ -106,61 +96,7 @@ It is possible to destroy the net by the occupant or someone else.
/obj/effect/energy_net/bullet_act(obj/item/projectile/Proj)
. = ..()
take_damage(Proj.damage, Proj.damage_type)
/obj/effect/energy_net/ex_act(severity, target)
switch(severity)
if(1)
qdel(src)
if(2)
qdel(src)
if(3)
take_damage(rand(10,25), BRUTE, 0)
/obj/effect/energy_net/blob_act(obj/effect/blob/B)
qdel(src)
/obj/effect/energy_net/hitby(atom/movable/AM)
..()
var/tforce = 0
if(ismob(AM))
tforce = 10
else if(isobj(AM))
var/obj/O = AM
tforce = O.throwforce
take_damage(tforce)
/obj/effect/energy_net/attack_hulk(mob/living/carbon/human/user)
..(user, 1)
user.visible_message("<span class='danger'>[user] rips the energy net apart!</span>", \
"<span class='notice'>You easily destroy the energy net.</span>")
qdel(src)
/obj/effect/energy_net/attack_paw(mob/user)
/obj/structure/energy_net/attack_paw(mob/user)
return attack_hand()
/obj/effect/energy_net/attack_alien(mob/living/user)
user.do_attack_animation(src)
user.changeNext_move(CLICK_CD_MELEE)
playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
user.visible_message("<span class='danger'>[user] slices the energy net apart!</span>", \
"\green You slice the energy net to pieces.")
qdel(src)
/obj/effect/energy_net/attacked_by(obj/item/weapon/W, mob/user)
..()
take_damage(W.force, W.damtype)
@@ -23,5 +23,6 @@
reagents.trans_id_to(H, "radium", a_transfer)
H << "<span class='danger'>You are beginning to feel the after-effect of the injection.</span>"
a_boost--
H << "<span class='notice'>There are <B>[a_boost]</B> adrenaline boosts remaining.</span>"
s_coold = 3
return
@@ -9,22 +9,22 @@
if(!ninjacost(200,N_STEALTH_CANCEL) && iscarbon(C))
var/mob/living/carbon/human/H = affecting
if(C.client)//Monkeys without a client can still step_to() and bypass the net. Also, netting inactive people is lame.
if(!locate(/obj/effect/energy_net) in C.loc)//Check if they are already being affected by an energy net.
if(!locate(/obj/structure/energy_net) in C.loc)//Check if they are already being affected by an energy net.
for(var/turf/T in getline(H.loc, C.loc))
if(T.density)//Don't want them shooting nets through walls. It's kind of cheesy.
H << "<span class='warning'>You may not use an energy net through solid obstacles!</span>"
return
spawn(0)
H.Beam(C,"n_beam",,15)
H.Beam(C,"n_beam",time=15)
H.say("Get over here!")
var/obj/effect/energy_net/E = new /obj/effect/energy_net(C.loc)
var/obj/structure/energy_net/E = new /obj/structure/energy_net(C.loc)
H.visible_message("<span class='danger'>[H] caught [C] with an energy net!</span>","<span class='notice'>You caught [C] with an energy net!</span>")
E.affecting = C
E.master = H
spawn(0)//Parallel processing.
E.process(C)
else
H << "<span class='warning'>They are already trapped inside an energy net!</span>"
H << "<span class='warning'>[C.p_they(TRUE)] are already trapped inside an energy net!</span>"
else
H << "<span class='warning'>They will bring no honor to your Clan!</span>"
H << "<span class='warning'>[C.p_they(TRUE)] will bring no honor to your Clan!</span>"
return
@@ -9,11 +9,11 @@
if(!ninjacost(10))
var/mob/living/carbon/human/H = affecting
var/slot = H.hand ? slot_l_hand : slot_r_hand
if(H.equip_to_slot_or_del(new /obj/item/weapon/throwing_star/ninja(H), slot))
var/obj/item/weapon/throwing_star/ninja/N = new(H)
if(H.put_in_hands(N))
H << "<span class='notice'>A throwing star has been created in your hand!</span>"
else
qdel(N)
H.throw_mode_on() //So they can quickly throw it.
@@ -18,9 +18,9 @@ Contents:
U << "<span class='warning'>You don't have enough power to enable Stealth!</span>"
return
s_active=!s_active
animate(U, alpha = 0,time = 15)
animate(U, alpha = 50,time = 15)
U.visible_message("<span class='warning'>[U.name] vanishes into thin air!</span>", \
"<span class='notice'>You are now invisible to normal detection.</span>")
"<span class='notice'>You are now mostly invisible to normal detection.</span>")
return
@@ -1,7 +1,7 @@
/obj/item/clothing/suit/space/space_ninja/proc/ninja_sword_recall()
set name = "Recall Energy Katana (Variable Cost)"
set desc = "Teleports the Energy Katana linked to this suit to it's wearer, cost based on distance."
set desc = "Teleports the Energy Katana linked to this suit to its wearer, cost based on distance."
set category = "Ninja Ability"
set popup_menu = 0
@@ -32,9 +32,6 @@
if(energyKatana in C.stomach_contents)
C.stomach_contents -= energyKatana
if(energyKatana in C.internal_organs)
C.internal_organs -= energyKatana
energyKatana.loc = get_turf(energyKatana)
if(inview) //If we can see the katana, throw it towards ourselves, damaging people as we go.
@@ -12,7 +12,7 @@ Contents:
//Handles elporting while grabbing someone
/obj/item/clothing/suit/space/space_ninja/proc/handle_teleport_grab(turf/T, mob/living/H)
if(H.pulling && (istype(H.pulling, /mob/living)))
if(H.pulling && (isliving(H.pulling)))
var/mob/living/victim = H.pulling
if(!victim.anchored)
victim.forceMove(locate(T.x+rand(-1,1),T.y+rand(-1,1),T.z))
@@ -31,22 +31,19 @@ Contents:
var/turf/destination = get_teleport_loc(H.loc,H,9,1,3,1,0,1)
var/turf/mobloc = get_turf(H.loc)//Safety
if(destination&&istype(mobloc, /turf))//So we don't teleport out of containers
spawn(0)
playsound(H.loc, "sparks", 50, 1)
anim(mobloc,src,'icons/mob/mob.dmi',,"phaseout",,H.dir)
if(destination && isturf(mobloc))//So we don't teleport out of containers
playsound(H.loc, "sparks", 50, 1)
PoolOrNew(/obj/effect/overlay/temp/dir_setting/ninja/phase/out, list(get_turf(H), H.dir))
handle_teleport_grab(destination, H)
H.loc = destination
spawn(0)
spark_system.start()
playsound(H.loc, 'sound/effects/phasein.ogg', 25, 1)
playsound(H.loc, "sparks", 50, 1)
anim(H.loc,H,'icons/mob/mob.dmi',,"phasein",,H.dir)
spark_system.start()
playsound(H.loc, 'sound/effects/phasein.ogg', 25, 1)
playsound(H.loc, "sparks", 50, 1)
PoolOrNew(/obj/effect/overlay/temp/dir_setting/ninja/phase, list(get_turf(H), H.dir))
spawn(0)
destination.phase_damage_creatures(20,H)//Paralyse and damage mobs and mechas on the turf
destination.phase_damage_creatures(20,H)//Paralyse and damage mobs and mechas on the turf
s_coold = 1
else
H << "<span class='danger'>The VOID-shift device is malfunctioning, <B>teleportation failed</B>.</span>"
@@ -63,22 +60,19 @@ Contents:
if(!ninjacost(200,N_STEALTH_CANCEL))
var/mob/living/carbon/human/H = affecting
var/turf/mobloc = get_turf(H.loc)//To make sure that certain things work properly below.
if((!T.density)&&istype(mobloc, /turf))
spawn(0)
playsound(H.loc, 'sound/effects/sparks4.ogg', 50, 1)
anim(mobloc,src,'icons/mob/mob.dmi',,"phaseout",,H.dir)
if(T.density && isturf(mobloc))
playsound(H.loc, "sparks", 50, 1)
PoolOrNew(/obj/effect/overlay/temp/dir_setting/ninja/phase/out, list(get_turf(H), H.dir))
handle_teleport_grab(T, H)
H.loc = T
spawn(0)
spark_system.start()
playsound(H.loc, 'sound/effects/phasein.ogg', 25, 1)
playsound(H.loc, 'sound/effects/sparks2.ogg', 50, 1)
anim(H.loc,H,'icons/mob/mob.dmi',,"phasein",,H.dir)
spark_system.start()
playsound(H.loc, 'sound/effects/phasein.ogg', 25, 1)
playsound(H.loc, "sparks", 50, 1)
PoolOrNew(/obj/effect/overlay/temp/dir_setting/ninja/phase, list(get_turf(H), H.dir))
spawn(0)//Any living mobs in teleport area are gibbed.
T.phase_damage_creatures(20,H)//Paralyse and damage mobs and mechas on the turf
T.phase_damage_creatures(20,H)//Paralyse and damage mobs and mechas on the turf
s_coold = 1
else
H << "<span class='danger'>You cannot teleport into solid walls or from solid matter</span>"
+1 -1
View File
@@ -281,5 +281,5 @@ They *could* go in their appropriate files, but this is supposed to be modular
var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
spark_system.set_up(5, 0, loc)
playsound(src, "sparks", 50, 1)
visible_message("<span class='danger'>[H] electrocutes [src] with their touch!</span>", "<span class='userdanger'>[H] electrocutes you with their touch!</span>")
visible_message("<span class='danger'>[H] electrocutes [src] with [H.p_their()] touch!</span>", "<span class='userdanger'>[H] electrocutes you with [H.p_their()] touch!</span>")
electrocute_act(25, H)
+2 -1
View File
@@ -6,7 +6,8 @@
item_state = "secshoes"
permeability_coefficient = 0.01
flags = NOSLIP
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30, fire = 100, acid = 100)
strip_delay = 120
cold_protection = FEET
min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
+2 -2
View File
@@ -18,8 +18,8 @@ Contents:
item_state = "s-ninja_suit"
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank/internals,/obj/item/weapon/stock_parts/cell)
slowdown = 0
unacidable = 1
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
resistance_flags = LAVA_PROOF | ACID_PROOF
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30, fire = 100, acid = 100)
strip_delay = 12
//Important parts of the suit.
+16 -7
View File
@@ -41,15 +41,24 @@
else if(istype(I, /obj/item/weapon/disk/tech_disk))//If it's a data disk, we want to copy the research on to the suit.
var/obj/item/weapon/disk/tech_disk/TD = I
if(TD.stored)//If it has something on it.
var/has_research = 0
for(var/V in TD.tech_stored)
if(V)
has_research = 1
break
if(has_research)//If it has something on it.
U << "Research information detected, processing..."
if(do_after(U,s_delay, target = src))
for(var/datum/tech/current_data in stored_research)
if(current_data.id==TD.stored.id)
if(current_data.level<TD.stored.level)
current_data.level=TD.stored.level
break
TD.stored = null
for(var/V1 in 1 to TD.max_tech_stored)
var/datum/tech/new_data = TD.tech_stored[V1]
TD.tech_stored[V1] = null
if(!new_data)
continue
for(var/V2 in stored_research)
var/datum/tech/current_data = V2
if(current_data.id == new_data.id)
current_data.level = max(current_data.level, new_data.level)
break
U << "<span class='notice'>Data analyzed and updated. Disk erased.</span>"
else
U << "<span class='userdanger'>ERROR</span>: Procedure interrupted. Process terminated."