TG: Adds a new special object (stop) that can be used when you need someone to stop

moving right away, even before the next life().  Used in door crushing to
prevent people from inertiaing through.  Checks for /obj/special/stop in loc
every move.  Compared to the number of other checks, I don't expect this to be
an undo burden, but can be commented out in case of OH SHIT LAG under heavy
load.
Moves /area/entered to its own file.
Adds a new area var called has_gravity.  Determines if floor tiles count for
movement control (planning on adding more, currently can only be badmined)
Adds a new mob var called lastarea that is updated with the area you're in every
time /area/entered is called. r2917
Moves /obj/special/stop into /obj/effect/stop.
Thunks people when gravity changes. r2918
This commit is contained in:
Ren Erthilo
2012-04-09 14:35:18 +01:00
parent 4a39151e9e
commit 19cf6b3b47
10 changed files with 200 additions and 60 deletions

View File

@@ -1,3 +1,7 @@
// Areas.dm
// === // ===
/area/ /area/
var/global/global_uid = 0 var/global/global_uid = 0
@@ -5,6 +9,7 @@
/area/New() /area/New()
master = src //moved outside the spawn(1) to avoid runtimes in lighting.dm when it references src.loc.loc.master ~Carn
src.icon = 'alert.dmi' src.icon = 'alert.dmi'
uid = ++global_uid uid = ++global_uid
spawn(1) spawn(1)
@@ -14,7 +19,6 @@
if(sd_created) if(sd_created)
related += src related += src
return return
master = src
related = list(src) related = list(src)
src.icon = 'alert.dmi' src.icon = 'alert.dmi'
@@ -27,6 +31,7 @@
power_light = 0 power_light = 0
power_equip = 0 power_equip = 0
power_environ = 0 power_environ = 0
//has_gravity = 0 // Space has gravity. Because.. because.
if(!requires_power) if(!requires_power)
power_light = 0//rastaf0 power_light = 0//rastaf0
@@ -40,6 +45,8 @@
//sd_SetLuminosity(0) // *DAL* //sd_SetLuminosity(0) // *DAL*
/*spawn(5) /*spawn(5)
for(var/turf/T in src) // count the number of turfs (for lighting calc) for(var/turf/T in src) // count the number of turfs (for lighting calc)
if(no_air) if(no_air)
@@ -269,3 +276,90 @@
master.used_light += amount master.used_light += amount
if(ENVIRON) if(ENVIRON)
master.used_environ += amount master.used_environ += amount
/area/Entered(A)
var/sound = null
var/musVolume = 25
sound = 'ambigen1.ogg'
if (ismob(A))
if (istype(A, /mob/dead/observer)) return
if (!A:ckey)
return
if(istype(A,/mob/living))
if(!A:lastarea)
A:lastarea = get_area(A:loc)
//world << "Entered new area [get_area(A:loc)]"
var/area/newarea = get_area(A:loc)
var/area/oldarea = A:lastarea
if((oldarea.has_gravity == 0) && (newarea.has_gravity == 1) && (A:m_intent == "run")) // Being ready when you change areas gives you a chance to avoid falling all together.
thunk(A)
A:lastarea = newarea
//if (A:ear_deaf) return
if (A && A:client && !A:client:ambience_playing && !A:client:no_ambi) // Ambience goes down here -- make sure to list each area seperately for ease of adding things in later, thanks! Note: areas adjacent to each other should have the same sounds to prevent cutoff when possible.- LastyScratch
A:client:ambience_playing = 1
A << sound('shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = 2)
switch(src.name)
if ("Chapel") sound = pick('ambicha1.ogg','ambicha2.ogg','ambicha3.ogg','ambicha4.ogg')
if ("Morgue") sound = pick('ambimo1.ogg','ambimo2.ogg','title2.ogg')
if ("Space") sound = pick('ambispace.ogg','title2.ogg',)
if ("Engine Control", "Engineering", "Engineering SMES") sound = pick('ambisin1.ogg','ambisin2.ogg','ambisin3.ogg','ambisin4.ogg')
if ("AI Satellite Teleporter Room") sound = pick('ambimalf.ogg')
if ("AI Upload Foyer") sound = pick('ambimalf.ogg')
if ("AI Upload Chamber") sound = pick('ambimalf.ogg')
if ("Mine")
sound = pick('ambimine.ogg')
musVolume = 25
else
sound = pick('ambigen1.ogg','ambigen3.ogg','ambigen4.ogg','ambigen5.ogg','ambigen6.ogg','ambigen7.ogg','ambigen8.ogg','ambigen9.ogg','ambigen10.ogg','ambigen11.ogg','ambigen12.ogg','ambigen14.ogg')
if(findtext(src.name, "Telecommunications"))
sound = pick('ambisin2.ogg', 'signal.ogg', 'signal.ogg', 'ambigen10.ogg')
if (prob(35))
if(A && A:client && !A:client:played)
A << sound(sound, repeat = 0, wait = 0, volume = musVolume, channel = 1)
A:client:played = 1
spawn(600)
if(A && A:client)
A:client:played = 0
/area/proc/gravitychange(var/gravitystate = 0, var/area/A)
A.has_gravity = gravitystate
for(var/area/SubA in A.related)
SubA.has_gravity = gravitystate
if(gravitystate)
for(var/mob/living/carbon/human/M in SubA)
thunk(M)
/area/proc/thunk(mob)
if(istype(mob,/mob/living/carbon/human/)) // Only humans can wear magboots, so we give them a chance to.
if((istype(mob:shoes, /obj/item/clothing/shoes/magboots) && (mob:shoes.flags & NOSLIP)))
return
if(istype(get_turf(mob), /turf/space)) // Can't fall onto nothing.
return
if((istype(mob,/mob/living/carbon/human/)) && (mob:m_intent == "run")) // Only clumbsy humans can fall on their asses.
mob:AdjustStunned(5)
mob:AdjustWeakened(5)
else if (istype(mob,/mob/living/carbon/human/))
mob:AdjustStunned(2)
mob:AdjustWeakened(2)
mob << "Gravity!"

View File

@@ -145,10 +145,15 @@
if(W.loc == my_target) break if(W.loc == my_target) break
sleep(2) sleep(2)
if(istype(usr.loc, /turf/space)|| (user.flags & NOGRAV)) if((istype(usr.loc, /turf/space)) || (usr.lastarea.has_gravity == 0))
user.inertia_dir = get_dir(target, user) user.inertia_dir = get_dir(target, user)
step(user, user.inertia_dir) step(user, user.inertia_dir)
/*
if(istype(usr.loc, /turf/space)|| (user.flags & NOGRAV))
user.inertia_dir = get_dir(target, user)
step(user, user.inertia_dir)
*/
else else
return ..() return ..()
return return

View File

@@ -77,44 +77,3 @@ client/verb/Toggle_Soundscape() //All new ambience should be added here so it wo
return return
/area/Entered(A)
var/sound = null
var/musVolume = 25
sound = 'ambigen1.ogg'
if (ismob(A))
if (istype(A, /mob/dead/observer)) return
if (!A:client) return
//if (A:ear_deaf) return
// if (A && A:client && !A:client:ambience_playing && !A:client:no_ambi) // Ambience goes down here -- make sure to list each area seperately for ease of adding things in later, thanks! Note: areas next to each other should have the same sounds to prevent cutoff when possible.- LastyScratch
// A:client:ambience_playing = 1
// A << sound('shipambience.ogg', repeat = 1, wait = 0, volume = 35, channel = 2)
switch(src.name)
if ("Chapel") sound = pick('ambicha1.ogg','ambicha2.ogg','ambicha3.ogg','ambicha4.ogg')
if ("Morgue") sound = pick('ambimo1.ogg','ambimo2.ogg','title2.ogg')
if ("Space") sound = pick('ambispace.ogg','title2.ogg',)
if ("Engine Control") sound = pick('ambisin1.ogg','ambisin2.ogg','ambisin3.ogg','ambisin4.ogg')
if ("Atmospherics") sound = pick('ambiatm1.ogg')
if ("AI Sat Ext") sound = pick('ambiruntime.ogg','ambimalf.ogg')
if ("AI Satellite") sound = pick('ambimalf.ogg')
if ("AI Satellite Teleporter Room") sound = pick('ambiruntime.ogg','ambimalf.ogg')
if ("Bar") sound = pick('null.ogg')
if ("AI Upload Foyer") sound = pick('ambimalf.ogg', 'null.ogg')
if ("AI Upload Chamber") sound = pick('ambimalf.ogg','null.ogg')
if ("Mine")
sound = pick('ambimine.ogg')
musVolume = 25
else
sound = pick('ambiruntime.ogg','ambigen1.ogg','ambigen3.ogg','ambigen4.ogg','ambigen5.ogg','ambigen6.ogg','ambigen7.ogg','ambigen8.ogg','ambigen9.ogg','ambigen10.ogg','ambigen11.ogg','ambigen12.ogg','ambigen14.ogg')
if (prob(35))
if(A && A:client && !A:client:played)
A << sound(sound, repeat = 0, wait = 0, volume = musVolume, channel = 1)
A:client:played = 1
spawn(600)
if(A && A:client)
A:client:played = 0

View File

@@ -64,10 +64,20 @@
item.layer = initial(item.layer) item.layer = initial(item.layer)
src.visible_message("\red [src] has thrown [item].") src.visible_message("\red [src] has thrown [item].")
var/area/a = get_area(src.loc)
if((istype(src.loc, /turf/space)) || (a.has_gravity == 0))
src.inertia_dir = get_dir(target, src)
step(src, inertia_dir)
/*
if(istype(src.loc, /turf/space) || (src.flags & NOGRAV)) //they're in space, move em one space in the opposite direction if(istype(src.loc, /turf/space) || (src.flags & NOGRAV)) //they're in space, move em one space in the opposite direction
src.inertia_dir = get_dir(target, src) src.inertia_dir = get_dir(target, src)
step(src, inertia_dir) step(src, inertia_dir)
*/
item.throw_at(target, item.throw_range, item.throw_speed) item.throw_at(target, item.throw_range, item.throw_speed)
@@ -150,10 +160,14 @@
dy = SOUTH dy = SOUTH
var/dist_travelled = 0 var/dist_travelled = 0
var/dist_since_sleep = 0 var/dist_since_sleep = 0
var/area/a = get_area(src.loc)
var/turf/target_turf = get_turf(target) var/turf/target_turf = get_turf(target)
if(dist_x > dist_y) if(dist_x > dist_y)
var/error = dist_x/2 - dist_y var/error = dist_x/2 - dist_y
while(((((src.x < target.x && dx == EAST) || (src.x > target.x && dx == WEST)) && dist_travelled < range) || istype(src.loc, /turf/space)) && src.throwing && istype(src.loc, /turf))
while(((((src.x < target.x && dx == EAST) || (src.x > target.x && dx == WEST)) && dist_travelled < range) || (a.has_gravity == 0) || istype(src.loc, /turf/space)) && src.throwing && istype(src.loc, /turf))
// only stop when we've gone the whole distance (or max throw range) and are on a non-space tile, or hit something, or hit the end of the map, or someone picks it up // only stop when we've gone the whole distance (or max throw range) and are on a non-space tile, or hit something, or hit the end of the map, or someone picks it up
if(error < 0) if(error < 0)
var/atom/step = get_step(src, dy) var/atom/step = get_step(src, dy)
@@ -179,9 +193,11 @@
if(dist_since_sleep >= speed) if(dist_since_sleep >= speed)
dist_since_sleep = 0 dist_since_sleep = 0
sleep(1) sleep(1)
a = get_area(src.loc)
else else
var/error = dist_y/2 - dist_x var/error = dist_y/2 - dist_x
while(src && target &&((((src.y < target.y && dy == NORTH) || (src.y > target.y && dy == SOUTH)) && dist_travelled < range) || istype(src.loc, /turf/space)) && src.throwing && istype(src.loc, /turf)) while(src && target &&((((src.y < target.y && dy == NORTH) || (src.y > target.y && dy == SOUTH)) && dist_travelled < range) || (a.has_gravity == 0) || istype(src.loc, /turf/space)) && src.throwing && istype(src.loc, /turf))
// only stop when we've gone the whole distance (or max throw range) and are on a non-space tile, or hit something, or hit the end of the map, or someone picks it up // only stop when we've gone the whole distance (or max throw range) and are on a non-space tile, or hit something, or hit the end of the map, or someone picks it up
if(error < 0) if(error < 0)
var/atom/step = get_step(src, dx) var/atom/step = get_step(src, dx)
@@ -208,6 +224,8 @@
dist_since_sleep = 0 dist_since_sleep = 0
sleep(1) sleep(1)
a = get_area(src.loc)
//done throwing, either because it hit something or it finished moving //done throwing, either because it hit something or it finished moving
src.throwing = 0 src.throwing = 0
if(isobj(src)) src:throw_impact(get_turf(src)) if(isobj(src)) src:throw_impact(get_turf(src))

View File

@@ -81,8 +81,18 @@
/turf/Entered(atom/movable/M as mob|obj) /turf/Entered(atom/movable/M as mob|obj)
if(ismob(M)) if(ismob(M))
if(!M:lastarea)
M:lastarea = get_area(M.loc)
if(M:lastarea.has_gravity == 0)
inertial_drift(M)
/*
if(M.flags & NOGRAV) if(M.flags & NOGRAV)
inertial_drift(M) inertial_drift(M)
*/
else if(!istype(src, /turf/space)) else if(!istype(src, /turf/space))
M:inertia_dir = 0 M:inertia_dir = 0
..() ..()

View File

@@ -25,7 +25,7 @@
holder.rank = rank holder.rank = rank
if(!holder.state) if(!holder.state)
var/state = alert("Which state do you the admin to begin in?", "Admin-state", "Play", "Observe", "Neither") var/state = alert("Which state do you want the admin to begin in?", "Admin-state", "Play", "Observe", "Neither")
if(state == "Play") if(state == "Play")
holder.state = 1 holder.state = 1
admin_play() admin_play()
@@ -169,6 +169,8 @@
verbs += /client/proc/restartcontroller //Can call via aproccall --I_hate_easy_things.jpg, Mport --Agouri verbs += /client/proc/restartcontroller //Can call via aproccall --I_hate_easy_things.jpg, Mport --Agouri
verbs += /client/proc/Blobize//I need to remember to move/remove this later verbs += /client/proc/Blobize//I need to remember to move/remove this later
verbs += /client/proc/toggle_clickproc //TODO ERRORAGE (Temporary proc while the enw clickproc is being tested) verbs += /client/proc/toggle_clickproc //TODO ERRORAGE (Temporary proc while the enw clickproc is being tested)
verbs += /client/proc/toggle_gravity_on
verbs += /client/proc/toggle_gravity_off
// Moved over from tg's Game Master: // Moved over from tg's Game Master:
verbs += /client/proc/colorooc verbs += /client/proc/colorooc
verbs += /obj/admins/proc/toggle_aliens //toggle aliens verbs += /obj/admins/proc/toggle_aliens //toggle aliens
@@ -420,6 +422,8 @@
verbs -= /client/proc/toggle_hear_deadcast verbs -= /client/proc/toggle_hear_deadcast
verbs -= /client/proc/toggle_hear_radio verbs -= /client/proc/toggle_hear_radio
verbs -= /client/proc/tension_report verbs -= /client/proc/tension_report
verbs -= /client/proc/toggle_gravity_on
verbs -= /client/proc/toggle_gravity_off
verbs -= /client/proc/cmd_admin_change_custom_event verbs -= /client/proc/cmd_admin_change_custom_event
verbs -= /client/proc/admin_invis verbs -= /client/proc/admin_invis
verbs -= /client/proc/callprocgen verbs -= /client/proc/callprocgen

View File

@@ -873,6 +873,36 @@ Traitors and the like can also be revived with the previous role mostly intact.
ticker.random_players = 1 ticker.random_players = 1
/client/proc/toggle_gravity_on()
set category = "Debug"
set name = "Toggle station gravity on"
set desc = "Toggles all gravity to active on the station."
if (!(ticker && ticker.mode))
usr << "Please wait until the game starts! Not sure how it will work otherwise."
return
for(var/area/A in world)
A.gravitychange(1,A)
command_alert("CentComm is now beaming gravitons to your station. We appoligize for any inconvience.")
/client/proc/toggle_gravity_off()
set category = "Debug"
set name = "Toggle station gravity off"
set desc = "Toggles all gravity to inactive on the station."
if (!(ticker && ticker.mode))
usr << "Please wait until the game starts! Not sure how it will work otherwise."
return
for(var/area/A in world)
A.gravitychange(0,A)
command_alert("For budget reasons, Centcomm is no longer beaming gravitons to your station. We appoligize for any inconvience.")
/client/proc/rnd_check_designs() /client/proc/rnd_check_designs()
set category = "Debug" set category = "Debug"
set name = "Check RnD Designs" set name = "Check RnD Designs"

View File

@@ -133,6 +133,7 @@
/client/Move(n, direct) /client/Move(n, direct)
if(mob.control_object) Move_object(direct) if(mob.control_object) Move_object(direct)
if(isobserver(mob)) return mob.Move(n,direct) if(isobserver(mob)) return mob.Move(n,direct)
@@ -143,6 +144,11 @@
if(!mob) return if(!mob) return
if(locate(/obj/effect/stop/, mob.loc))
for(var/obj/effect/stop/S in mob.loc)
if(S.victim == mob)
return
if(mob.stat==2) return if(mob.stat==2) return
if(isAI(mob)) return AIMove(n,direct,mob) if(isAI(mob)) return AIMove(n,direct,mob)
@@ -162,9 +168,15 @@
else else
mob.canmove = 1 mob.canmove = 1
if(istype(mob.loc, /turf/space) || (mob.flags & NOGRAV))
//if(istype(mob.loc, /turf/space) || (mob.flags & NOGRAV))
// if(!mob.Process_Spacemove(0)) return 0
var/area/a = get_area(mob.loc)
if((istype(mob.loc, /turf/space)) || (a.has_gravity == 0))
if(!mob.Process_Spacemove(0)) return 0 if(!mob.Process_Spacemove(0)) return 0
if(isobj(mob.loc) || ismob(mob.loc))//Inside an object, tell it we moved if(isobj(mob.loc) || ismob(mob.loc))//Inside an object, tell it we moved
var/atom/O = mob.loc var/atom/O = mob.loc
return O.relaymove(mob, direct) return O.relaymove(mob, direct)
@@ -332,8 +344,25 @@
for(var/turf/turf in oview(1,src)) for(var/turf/turf in oview(1,src))
if(istype(turf,/turf/space)) if(istype(turf,/turf/space))
continue continue
if(istype(turf,/turf/simulated/floor) && (flags & NOGRAV))
var/area/a = get_area(turf)
if(istype(src,/mob/living/carbon/human/)) // Only humans can wear magboots, so we give them a chance to.
if((istype(turf,/turf/simulated/floor)) && (a.has_gravity == 0) && !(istype(src:shoes, /obj/item/clothing/shoes/magboots) && (src:shoes:flags & NOSLIP)))
continue continue
else
if((istype(turf,/turf/simulated/floor)) && (a.has_gravity == 0)) // No one else gets a chance.
continue
/*
if(istype(turf,/turf/simulated/floor) && (src.flags & NOGRAV))
continue
*/
dense_object++ dense_object++
break break

View File

@@ -265,6 +265,7 @@
job_master.EquipRank(character, rank, 1) job_master.EquipRank(character, rank, 1)
EquipCustomItems(character) EquipCustomItems(character)
character.loc = pick(latejoin) character.loc = pick(latejoin)
character.lastarea = get_area(loc)
if(character.client) if(character.client)
character.client.be_syndicate = preferences.be_special character.client.be_syndicate = preferences.be_special
ticker.mode.latespawn(character) ticker.mode.latespawn(character)
@@ -369,6 +370,7 @@
proc/create_character() proc/create_character()
spawning = 1 spawning = 1
var/mob/living/carbon/human/new_character = new(loc) var/mob/living/carbon/human/new_character = new(loc)
new_character.lastarea = get_area(loc)
close_spawn_windows() close_spawn_windows()

View File

@@ -142,17 +142,6 @@ var/MAX_EXPLOSION_RANGE = 14
//turf-only flags //turf-only flags
#define NOJAUNT 1 #define NOJAUNT 1
//Bit flags for the flags_inv variable, which determine when a piece of clothing hides another. IE a helmet hiding glasses.
#define HIDEGLOVES 1 //APPLIES ONLY TO THE EXTERIOR SUIT!!
#define HIDESUITSTORAGE 2 //APPLIES ONLY TO THE EXTERIOR SUIT!!
#define HIDEJUMPSUIT 4 //APPLIES ONLY TO THE EXTERIOR SUIT!!
#define HIDESHOES 8 //APPLIES ONLY TO THE EXTERIOR SUIT!!
#define HIDEMASK 1 //APPLIES ONLY TO HELMETS!!
#define HIDEEARS 2 //APPLIES ONLY TO HELMETS!!
#define HIDEEYES 4 //APPLIES ONLY TO HELMETS!!
//Cant seem to find a mob bitflags area other than the powers one
#define NOGRAV 1
//Bit flags for the flags_inv variable, which determine when a piece of clothing hides another. IE a helmet hiding glasses. //Bit flags for the flags_inv variable, which determine when a piece of clothing hides another. IE a helmet hiding glasses.
#define HIDEGLOVES 1 //APPLIES ONLY TO THE EXTERIOR SUIT!! #define HIDEGLOVES 1 //APPLIES ONLY TO THE EXTERIOR SUIT!!