Changed circledistance a bit, talk about ambiguous proc-names...it has nothing to do with circles! It's now called approx_dist and uses some magic constants to avoid those god-awful sqrts and powers which were called for N^2 turfs during explosions. It should approximate the distance between two points fairly accurately using a (surprisingly accurate) linear approximation of pythagoras theorem. C:

Changed RoundExplosions to a temporary define named USE_CIRCULAR_EXPLOSIONS which is a lot more intuitive and less confusing. Removing this define will compile square explosions code instead of circular ones. (So the cost of having a choice between circular/square is seen at compile-time not at run-time)

Fixed aliums being able to pick up storage objects such as bags/boxes/pillboxes and such.

Fixed unbuckling yourself from beds (via clicking the bed). You can also unbuckle yourself via resisting because beds are hard to click on when you're lying on them and they're covered in a sheet.

git-svn-id: http://tgstation13.googlecode.com/svn/trunk@3854 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
elly1989@rocketmail.com
2012-06-18 07:37:50 +00:00
parent c516585940
commit 3cbd05ddef
5 changed files with 43 additions and 27 deletions
+15 -4
View File
@@ -33,14 +33,25 @@
return 0 //not in range and not telekinetic
/proc/circledistance(center=usr, T) // T is just the second atom to check distance to center with
//Magic constants obtained by using linear regression on right-angled triangles of sides 0<x<1, 0<y<1
//They should approximate pythagoras theorem well enough for our needs.
//In fact, less accuracy is kinda better for explosions anyway :P Maybe k1=1, k2=0.5?
#define k1 0.934
#define k2 0.427
/proc/approx_dist(center=usr, T) // T is just the second atom to check distance to center with
var/turf/centerturf = get_turf(center)
var/turf/targetturf = get_turf(T)
var/dx2 = (targetturf.x - centerturf.x)**2
var/dy2 = (targetturf.y - centerturf.y)**2
var/a = abs(targetturf.x - centerturf.x) //sides of right-angled triangle
var/b = abs(targetturf.y - centerturf.y)
return sqrt(dx2 + dy2)
if(a>=b)
return (k1*a) + (k2*b) //No sqrt or powers :)
else
return (k1*b) + (k2*a)
#undef k1
#undef k2
/proc/circlerange(center=usr,radius=3)
+1 -1
View File
@@ -919,7 +919,7 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
// ------- TESTS ABOVE DETERMINED YOU CANNOT REACH THE TILE -------
return 0
if (!( usr.restrained() || usr.lying ))
if (!( usr.restrained() || (usr.lying && usr.buckled!=src) ))
// ------- YOU ARE NOT REASTRAINED -------
if (W)
+8 -4
View File
@@ -1,3 +1,5 @@
#define USE_CIRCULAR_EXPLOSIONS 1
//TODO: Flash range does nothing currently
proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1)
@@ -25,8 +27,11 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
var/list/expTurfs = list() // All turfs being affected by the explosion (not flash range)
#ifdef USE_CIRCULAR_EXPLOSIONS
expTurfs = circlerangeturfs(epicenter, max(devastation_range, heavy_impact_range, light_impact_range))
#else
expTurfs = range(epicenter, max(devastation_range, heavy_impact_range, light_impact_range))
#endif
// Hello future editors, please note that 1000 calls to spawn will not speed this up, but this exact amount has been tested
// Now, tonnes of calls to spawn will allow other stuff to happen, but I believe we may as well let explosions
@@ -37,7 +42,7 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
var/list/lTurfs = list()
for(var/turf/T in expTurfs) // This doesn't slow it down at all, even 100,100,100 bombs
var/dist = circledistance(epicenter, T)
var/dist = approx_dist(epicenter, T)
if(dist < devastation_range)
dTurfs.Add(T)
@@ -54,7 +59,6 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
T.ex_act(1)
for(var/atom/object in T.contents)
object.ex_act(1)
spawn()
for(var/turf/T in hTurfs)
T.ex_act(2)
@@ -69,9 +73,9 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
if(defer_powernet_rebuild != 2)
defer_powernet_rebuild = 0
return 1
#undef USE_CIRCULAR_EXPLOSIONS
proc/secondaryexplosion(turf/epicenter, range)
-4
View File
@@ -201,10 +201,6 @@
src.show_to(usr)
return
/obj/item/weapon/storage/attack_paw(mob/user as mob)
//playsound(src.loc, "rustle", 50, 1, -5) // what
return src.attack_hand(user)
/obj/item/weapon/storage/attack_hand(mob/user as mob)
playsound(src.loc, "rustle", 50, 1, -5)
+19 -14
View File
@@ -615,20 +615,25 @@
usr.update_inv_handcuffed()
//unbuckling yourself
else if(usr:handcuffed && (usr.last_special <= world.time) && usr:buckled)
usr.next_move = world.time + 100
usr.last_special = world.time + 100
usr << "\red You attempt to unbuckle yourself. (This will take around 2 minutes and you need to stand still)"
for(var/mob/O in viewers(usr))
O.show_message("\red <B>[usr] attempts to unbuckle themself!</B>", 1)
spawn(0)
if(do_after(usr, 1200))
if(!usr:buckled)
return
for(var/mob/O in viewers(usr))
O.show_message("\red <B>[usr] manages to unbuckle themself!</B>", 1)
usr << "\blue You successfully unbuckle yourself."
usr:buckled.manual_unbuckle(usr)
else if( usr:buckled && (usr.last_special <= world.time) )
if( usr:handcuffed )
usr.next_move = world.time + 100
usr.last_special = world.time + 100
usr << "\red You attempt to unbuckle yourself. (This will take around 2 minutes and you need to stand still)"
for(var/mob/O in viewers(usr))
O.show_message("\red <B>[usr] attempts to unbuckle themself!</B>", 1)
spawn(0)
if(do_after(usr, 1200))
if(!usr:buckled)
return
for(var/mob/O in viewers(usr))
O.show_message("\red <B>[usr] manages to unbuckle themself!</B>", 1)
usr << "\blue You successfully unbuckle yourself."
usr:buckled.manual_unbuckle(usr)
else
usr:buckled.manual_unbuckle(usr)
else if( src.loc && (istype(src.loc, /obj/structure/closet)) )
var/obj/structure/closet/C = usr.loc
if(C.opened)