[READY]] FLIGHTPACKS (AKA cooler, better, and technological wings with a unique gimmick!) (#20860)
* vroom * wew * a * b * morestuff * . * a * . * . * basicsprites+extend/retract * ... * . * thanks travis * woops * thankstravisv2 * redundence * ishouldstopmakingsomanygoddamncommits+empdamage * stuff * .. * ion_trails * fixes_conflict_1 * fix * compilesnow * . * fuck * WIP: Multi Step Assembly * thismightfixitthismightnot * shoe-attachment * noselfremoval * wooops * tweaksandcrashing * runtimes * runtimesfuntimes+crash update 1 * thisprobablywontcompile * stillwip * githubPLEASEWORK * fixes conflicts 3/3 * REFACTORSUNTESTED * fixingconflicts2 * fixingconflicts3/3 * updates * stuffs * ... * stillWIP * stufffs * . * .. * runtimesfuntimes2 * stuffs2 * conflictfix * ... * fuck * fix * bah merge conflicts * knockback_testing1 * conflictfixing... * mergeconflicts * plop * socloseyetsofar * tweaksandfixes * conflicts * fix * fixes * fix * woops * woops2 * hotfix * ... * flufftextandfixes * test * .. * fix1/2 * stuff * finallysomeoneteachesmehowtofixthisshit * FIX * why * . * bitflagsshitflags1 * bitflags-shitflags2 * bitflags-shitflags2 * bitflags_shitflags_4 * autofloating * minerbuffgetthepun? * notouchingfloors * ... * . * f l o a t * kek * kek * fixes * fixes2 * sprites
@@ -75,7 +75,11 @@
|
||||
#define TOXINLOVER 22
|
||||
#define DIGITIGRADE 23 //Uses weird leg sprites. Optional for Lizards, required for ashwalkers. Don't give it to other races unless you make sprites for this (see human_parts_greyscale.dmi)
|
||||
|
||||
#define FLYING 65536
|
||||
//Movement Types
|
||||
#define IMMOBILE 0
|
||||
#define GROUND 1
|
||||
#define FLYING 2
|
||||
|
||||
|
||||
/*
|
||||
These defines are used specifically with the atom/movable/languages bitmask.
|
||||
|
||||
@@ -37,23 +37,26 @@
|
||||
return ..()
|
||||
|
||||
/datum/action/proc/Grant(mob/M)
|
||||
if(owner)
|
||||
if(owner == M)
|
||||
return
|
||||
if(M)
|
||||
if(owner)
|
||||
if(owner == M)
|
||||
return
|
||||
owner = M
|
||||
M.actions += src
|
||||
if(M.client)
|
||||
M.client.screen += button
|
||||
M.update_action_buttons()
|
||||
else
|
||||
Remove(owner)
|
||||
owner = M
|
||||
M.actions += src
|
||||
if(M.client)
|
||||
M.client.screen += button
|
||||
M.update_action_buttons()
|
||||
|
||||
/datum/action/proc/Remove(mob/M)
|
||||
if(M.client)
|
||||
M.client.screen -= button
|
||||
button.moved = FALSE //so the button appears in its normal position when given to another owner.
|
||||
M.actions -= src
|
||||
M.update_action_buttons()
|
||||
if(M)
|
||||
if(M.client)
|
||||
M.client.screen -= button
|
||||
M.actions -= src
|
||||
M.update_action_buttons()
|
||||
owner = null
|
||||
button.moved = FALSE //so the button appears in its normal position when given to another owner.
|
||||
|
||||
/datum/action/proc/Trigger()
|
||||
if(!IsAvailable())
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
environment_smash = 1
|
||||
attacktext = "hits"
|
||||
attack_sound = 'sound/weapons/genhit1.ogg'
|
||||
flying = 1
|
||||
movement_type = FLYING
|
||||
del_on_death = 1
|
||||
deathmessage = "explodes into a cloud of gas!"
|
||||
var/death_cloud_size = 1 //size of cloud produced from a dying spore
|
||||
@@ -130,7 +130,7 @@
|
||||
desc = "A shambling corpse animated by the blob."
|
||||
melee_damage_lower += 8
|
||||
melee_damage_upper += 11
|
||||
flying = 0
|
||||
movement_type = GROUND
|
||||
death_cloud_size = 0
|
||||
icon = H.icon
|
||||
icon_state = "zombie_s"
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
attack_sound = 'sound/magic/clockwork/anima_fragment_attack.ogg'
|
||||
loot = list(/obj/item/clockwork/component/replicant_alloy/smashed_anima_fragment)
|
||||
weather_immunities = list("lava")
|
||||
flying = 1
|
||||
movement_type = FLYING
|
||||
playstyle_string = "<span class='heavy_brass'>You are an anima fragment</span><b>, a clockwork creation of Ratvar. As a fragment, you have low health, do decent damage, and move at \
|
||||
extreme speed in addition to being immune to extreme temperatures and pressures. Taking damage will temporarily slow you down, however. \n Your goal is to serve the Justiciar and his servants \
|
||||
in any way you can. You yourself are one of these servants, and will be able to utilize anything they can, assuming it doesn't require opposable thumbs.</b>"
|
||||
@@ -132,7 +132,7 @@
|
||||
attacktext = "slashes"
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
weather_immunities = list("lava")
|
||||
flying = 1
|
||||
movement_type = FLYING
|
||||
loot = list(/obj/item/clockwork/component/replicant_alloy/fallen_armor)
|
||||
var/true_name = "Meme Master 69" //Required to call forth the marauder
|
||||
var/list/possible_true_names = list("Xaven", "Melange", "Ravan", "Kel", "Rama", "Geke", "Peris", "Vestra", "Skiwa") //All fairly short and easy to pronounce
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
status_flags = 0
|
||||
wander = 0
|
||||
density = 0
|
||||
flying = 1
|
||||
movement_type = FLYING
|
||||
anchored = 1
|
||||
mob_size = MOB_SIZE_TINY
|
||||
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
|
||||
|
||||
@@ -64,14 +64,8 @@
|
||||
/obj/effect/acid/Crossed(AM as mob|obj)
|
||||
if(isliving(AM))
|
||||
var/mob/living/L = AM
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
if(FLYING in H.dna.species.specflags)
|
||||
return
|
||||
else if(isanimal(L))
|
||||
var/mob/living/simple_animal/SA = L
|
||||
if(SA.flying)
|
||||
return
|
||||
if(L.movement_type & FLYING)
|
||||
return
|
||||
if(L.m_intent != "walk" && prob(40))
|
||||
var/acid_used = min(acid_level*0.05, 20)
|
||||
if(L.acid_act(10, acid_used, "feet"))
|
||||
|
||||
@@ -53,8 +53,14 @@
|
||||
icon_state = "ion_trails"
|
||||
anchored = 1
|
||||
|
||||
/obj/effect/particle_effect/ion_trails/flight
|
||||
icon_state = "ion_trails_flight"
|
||||
|
||||
/datum/effect_system/trail_follow/ion
|
||||
effect_type = /obj/effect/particle_effect/ion_trails
|
||||
var/fadetype = "ion_fade"
|
||||
var/fade = 1
|
||||
var/nograv_required = 1
|
||||
|
||||
/datum/effect_system/trail_follow/ion/start() //Whoever is responsible for this abomination of code should become an hero
|
||||
if(!on)
|
||||
@@ -66,11 +72,12 @@
|
||||
processing = 0
|
||||
var/turf/T = get_turf(holder)
|
||||
if(T != oldposition)
|
||||
if(!T.has_gravity())
|
||||
if(!T.has_gravity() || !nograv_required)
|
||||
var/obj/effect/particle_effect/ion_trails/I = PoolOrNew(effect_type, oldposition)
|
||||
I.setDir(holder.dir)
|
||||
flick("ion_fade", I)
|
||||
I.icon_state = ""
|
||||
set_dir(I)
|
||||
if(fade)
|
||||
flick(fadetype, I)
|
||||
I.icon_state = ""
|
||||
spawn(20)
|
||||
qdel(I)
|
||||
oldposition = T
|
||||
@@ -79,7 +86,18 @@
|
||||
processing = 1
|
||||
start()
|
||||
|
||||
/datum/effect_system/trail_follow/ion/proc/set_dir(obj/effect/particle_effect/ion_trails/I)
|
||||
I.setDir(holder.dir)
|
||||
|
||||
/datum/effect_system/trail_follow/ion/flight
|
||||
effect_type = /obj/effect/particle_effect/ion_trails/flight
|
||||
fadetype = "ion_fade_flight"
|
||||
nograv_required = 0
|
||||
|
||||
/datum/effect_system/trail_follow/ion/flight/set_dir(obj/effect/particle_effect/ion_trails/I)
|
||||
if(istype(holder, /obj/item/device/flightpack))
|
||||
var/obj/item/device/flightpack/F = holder
|
||||
I.setDir(F.suit.user.dir)
|
||||
|
||||
|
||||
//Reagent-based explosion effect
|
||||
|
||||
@@ -11,10 +11,10 @@
|
||||
victim << "<span class='danger'>*click*</span>"
|
||||
|
||||
/obj/effect/mine/Crossed(AM as mob|obj)
|
||||
if(isanimal(AM))
|
||||
var/mob/living/simple_animal/SA = AM
|
||||
if(!SA.flying)
|
||||
triggermine(SA)
|
||||
if(ismob(AM))
|
||||
var/mob/MM = AM
|
||||
if(!(MM.movement_type & FLYING))
|
||||
triggermine(AM)
|
||||
else
|
||||
triggermine(AM)
|
||||
|
||||
|
||||
@@ -277,8 +277,10 @@
|
||||
feedback_add_details("handcuffs","B") //Yes, I know they're legcuffs. Don't change this, no need for an extra variable. The "B" is used to tell them apart.
|
||||
else if(isanimal(L))
|
||||
var/mob/living/simple_animal/SA = L
|
||||
if(!SA.flying && SA.mob_size > MOB_SIZE_TINY)
|
||||
if(SA.mob_size > MOB_SIZE_TINY)
|
||||
snap = 1
|
||||
if(L.movement_type & FLYING)
|
||||
snap = 0
|
||||
if(snap)
|
||||
armed = 0
|
||||
icon_state = "[initial(icon_state)][armed]"
|
||||
|
||||
@@ -180,3 +180,6 @@
|
||||
|
||||
/obj/proc/check_uplink_validity()
|
||||
return 1
|
||||
|
||||
/obj/proc/on_mob_move(dir, mob)
|
||||
return
|
||||
|
||||
@@ -120,6 +120,8 @@
|
||||
return 1
|
||||
|
||||
/turf/open/handle_slip(mob/living/carbon/C, s_amount, w_amount, obj/O, lube)
|
||||
if(C.movement_type & FLYING)
|
||||
return 0
|
||||
if(has_gravity(src))
|
||||
var/obj/buckled_obj
|
||||
if(C.buckled)
|
||||
|
||||
@@ -39,9 +39,9 @@
|
||||
//Portals aren't affected by gravity. Probably.
|
||||
return 0
|
||||
//Flies right over the chasm
|
||||
if(isanimal(AM))
|
||||
var/mob/living/simple_animal/SA = AM
|
||||
if(SA.flying)
|
||||
if(isliving(AM))
|
||||
var/mob/MM = AM
|
||||
if(MM.movement_type & FLYING)
|
||||
return 0
|
||||
if(ishuman(AM))
|
||||
var/mob/living/carbon/human/H = AM
|
||||
@@ -51,8 +51,6 @@
|
||||
visible_message("<span class='boldwarning'>[H] falls into [src]!</span>")
|
||||
J.chasm_react(H)
|
||||
return 0
|
||||
if(H.dna && H.dna.species && (FLYING in H.dna.species.specflags))
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/turf/open/chasm/proc/drop(atom/movable/AM)
|
||||
|
||||
@@ -55,10 +55,11 @@
|
||||
O.armor["fire"] = 50
|
||||
O.fire_act(10000, 1000)
|
||||
|
||||
|
||||
else if (isliving(thing))
|
||||
. = 1
|
||||
var/mob/living/L = thing
|
||||
if(L.movement_type & FLYING)
|
||||
continue //YOU'RE FLYING OVER IT
|
||||
if("lava" in L.weather_immunities)
|
||||
continue
|
||||
if(L.buckled)
|
||||
|
||||
@@ -150,7 +150,6 @@
|
||||
/turf/open/floor/engine/cult/airless
|
||||
initial_gas_mix = "TEMP=2.7"
|
||||
|
||||
|
||||
/turf/open/floor/engine/vacuum
|
||||
name = "vacuum floor"
|
||||
initial_gas_mix = "TEMP=2.7"
|
||||
|
||||
@@ -99,6 +99,8 @@
|
||||
//slipping
|
||||
if (istype(AM,/mob/living/carbon))
|
||||
var/mob/living/carbon/M = AM
|
||||
if(M.movement_type & FLYING)
|
||||
return
|
||||
switch(wet)
|
||||
if(TURF_WET_WATER)
|
||||
if(!M.slip(0, 3, null, NO_SLIP_WHEN_WALKING))
|
||||
|
||||
@@ -104,16 +104,15 @@
|
||||
|
||||
/obj/item/device/assembly/mousetrap/Crossed(atom/movable/AM as mob|obj)
|
||||
if(armed)
|
||||
if(ishuman(AM))
|
||||
var/mob/living/carbon/H = AM
|
||||
if(H.m_intent == "run")
|
||||
triggered(H)
|
||||
H.visible_message("<span class='warning'>[H] accidentally steps on [src].</span>", \
|
||||
"<span class='warning'>You accidentally step on [src]</span>")
|
||||
else if(isanimal(AM))
|
||||
var/mob/living/simple_animal/SA = AM
|
||||
if(!SA.flying)
|
||||
triggered(AM)
|
||||
if(ismob(AM))
|
||||
var/mob/MM = AM
|
||||
if(!(MM.movement_type & FLYING))
|
||||
if(ishuman(AM))
|
||||
var/mob/living/carbon/H = AM
|
||||
if(H.m_intent == "run")
|
||||
triggered(H)
|
||||
H.visible_message("<span class='warning'>[H] accidentally steps on [src].</span>", \
|
||||
"<span class='warning'>You accidentally step on [src]</span>")
|
||||
else if(AM.density) // For mousetrap grenades, set off by anything heavy
|
||||
triggered(AM)
|
||||
..()
|
||||
|
||||
@@ -1,15 +1,23 @@
|
||||
/mob/living/carbon/movement_delay()
|
||||
. = ..()
|
||||
. += grab_state * 3 //can't go fast while grabbing something.
|
||||
var/FP
|
||||
if(iscarbon(src))
|
||||
var/mob/living/carbon/C = src
|
||||
var/obj/item/device/flightpack/F = C.get_flightpack()
|
||||
if(istype(F) && F.flight)
|
||||
FP = 1
|
||||
. = ..(FP)
|
||||
if(!FP)
|
||||
. += grab_state * 1 //Flightpacks are too powerful to be slowed too much by the weight of a corpse.
|
||||
else
|
||||
. += grab_state * 3 //can't go fast while grabbing something.
|
||||
|
||||
if(!get_leg_ignore()) //ignore the fact we lack legs
|
||||
var/leg_amount = get_num_legs()
|
||||
. += 6 - 3*leg_amount //the fewer the legs, the slower the mob
|
||||
if(!leg_amount)
|
||||
. += 6 - 3*get_num_arms() //crawling is harder with fewer arms
|
||||
|
||||
if(legcuffed)
|
||||
. += legcuffed.slowdown
|
||||
if(legcuffed)
|
||||
. += legcuffed.slowdown
|
||||
|
||||
|
||||
var/const/NO_SLIP_WHEN_WALKING = 1
|
||||
@@ -18,6 +26,8 @@ var/const/GALOSHES_DONT_HELP = 4
|
||||
var/const/SLIDE_ICE = 8
|
||||
|
||||
/mob/living/carbon/slip(s_amount, w_amount, obj/O, lube)
|
||||
if(movement_type & FLYING)
|
||||
return 0
|
||||
if(!(lube&SLIDE_ICE))
|
||||
add_logs(src,, "slipped",, "on [O ? O.name : "floor"]")
|
||||
return loc.handle_slip(src, s_amount, w_amount, O, lube)
|
||||
@@ -29,6 +39,10 @@ var/const/SLIDE_ICE = 8
|
||||
if(!isturf(loc))
|
||||
return 0
|
||||
|
||||
var/obj/item/device/flightpack/F = get_flightpack()
|
||||
if(istype(F) && (F.flight) && F.allow_thrust(0.01, src))
|
||||
return 1
|
||||
|
||||
// Do we have a jetpack implant (and is it on)?
|
||||
var/obj/item/organ/cyberimp/chest/thrusters/T = getorganslot("thrusters")
|
||||
if(istype(T) && movement_dir && T.allow_thrust(0.01))
|
||||
@@ -38,8 +52,6 @@ var/const/SLIDE_ICE = 8
|
||||
if(istype(J) && (movement_dir || J.stabilizers) && J.allow_thrust(0.01, src))
|
||||
return 1
|
||||
|
||||
|
||||
|
||||
/mob/living/carbon/Move(NewLoc, direct)
|
||||
. = ..()
|
||||
if(.)
|
||||
|
||||
@@ -911,3 +911,9 @@
|
||||
Weaken(10)
|
||||
return 1
|
||||
..()
|
||||
|
||||
/mob/living/carbon/human/Bump(atom/A)
|
||||
..()
|
||||
var/obj/item/device/flightpack/FP = get_flightpack()
|
||||
if(FP)
|
||||
FP.flight_impact(A)
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
. += ..()
|
||||
. += config.human_delay
|
||||
|
||||
|
||||
/mob/living/carbon/human/slip(s_amount, w_amount, obj/O, lube)
|
||||
if(isobj(shoes) && (shoes.flags&NOSLIP) && !(lube&GALOSHES_DONT_HELP))
|
||||
return 0
|
||||
@@ -60,4 +59,4 @@
|
||||
/mob/living/carbon/human/Process_Spacemove(movement_dir = 0) //Temporary laziness thing. Will change to handles by species reee.
|
||||
if(..())
|
||||
return 1
|
||||
return dna.species.space_move()
|
||||
return dna.species.space_move(src)
|
||||
|
||||
@@ -864,15 +864,23 @@
|
||||
|
||||
/datum/species/proc/movement_delay(mob/living/carbon/human/H)
|
||||
. = 0
|
||||
var/obj/item/device/flightpack/F = H.get_flightpack()
|
||||
var/flightpack = 0
|
||||
if(istype(F) && F.flight)
|
||||
flightpack = 1
|
||||
var/flight = 0
|
||||
if(H.movement_type & FLYING)
|
||||
flight = 1
|
||||
|
||||
if(H.status_flags & GOTTAGOFAST)
|
||||
. -= 1
|
||||
if(H.status_flags & GOTTAGOREALLYFAST)
|
||||
. -= 2
|
||||
if(!flightpack)
|
||||
if(H.status_flags & GOTTAGOFAST)
|
||||
. -= 1
|
||||
if(H.status_flags & GOTTAGOREALLYFAST)
|
||||
. -= 2
|
||||
|
||||
if(!(H.status_flags & IGNORESLOWDOWN))
|
||||
if(!H.has_gravity())
|
||||
if(FLYING in specflags)
|
||||
if((H.movement_type & FLYING) && !flightpack) //No hyperstacking angel wings!
|
||||
. += speedmod
|
||||
return
|
||||
// If there's no gravity we have the sanic speed of jetpack.
|
||||
@@ -888,30 +896,36 @@
|
||||
if(istype(T) && T.allow_thrust(0.01, H))
|
||||
. -= 2
|
||||
|
||||
else
|
||||
else if(flightpack && F.allow_thrust(0.01, src)) //No jetpack/flightsuit hyperstacking!
|
||||
. -= 1
|
||||
|
||||
if(H.wear_suit)
|
||||
. += H.wear_suit.slowdown
|
||||
if(H.shoes)
|
||||
. += H.shoes.slowdown
|
||||
if(H.back)
|
||||
. += H.back.slowdown
|
||||
for(var/obj/item/I in H.held_items)
|
||||
if(I.flags & HANDSLOW)
|
||||
. += I.slowdown
|
||||
if(!(flightpack))
|
||||
var/health_deficiency = (100 - H.health + H.staminaloss)
|
||||
if(health_deficiency >= 40)
|
||||
. += (health_deficiency / 25)
|
||||
if(flight)
|
||||
. += (health_deficiency / 75)
|
||||
else
|
||||
. += (health_deficiency / 25)
|
||||
|
||||
var/hungry = (500 - H.nutrition) / 5 // So overeat would be 100 and default level would be 80
|
||||
if(hungry >= 70)
|
||||
if((hungry >= 70) && !flight) //Being hungry won't stop you from using flightpack controls/flapping your wings although it probably will in the wing case but who cares.
|
||||
. += hungry / 50
|
||||
|
||||
if(H.wear_suit)
|
||||
. += H.wear_suit.slowdown
|
||||
if(H.shoes)
|
||||
. += H.shoes.slowdown
|
||||
if(H.back)
|
||||
. += H.back.slowdown
|
||||
for(var/obj/item/I in H.held_items)
|
||||
if(I.flags & HANDSLOW)
|
||||
. += I.slowdown
|
||||
if((H.disabilities & FAT))
|
||||
. += 1.5
|
||||
. += (1.5 - flight)
|
||||
if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT)
|
||||
. += (BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR
|
||||
|
||||
. += speedmod
|
||||
. += speedmod
|
||||
|
||||
//////////////////
|
||||
// ATTACK PROCS //
|
||||
@@ -1335,10 +1349,10 @@
|
||||
//Space Move//
|
||||
//////////////
|
||||
|
||||
/datum/species/proc/space_move()
|
||||
/datum/species/proc/space_move(mob/living/carbon/human/H)
|
||||
return 0
|
||||
|
||||
/datum/species/proc/negates_gravity()
|
||||
/datum/species/proc/negates_gravity(mob/living/carbon/human/H)
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
/datum/species/human/qualifies_for_rank(rank, list/features)
|
||||
if((!features["tail_human"] || features["tail_human"] == "None") && (!features["ears"] || features["ears"] == "None"))
|
||||
return 1 //Pure humans are always allowed in all roles.
|
||||
return TRUE //Pure humans are always allowed in all roles.
|
||||
return ..()
|
||||
|
||||
//Curiosity killed the cat's wagging tail.
|
||||
@@ -23,6 +23,10 @@
|
||||
if(H)
|
||||
H.endTailWag()
|
||||
|
||||
/datum/species/human/space_move(mob/living/carbon/human/H)
|
||||
var/obj/item/device/flightpack/F = H.get_flightpack()
|
||||
if(istype(F) && (F.flight) && F.allow_thrust(0.01, src))
|
||||
return TRUE
|
||||
/*
|
||||
LIZARDPEOPLE
|
||||
*/
|
||||
@@ -1003,8 +1007,8 @@ SYNDICATE BLACK OPS
|
||||
/datum/species/angel/on_species_loss(mob/living/carbon/human/H)
|
||||
if(fly)
|
||||
fly.Remove(H)
|
||||
if(FLYING in specflags)
|
||||
specflags -= FLYING
|
||||
if(H.movement_type & FLYING)
|
||||
H.movement_type &= ~FLYING
|
||||
ToggleFlight(H,0)
|
||||
if(H.dna && H.dna.species &&((H.dna.features["wings"] != "None") && ("wings" in H.dna.species.mutant_bodyparts)))
|
||||
H.dna.features["wings"] = "None"
|
||||
@@ -1015,15 +1019,12 @@ SYNDICATE BLACK OPS
|
||||
HandleFlight(H)
|
||||
|
||||
/datum/species/angel/proc/HandleFlight(mob/living/carbon/human/H)
|
||||
if(FLYING in specflags)
|
||||
if(H.movement_type & FLYING)
|
||||
if(!CanFly(H))
|
||||
ToggleFlight(H,0)
|
||||
H.float(0)
|
||||
return 0
|
||||
H.float(1)
|
||||
return 1
|
||||
else
|
||||
H.float(0)
|
||||
return 0
|
||||
|
||||
/datum/species/angel/proc/CanFly(mob/living/carbon/human/H)
|
||||
@@ -1052,7 +1053,7 @@ SYNDICATE BLACK OPS
|
||||
var/mob/living/carbon/human/H = owner
|
||||
var/datum/species/angel/A = H.dna.species
|
||||
if(A.CanFly(H))
|
||||
if(FLYING in A.specflags)
|
||||
if(H.movement_type & FLYING)
|
||||
H << "<span class='notice'>You settle gently back onto the ground...</span>"
|
||||
A.ToggleFlight(H,0)
|
||||
H.update_canmove()
|
||||
@@ -1089,31 +1090,31 @@ SYNDICATE BLACK OPS
|
||||
|
||||
|
||||
/datum/species/angel/spec_stun(mob/living/carbon/human/H,amount)
|
||||
if(FLYING in specflags)
|
||||
if(H.movement_type & FLYING)
|
||||
ToggleFlight(H,0)
|
||||
flyslip(H)
|
||||
. = ..()
|
||||
|
||||
/datum/species/angel/negates_gravity()
|
||||
if(FLYING in specflags)
|
||||
/datum/species/angel/negates_gravity(mob/living/carbon/human/H)
|
||||
if(H.movement_type & FLYING)
|
||||
return 1
|
||||
|
||||
/datum/species/angel/space_move()
|
||||
if(FLYING in specflags)
|
||||
/datum/species/angel/space_move(mob/living/carbon/human/H)
|
||||
if(H.movement_type & FLYING)
|
||||
return 1
|
||||
|
||||
/datum/species/angel/proc/ToggleFlight(mob/living/carbon/human/H,flight)
|
||||
if(flight && CanFly(H))
|
||||
stunmod = 2
|
||||
speedmod = -1
|
||||
specflags += FLYING
|
||||
H.movement_type |= FLYING
|
||||
override_float = 1
|
||||
H.pass_flags |= PASSTABLE
|
||||
H.OpenWings()
|
||||
else
|
||||
stunmod = 1
|
||||
speedmod = 0
|
||||
specflags -= FLYING
|
||||
H.movement_type &= ~FLYING
|
||||
override_float = 0
|
||||
H.pass_flags &= ~PASSTABLE
|
||||
H.CloseWings()
|
||||
|
||||
@@ -50,10 +50,15 @@
|
||||
if(stat != DEAD)
|
||||
handle_status_effects() //all special effects, stunned, weakened, jitteryness, hallucination, sleeping, etc
|
||||
|
||||
if(floating && (!(movement_type & FLYING)))
|
||||
float(0)
|
||||
|
||||
if(movement_type & FLYING)
|
||||
float(1)
|
||||
|
||||
if(stat != DEAD)
|
||||
return 1
|
||||
|
||||
|
||||
/mob/living/proc/handle_breathing()
|
||||
return
|
||||
|
||||
|
||||
@@ -438,18 +438,21 @@
|
||||
if (s_active && !(s_active.ClickAccessible(src, depth=STORAGE_VIEW_DEPTH) || s_active.Adjacent(src)))
|
||||
s_active.close(src)
|
||||
|
||||
/mob/living/movement_delay()
|
||||
/mob/living/movement_delay(ignorewalk = 0)
|
||||
. = ..()
|
||||
if(isopenturf(loc))
|
||||
if(isopenturf(loc) && !is_flying())
|
||||
var/turf/open/T = loc
|
||||
. += T.slowdown
|
||||
switch(m_intent)
|
||||
if("run")
|
||||
if(drowsyness > 0)
|
||||
. += 6
|
||||
. += config.run_speed
|
||||
if("walk")
|
||||
. += config.walk_speed
|
||||
if(!ignorewalk)
|
||||
. += config.run_speed
|
||||
else
|
||||
switch(m_intent)
|
||||
if("run")
|
||||
if(drowsyness > 0)
|
||||
. += 6
|
||||
. += config.run_speed
|
||||
if("walk")
|
||||
. += config.walk_speed
|
||||
|
||||
/mob/living/proc/makeTrail(turf/T)
|
||||
if(!has_gravity())
|
||||
@@ -603,6 +606,8 @@
|
||||
fixed = 1
|
||||
if(on && !floating && !fixed)
|
||||
animate(src, pixel_y = pixel_y + 2, time = 10, loop = -1)
|
||||
sleep(10)
|
||||
animate(src, pixel_y = pixel_y - 2, time = 10, loop = -1)
|
||||
floating = 1
|
||||
else if(((!on || fixed) && floating))
|
||||
animate(src, pixel_y = get_standard_pixel_y_offset(lying), time = 10)
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
maxbodytemp = INFINITY
|
||||
healable = 0
|
||||
faction = list("cult")
|
||||
flying = 1
|
||||
movement_type = FLYING
|
||||
pressure_resistance = 100
|
||||
unique_name = 1
|
||||
AIStatus = AI_OFF //normal constructs don't have AI
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
harm_intent_damage = 1
|
||||
friendly = "nudges"
|
||||
density = 0
|
||||
flying = 1
|
||||
movement_type = FLYING
|
||||
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
|
||||
ventcrawler = 2
|
||||
mob_size = MOB_SIZE_TINY
|
||||
|
||||
@@ -21,7 +21,7 @@ var/global/list/parasites = list() //all currently existing/living guardians
|
||||
speed = 0
|
||||
a_intent = "harm"
|
||||
stop_automated_movement = 1
|
||||
flying = 1 // Immunity to chasms and landmines, etc.
|
||||
movement_type = FLYING // Immunity to chasms and landmines, etc.
|
||||
attack_sound = 'sound/weapons/punch1.ogg'
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
mouse_opacity = 2
|
||||
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
|
||||
mob_size = MOB_SIZE_TINY
|
||||
flying = 1
|
||||
movement_type = FLYING
|
||||
gold_core_spawnable = 1
|
||||
search_objects = 1 //have to find those plant trays!
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
maxbodytemp = 1500
|
||||
|
||||
faction = list("carp")
|
||||
flying = 1
|
||||
movement_type = FLYING
|
||||
pressure_resistance = 200
|
||||
gold_core_spawnable = 1
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
melee_damage_upper = 25
|
||||
attacktext = "blinks at"
|
||||
attack_sound = 'sound/weapons/pierce.ogg'
|
||||
flying = 1
|
||||
movement_type = FLYING
|
||||
|
||||
faction = list("spooky")
|
||||
del_on_death = 1
|
||||
@@ -606,7 +606,7 @@ Difficulty: Very Hard
|
||||
harm_intent_damage = 1
|
||||
friendly = "mends"
|
||||
density = 0
|
||||
flying = 1
|
||||
movement_type = FLYING
|
||||
pass_flags = PASSTABLE | PASSGRILLE | PASSMOB
|
||||
ventcrawler = 2
|
||||
mob_size = MOB_SIZE_TINY
|
||||
@@ -622,6 +622,7 @@ Difficulty: Very Hard
|
||||
languages_understood = ALL
|
||||
del_on_death = 1
|
||||
unsuitable_atmos_damage = 0
|
||||
movement_type = FLYING
|
||||
minbodytemp = 0
|
||||
maxbodytemp = 1500
|
||||
obj_damage = 0
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
luminosity = 3
|
||||
faction = list("mining", "boss")
|
||||
weather_immunities = list("lava","ash")
|
||||
flying = 1
|
||||
movement_type = FLYING
|
||||
robust_searching = 1
|
||||
ranged_ignores_vision = TRUE
|
||||
stat_attack = 2
|
||||
|
||||
@@ -322,7 +322,7 @@
|
||||
speed = 3
|
||||
maxHealth = 1
|
||||
health = 1
|
||||
flying = 1
|
||||
movement_type = FLYING
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 2
|
||||
melee_damage_upper = 2
|
||||
@@ -713,7 +713,7 @@
|
||||
speak_emote = list("telepathically cries")
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
stat_attack = 1
|
||||
flying = TRUE
|
||||
movement_type = FLYING
|
||||
robust_searching = 1
|
||||
loot = list()
|
||||
butcher_results = list(/obj/item/weapon/ore/diamond = 2, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 1)
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
environment_smash = 0
|
||||
ventcrawler = 2
|
||||
mob_size = MOB_SIZE_TINY
|
||||
flying = 1
|
||||
movement_type = FLYING
|
||||
speak_emote = list("squeaks")
|
||||
var/max_co2 = 0 //to be removed once metastation map no longer use those for Sgt Araneus
|
||||
var/min_oxy = 0
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
maxbodytemp = 1500
|
||||
flying = 1
|
||||
movement_type = FLYING
|
||||
pressure_resistance = 300
|
||||
gold_core_spawnable = 0 //too spooky for science
|
||||
var/ghost_hair_style
|
||||
|
||||
@@ -163,7 +163,7 @@
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
mob_size = MOB_SIZE_TINY
|
||||
flying = 1
|
||||
movement_type = FLYING
|
||||
limb_destroyer = 1
|
||||
speak_emote = list("states")
|
||||
bubble_icon = "syndibot"
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
attacktext = "chomps"
|
||||
friendly = "grooms"
|
||||
mob_size = MOB_SIZE_SMALL
|
||||
flying = 1
|
||||
movement_type = FLYING
|
||||
gold_core_spawnable = 2
|
||||
|
||||
var/parrot_damage_upper = 10
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
status_flags = 0
|
||||
faction = list("cult")
|
||||
status_flags = CANPUSH
|
||||
flying = 1
|
||||
movement_type = FLYING
|
||||
loot = list(/obj/item/weapon/ectoplasm)
|
||||
del_on_death = 1
|
||||
|
||||
|
||||
@@ -62,7 +62,6 @@
|
||||
|
||||
//simple_animal access
|
||||
var/obj/item/weapon/card/id/access_card = null //innate access uses an internal ID card
|
||||
var/flying = 0 //whether it's flying or touching the ground.
|
||||
var/buffed = 0 //In the event that you want to have a buffing effect on the mob, but don't want it to stack with other effects, any outside force that applies a buff to a simple mob should at least set this to 1, so we have something to check against
|
||||
var/gold_core_spawnable = 0 //if 1 can be spawned by plasma with gold core, 2 are 'friendlies' spawned with blood
|
||||
|
||||
|
||||
@@ -69,4 +69,5 @@
|
||||
AA.display_to(list(src))
|
||||
|
||||
update_client_colour()
|
||||
client.click_intercept = null
|
||||
if(client)
|
||||
client.click_intercept = null
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
var/obj/machinery/machine = null
|
||||
var/other_mobs = null
|
||||
var/disabilities = 0 //Carbon
|
||||
var/movement_type = GROUND //Incase you have multiple types, you automatically use the most useful one. IE: Skating on ice, flippers on water, flying over chasm/space, etc.
|
||||
|
||||
var/atom/movable/pulling = null
|
||||
var/grab_state = 0
|
||||
|
||||
@@ -483,3 +483,8 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
|
||||
for(var/obj/screen/wheel/talk/TW in L.hud_used.wheels)
|
||||
TW.Click()
|
||||
|
||||
/mob/proc/is_flying(mob/M = src)
|
||||
if(M.movement_type & FLYING)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
@@ -175,6 +175,9 @@
|
||||
if(mob && .)
|
||||
mob.throwing = 0
|
||||
|
||||
for(var/obj/O in mob)
|
||||
O.on_mob_move(direct, src)
|
||||
|
||||
return .
|
||||
|
||||
|
||||
|
||||
@@ -709,3 +709,33 @@
|
||||
construction_time = 100
|
||||
build_path = /obj/item/device/assembly/flash/handheld
|
||||
category = list("Misc")
|
||||
|
||||
/datum/design/flightsuit //Multi step build process/redo WIP
|
||||
name = "Flight Suit"
|
||||
desc = "A specialized hardsuit that is able to attach a flightpack and accessories.."
|
||||
id = "flightsuit"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/clothing/suit/space/hardsuit/flightsuit
|
||||
materials = list(MAT_METAL=20000, MAT_GLASS = 10000, MAT_DIAMOND = 200, MAT_GOLD = 3000, MAT_SILVER = 3000, MAT_TITANIUM = 20000) //This expensive enough for you?
|
||||
construction_time = 250
|
||||
category = list("Misc")
|
||||
|
||||
/datum/design/flightpack
|
||||
name = "Flight Pack"
|
||||
desc = "An advanced back-worn system that has dual ion engines powerful enough to grant a humanoid flight. Contains an internal self-recharging high-current capacitor for short, powerful boosts."
|
||||
id = "flightpack"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/device/flightpack
|
||||
materials = list(MAT_METAL=20000, MAT_GLASS = 10000, MAT_DIAMOND = 5000, MAT_GOLD = 15000, MAT_SILVER = 15000, MAT_URANIUM = 25000, MAT_PLASMA = 20000, MAT_TITANIUM = 20000) //This expensive enough for you?
|
||||
construction_time = 250
|
||||
category = list("Misc")
|
||||
|
||||
/datum/design/flightshoes
|
||||
name = "Flight Shoes"
|
||||
desc = "Flight shoes, attachable to a flight suit to provide additional functions."
|
||||
id = "flightshoes"
|
||||
build_type = MECHFAB
|
||||
build_path = /obj/item/clothing/shoes/flightshoes
|
||||
materials = list(MAT_METAL = 5000, MAT_GLASS = 5000, MAT_GOLD = 1500, MAT_SILVER = 1500, MAT_PLASMA = 2000, MAT_TITANIUM = 2000) //They're just shoes.
|
||||
construction_time = 100
|
||||
category = list("Misc")
|
||||
@@ -89,7 +89,7 @@
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/get_leg_ignore()
|
||||
if(FLYING in dna.species.specflags)
|
||||
if(movement_type & FLYING)
|
||||
return 1
|
||||
|
||||
/mob/living/proc/get_missing_limbs()
|
||||
|
||||
|
Before Width: | Height: | Size: 511 KiB After Width: | Height: | Size: 513 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 155 KiB After Width: | Height: | Size: 159 KiB |
|
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 151 KiB After Width: | Height: | Size: 152 KiB |
|
Before Width: | Height: | Size: 298 KiB After Width: | Height: | Size: 300 KiB |
|
After Width: | Height: | Size: 9.3 KiB |
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 9.7 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 101 KiB After Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 36 KiB |
@@ -1104,6 +1104,7 @@
|
||||
#include "code\modules\clothing\shoes\magboots.dm"
|
||||
#include "code\modules\clothing\shoes\miscellaneous.dm"
|
||||
#include "code\modules\clothing\spacesuits\chronosuit.dm"
|
||||
#include "code\modules\clothing\spacesuits\flightsuit.dm"
|
||||
#include "code\modules\clothing\spacesuits\hardsuit.dm"
|
||||
#include "code\modules\clothing\spacesuits\miscellaneous.dm"
|
||||
#include "code\modules\clothing\spacesuits\plasmamen.dm"
|
||||
|
||||