mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-01-07 08:02:49 +00:00
This commit ports the base system of LINDA from TG. This version of linda is the original version, with none of -tg-'s fixes, rewrites, or other such improvements attached. The mob ignite system has been 100% removed, as LINDA does not support this normally. It may be added back in when the improvements and refactors to LINDA have been ported.
944 lines
29 KiB
Plaintext
944 lines
29 KiB
Plaintext
/* Tables and Racks
|
|
* Contains:
|
|
* Tables
|
|
* Wooden tables
|
|
* Reinforced tables
|
|
* Racks
|
|
*/
|
|
|
|
|
|
/*
|
|
* Tables
|
|
*/
|
|
/obj/structure/table
|
|
name = "table"
|
|
desc = "A square piece of metal standing on four metal legs. It can not move."
|
|
icon = 'icons/obj/structures.dmi'
|
|
icon_state = "table"
|
|
density = 1
|
|
anchored = 1.0
|
|
layer = 2.8
|
|
throwpass = 1 //You can throw objects over this, despite it's density.")
|
|
climbable = 1
|
|
|
|
var/parts = /obj/item/weapon/table_parts
|
|
var/flipped = 0
|
|
var/health = 100
|
|
var/busy = 0
|
|
|
|
/obj/structure/table/proc/update_adjacent()
|
|
for(var/direction in list(1,2,4,8,5,6,9,10))
|
|
if(locate(/obj/structure/table,get_step(src,direction)))
|
|
var/obj/structure/table/T = locate(/obj/structure/table,get_step(src,direction))
|
|
T.update_icon()
|
|
|
|
/obj/structure/table/New()
|
|
..()
|
|
for(var/obj/structure/table/T in src.loc)
|
|
if(T != src)
|
|
del(T)
|
|
update_icon()
|
|
update_adjacent()
|
|
|
|
/obj/structure/table/Destroy()
|
|
update_adjacent()
|
|
..()
|
|
|
|
/obj/structure/table/proc/destroy()
|
|
new parts(loc)
|
|
density = 0
|
|
qdel(src)
|
|
|
|
/obj/structure/table/update_icon()
|
|
if(flipped)
|
|
var/type = 0
|
|
var/tabledirs = 0
|
|
for(var/direction in list(turn(dir,90), turn(dir,-90)) )
|
|
var/obj/structure/table/T = locate(/obj/structure/table,get_step(src,direction))
|
|
if (T && T.flipped)
|
|
type++
|
|
tabledirs |= direction
|
|
var/base = "table"
|
|
if (istype(src, /obj/structure/table/woodentable))
|
|
base = "wood"
|
|
if (istype(src, /obj/structure/table/reinforced))
|
|
base = "rtable"
|
|
|
|
icon_state = "[base]flip[type]"
|
|
if (type==1)
|
|
if (tabledirs & turn(dir,90))
|
|
icon_state = icon_state+"-"
|
|
if (tabledirs & turn(dir,-90))
|
|
icon_state = icon_state+"+"
|
|
return 1
|
|
|
|
spawn(2) //So it properly updates when deleting
|
|
var/dir_sum = 0
|
|
for(var/direction in list(1,2,4,8,5,6,9,10))
|
|
var/skip_sum = 0
|
|
for(var/obj/structure/window/W in src.loc)
|
|
if(W.dir == direction) //So smooth tables don't go smooth through windows
|
|
skip_sum = 1
|
|
continue
|
|
var/inv_direction //inverse direction
|
|
switch(direction)
|
|
if(1)
|
|
inv_direction = 2
|
|
if(2)
|
|
inv_direction = 1
|
|
if(4)
|
|
inv_direction = 8
|
|
if(8)
|
|
inv_direction = 4
|
|
if(5)
|
|
inv_direction = 10
|
|
if(6)
|
|
inv_direction = 9
|
|
if(9)
|
|
inv_direction = 6
|
|
if(10)
|
|
inv_direction = 5
|
|
for(var/obj/structure/window/W in get_step(src,direction))
|
|
if(W.dir == inv_direction) //So smooth tables don't go smooth through windows when the window is on the other table's tile
|
|
skip_sum = 1
|
|
continue
|
|
if(!skip_sum) //means there is a window between the two tiles in this direction
|
|
var/obj/structure/table/T = locate(/obj/structure/table,get_step(src,direction))
|
|
if(T && !T.flipped)
|
|
if(direction <5)
|
|
dir_sum += direction
|
|
else
|
|
if(direction == 5) //This permits the use of all table directions. (Set up so clockwise around the central table is a higher value, from north)
|
|
dir_sum += 16
|
|
if(direction == 6)
|
|
dir_sum += 32
|
|
if(direction == 8) //Aherp and Aderp. Jezes I am stupid. -- SkyMarshal
|
|
dir_sum += 8
|
|
if(direction == 10)
|
|
dir_sum += 64
|
|
if(direction == 9)
|
|
dir_sum += 128
|
|
|
|
var/table_type = 0 //stand_alone table
|
|
if(dir_sum%16 in cardinal)
|
|
table_type = 1 //endtable
|
|
dir_sum %= 16
|
|
if(dir_sum%16 in list(3,12))
|
|
table_type = 2 //1 tile thick, streight table
|
|
if(dir_sum%16 == 3) //3 doesn't exist as a dir
|
|
dir_sum = 2
|
|
if(dir_sum%16 == 12) //12 doesn't exist as a dir.
|
|
dir_sum = 4
|
|
if(dir_sum%16 in list(5,6,9,10))
|
|
if(locate(/obj/structure/table,get_step(src.loc,dir_sum%16)))
|
|
table_type = 3 //full table (not the 1 tile thick one, but one of the 'tabledir' tables)
|
|
else
|
|
table_type = 2 //1 tile thick, corner table (treated the same as streight tables in code later on)
|
|
dir_sum %= 16
|
|
if(dir_sum%16 in list(13,14,7,11)) //Three-way intersection
|
|
table_type = 5 //full table as three-way intersections are not sprited, would require 64 sprites to handle all combinations. TOO BAD -- SkyMarshal
|
|
switch(dir_sum%16) //Begin computation of the special type tables. --SkyMarshal
|
|
if(7)
|
|
if(dir_sum == 23)
|
|
table_type = 6
|
|
dir_sum = 8
|
|
else if(dir_sum == 39)
|
|
dir_sum = 4
|
|
table_type = 6
|
|
else if(dir_sum == 55 || dir_sum == 119 || dir_sum == 247 || dir_sum == 183)
|
|
dir_sum = 4
|
|
table_type = 3
|
|
else
|
|
dir_sum = 4
|
|
if(11)
|
|
if(dir_sum == 75)
|
|
dir_sum = 5
|
|
table_type = 6
|
|
else if(dir_sum == 139)
|
|
dir_sum = 9
|
|
table_type = 6
|
|
else if(dir_sum == 203 || dir_sum == 219 || dir_sum == 251 || dir_sum == 235)
|
|
dir_sum = 8
|
|
table_type = 3
|
|
else
|
|
dir_sum = 8
|
|
if(13)
|
|
if(dir_sum == 29)
|
|
dir_sum = 10
|
|
table_type = 6
|
|
else if(dir_sum == 141)
|
|
dir_sum = 6
|
|
table_type = 6
|
|
else if(dir_sum == 189 || dir_sum == 221 || dir_sum == 253 || dir_sum == 157)
|
|
dir_sum = 1
|
|
table_type = 3
|
|
else
|
|
dir_sum = 1
|
|
if(14)
|
|
if(dir_sum == 46)
|
|
dir_sum = 1
|
|
table_type = 6
|
|
else if(dir_sum == 78)
|
|
dir_sum = 2
|
|
table_type = 6
|
|
else if(dir_sum == 110 || dir_sum == 254 || dir_sum == 238 || dir_sum == 126)
|
|
dir_sum = 2
|
|
table_type = 3
|
|
else
|
|
dir_sum = 2 //These translate the dir_sum to the correct dirs from the 'tabledir' icon_state.
|
|
if(dir_sum%16 == 15)
|
|
table_type = 4 //4-way intersection, the 'middle' table sprites will be used.
|
|
|
|
if(istype(src,/obj/structure/table/reinforced))
|
|
switch(table_type)
|
|
if(0)
|
|
icon_state = "reinf_table"
|
|
if(1)
|
|
icon_state = "reinf_1tileendtable"
|
|
if(2)
|
|
icon_state = "reinf_1tilethick"
|
|
if(3)
|
|
icon_state = "reinf_tabledir"
|
|
if(4)
|
|
icon_state = "reinf_middle"
|
|
if(5)
|
|
icon_state = "reinf_tabledir2"
|
|
if(6)
|
|
icon_state = "reinf_tabledir3"
|
|
else if(istype(src,/obj/structure/table/woodentable/poker))
|
|
switch(table_type)
|
|
if(0)
|
|
icon_state = "pokertable_table"
|
|
if(1)
|
|
icon_state = "pokertable_1tileendtable"
|
|
if(2)
|
|
icon_state = "pokertable_1tilethick"
|
|
if(3)
|
|
icon_state = "pokertable_tabledir"
|
|
if(4)
|
|
icon_state = "pokertable_middle"
|
|
if(5)
|
|
icon_state = "pokertable_tabledir2"
|
|
if(6)
|
|
icon_state = "pokertable_tabledir3"
|
|
else if(istype(src,/obj/structure/table/woodentable))
|
|
switch(table_type)
|
|
if(0)
|
|
icon_state = "wood_table"
|
|
if(1)
|
|
icon_state = "wood_1tileendtable"
|
|
if(2)
|
|
icon_state = "wood_1tilethick"
|
|
if(3)
|
|
icon_state = "wood_tabledir"
|
|
if(4)
|
|
icon_state = "wood_middle"
|
|
if(5)
|
|
icon_state = "wood_tabledir2"
|
|
if(6)
|
|
icon_state = "wood_tabledir3"
|
|
else if(istype(src,/obj/structure/table/glass))
|
|
switch(table_type)
|
|
if(0)
|
|
icon_state = "glass_table"
|
|
if(1)
|
|
icon_state = "glass_table_1tileendtable"
|
|
if(2)
|
|
icon_state = "glass_table_1tilethick"
|
|
if(3)
|
|
icon_state = "glass_table_dir"
|
|
if(4)
|
|
icon_state = "glass_table_middle"
|
|
if(5)
|
|
icon_state = "glass_tabledir2"
|
|
if(6)
|
|
icon_state = "glass_tabledir3"
|
|
else
|
|
switch(table_type)
|
|
if(0)
|
|
icon_state = "table"
|
|
if(1)
|
|
icon_state = "table_1tileendtable"
|
|
if(2)
|
|
icon_state = "table_1tilethick"
|
|
if(3)
|
|
icon_state = "tabledir"
|
|
if(4)
|
|
icon_state = "table_middle"
|
|
if(5)
|
|
icon_state = "tabledir2"
|
|
if(6)
|
|
icon_state = "tabledir3"
|
|
if (dir_sum in list(1,2,4,8,5,6,9,10))
|
|
dir = dir_sum
|
|
else
|
|
dir = 2
|
|
|
|
/obj/structure/table/ex_act(severity)
|
|
switch(severity)
|
|
if(1.0)
|
|
qdel(src)
|
|
return
|
|
if(2.0)
|
|
if (prob(50))
|
|
qdel(src)
|
|
return
|
|
if(3.0)
|
|
if (prob(25))
|
|
destroy()
|
|
else
|
|
return
|
|
|
|
|
|
/obj/structure/table/blob_act()
|
|
if(prob(75))
|
|
destroy()
|
|
|
|
/obj/structure/table/attack_paw(mob/living/user)
|
|
if(HULK in user.mutations)
|
|
user.do_attack_animation(src)
|
|
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
|
|
visible_message("<span class='danger'>[user] smashes the [src] apart!</span>")
|
|
destroy()
|
|
|
|
|
|
/obj/structure/table/attack_alien(mob/living/user)
|
|
user.do_attack_animation(src)
|
|
visible_message("<span class='danger'>[user] slices [src] apart!</span>")
|
|
destroy()
|
|
|
|
/obj/structure/table/attack_animal(mob/living/simple_animal/user)
|
|
if(user.environment_smash)
|
|
user.do_attack_animation(src)
|
|
visible_message("<span class='danger'>[user] smashes [src] apart!</span>")
|
|
destroy()
|
|
|
|
|
|
|
|
/obj/structure/table/attack_hand(mob/living/user)
|
|
if(HULK in user.mutations)
|
|
user.do_attack_animation(src)
|
|
visible_message("<span class='danger'>[user] smashes [src] apart!</span>")
|
|
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
|
|
destroy()
|
|
else
|
|
..()
|
|
if(climber)
|
|
climber.Weaken(2)
|
|
climber.visible_message("<span class='warning'>[climber.name] has been knocked off the table", "You've been knocked off the table", "You see [climber.name] get knocked off the table</span>")
|
|
|
|
/obj/structure/table/attack_tk() // no telehulk sorry
|
|
return
|
|
|
|
/obj/structure/table/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
|
if(air_group || (height==0)) return 1
|
|
if(istype(mover,/obj/item/projectile))
|
|
return (check_cover(mover,target))
|
|
if(istype(mover) && mover.checkpass(PASSTABLE))
|
|
return 1
|
|
if(locate(/obj/structure/table) in get_turf(mover))
|
|
return 1
|
|
if (flipped)
|
|
if (get_dir(loc, target) == dir)
|
|
return !density
|
|
else
|
|
return 1
|
|
return 0
|
|
|
|
//checks if projectile 'P' from turf 'from' can hit whatever is behind the table. Returns 1 if it can, 0 if bullet stops.
|
|
/obj/structure/table/proc/check_cover(obj/item/projectile/P, turf/from)
|
|
var/turf/cover = flipped ? get_turf(src) : get_step(loc, get_dir(from, loc))
|
|
if (get_dist(P.starting, loc) <= 1) //Tables won't help you if people are THIS close
|
|
return 1
|
|
if (get_turf(P.original) == cover)
|
|
var/chance = 20
|
|
if (ismob(P.original))
|
|
var/mob/M = P.original
|
|
if (M.lying)
|
|
chance += 20 //Lying down lets you catch less bullets
|
|
if(flipped)
|
|
if(get_dir(loc, from) == dir) //Flipped tables catch mroe bullets
|
|
chance += 20
|
|
else
|
|
return 1 //But only from one side
|
|
if(prob(chance))
|
|
health -= P.damage/2
|
|
if (health > 0)
|
|
visible_message("<span class='warning'>[P] hits \the [src]!</span>")
|
|
return 0
|
|
else
|
|
visible_message("<span class='warning'>[src] breaks down!</span>")
|
|
destroy()
|
|
return 1
|
|
return 1
|
|
|
|
/obj/structure/table/CheckExit(atom/movable/O as mob|obj, target as turf)
|
|
if(istype(O) && O.checkpass(PASSTABLE))
|
|
return 1
|
|
if (flipped)
|
|
if (get_dir(loc, target) == dir)
|
|
return !density
|
|
else
|
|
return 1
|
|
return 1
|
|
|
|
/obj/structure/table/MouseDrop_T(obj/O as obj, mob/user as mob)
|
|
..()
|
|
if ((!( istype(O, /obj/item/weapon) ) || user.get_active_hand() != O))
|
|
return
|
|
if(isrobot(user))
|
|
return
|
|
if(!user.drop_item())
|
|
return
|
|
if (O.loc != src.loc)
|
|
step(O, get_dir(O, src))
|
|
return
|
|
|
|
|
|
/obj/structure/table/attackby(obj/item/W as obj, mob/user as mob, params)
|
|
if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2)
|
|
var/obj/item/weapon/grab/G = W
|
|
if (istype(G.affecting, /mob/living))
|
|
var/mob/living/M = G.affecting
|
|
if (G.state < 2)
|
|
if(user.a_intent == "harm")
|
|
if (prob(15)) M.Weaken(5)
|
|
M.apply_damage(8,def_zone = "head")
|
|
visible_message("\red [G.assailant] slams [G.affecting]'s face against \the [src]!")
|
|
playsound(src.loc, 'sound/weapons/tablehit1.ogg', 50, 1)
|
|
else
|
|
user << "\red You need a better grip to do that!"
|
|
return
|
|
else
|
|
G.affecting.loc = src.loc
|
|
G.affecting.Weaken(5)
|
|
visible_message("\red [G.assailant] puts [G.affecting] on \the [src].")
|
|
del(W)
|
|
return
|
|
|
|
if (istype(W, /obj/item/weapon/wrench))
|
|
user << "\blue Now disassembling table"
|
|
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
|
|
if(do_after(user,50))
|
|
destroy()
|
|
return
|
|
|
|
if(isrobot(user))
|
|
return
|
|
|
|
if(istype(W, /obj/item/weapon/melee/energy/blade))
|
|
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
|
|
spark_system.set_up(5, 0, src.loc)
|
|
spark_system.start()
|
|
playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1)
|
|
playsound(src.loc, "sparks", 50, 1)
|
|
for(var/mob/O in viewers(user, 4))
|
|
O.show_message("\blue The [src] was sliced apart by [user]!", 1, "\red You hear [src] coming apart.", 2)
|
|
destroy()
|
|
return
|
|
|
|
if(!(W.flags & ABSTRACT))
|
|
if(user.drop_item())
|
|
W.Move(loc)
|
|
var/list/click_params = params2list(params)
|
|
//Center the icon where the user clicked.
|
|
if(!click_params || !click_params["icon-x"] || !click_params["icon-y"])
|
|
return
|
|
//Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf)
|
|
W.pixel_x = Clamp(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2)
|
|
W.pixel_y = Clamp(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2)
|
|
|
|
return
|
|
|
|
/obj/structure/table/proc/straight_table_check(var/direction)
|
|
var/obj/structure/table/T
|
|
for(var/angle in list(-90,90))
|
|
T = locate() in get_step(src.loc,turn(direction,angle))
|
|
if(T && !T.flipped)
|
|
return 0
|
|
T = locate() in get_step(src.loc,direction)
|
|
if (!T || T.flipped)
|
|
return 1
|
|
if (istype(T,/obj/structure/table/reinforced/))
|
|
var/obj/structure/table/reinforced/R = T
|
|
if (R.status == 2)
|
|
return 0
|
|
return T.straight_table_check(direction)
|
|
|
|
/obj/structure/table/verb/do_flip()
|
|
set name = "Flip table"
|
|
set desc = "Flips a non-reinforced table"
|
|
set category = null
|
|
set src in oview(1)
|
|
|
|
if (!can_touch(usr) || ismouse(usr))
|
|
return
|
|
|
|
if(!flip(get_cardinal_dir(usr,src)))
|
|
usr << "<span class='notice'>It won't budge.</span>"
|
|
return
|
|
|
|
usr.visible_message("<span class='warning'>[usr] flips \the [src]!</span>")
|
|
|
|
if(climbable)
|
|
structure_shaken()
|
|
|
|
return
|
|
|
|
/obj/structure/table/proc/do_put()
|
|
set name = "Put table back"
|
|
set desc = "Puts flipped table back"
|
|
set category = "Object"
|
|
set src in oview(1)
|
|
|
|
if (!unflip())
|
|
usr << "<span class='notice'>It won't budge.</span>"
|
|
return
|
|
|
|
|
|
/obj/structure/table/proc/flip(var/direction)
|
|
if (flipped)
|
|
return 0
|
|
|
|
if( !straight_table_check(turn(direction,90)) || !straight_table_check(turn(direction,-90)) )
|
|
return 0
|
|
|
|
verbs -=/obj/structure/table/verb/do_flip
|
|
verbs +=/obj/structure/table/proc/do_put
|
|
|
|
var/list/targets = list(get_step(src,dir),get_step(src,turn(dir, 45)),get_step(src,turn(dir, -45)))
|
|
for (var/atom/movable/A in get_turf(src))
|
|
if (!A.anchored)
|
|
spawn(0)
|
|
A.throw_at(pick(targets),1,1)
|
|
|
|
dir = direction
|
|
if(dir != NORTH)
|
|
layer = 5
|
|
flipped = 1
|
|
flags |= ON_BORDER
|
|
for(var/D in list(turn(direction, 90), turn(direction, -90)))
|
|
if(locate(/obj/structure/table,get_step(src,D)))
|
|
var/obj/structure/table/T = locate(/obj/structure/table,get_step(src,D))
|
|
T.flip(direction)
|
|
update_icon()
|
|
update_adjacent()
|
|
|
|
return 1
|
|
|
|
/obj/structure/table/proc/unflip()
|
|
if (!flipped)
|
|
return 0
|
|
|
|
var/can_flip = 1
|
|
for (var/mob/A in oview(src,0))//src.loc)
|
|
if (istype(A))
|
|
can_flip = 0
|
|
if (!can_flip)
|
|
return 0
|
|
|
|
verbs -=/obj/structure/table/proc/do_put
|
|
verbs +=/obj/structure/table/verb/do_flip
|
|
|
|
layer = initial(layer)
|
|
flipped = 0
|
|
flags &= ~ON_BORDER
|
|
for(var/D in list(turn(dir, 90), turn(dir, -90)))
|
|
if(locate(/obj/structure/table,get_step(src,D)))
|
|
var/obj/structure/table/T = locate(/obj/structure/table,get_step(src,D))
|
|
T.unflip()
|
|
update_icon()
|
|
update_adjacent()
|
|
|
|
return 1
|
|
|
|
/*
|
|
* Wooden tables
|
|
*/
|
|
/obj/structure/table/woodentable
|
|
name = "wooden table"
|
|
desc = "Do not apply fire to this. Rumour says it burns easily."
|
|
icon_state = "wood_table"
|
|
parts = /obj/item/weapon/table_parts/wood
|
|
health = 50
|
|
|
|
/obj/structure/table/woodentable/attackby(obj/item/I as obj, mob/user as mob, params)
|
|
|
|
if (istype(I, /obj/item/stack/tile/grass))
|
|
del(I)
|
|
new /obj/structure/table/woodentable/poker( src.loc )
|
|
del(src)
|
|
visible_message("<span class='notice'>[user] adds the grass to the wooden table</span>")
|
|
|
|
|
|
if (istype(I, /obj/item/weapon/grab))
|
|
var/obj/item/weapon/grab/G = I
|
|
if(G.affecting.buckled)
|
|
user << "<span class='notice'>[G.affecting] is buckled to [G.affecting.buckled]!</span>"
|
|
return
|
|
if(G.state < GRAB_AGGRESSIVE)
|
|
user << "<span class='notice'>You need a better grip to do that!</span>"
|
|
return
|
|
if(!G.confirm())
|
|
return
|
|
G.affecting.loc = src.loc
|
|
G.affecting.Weaken(5)
|
|
visible_message("\red [G.assailant] puts [G.affecting] on the table.")
|
|
del(I)
|
|
return
|
|
if (istype(I, /obj/item/weapon/wrench))
|
|
user << "\blue Now disassembling the wooden table"
|
|
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
|
|
sleep(50)
|
|
new /obj/item/weapon/table_parts/wood( src.loc )
|
|
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
|
|
del(src)
|
|
return
|
|
|
|
if(isrobot(user))
|
|
return
|
|
if(istype(I, /obj/item/weapon/melee/energy/blade))
|
|
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
|
|
spark_system.set_up(5, 0, src.loc)
|
|
spark_system.start()
|
|
playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1)
|
|
playsound(src.loc, "sparks", 50, 1)
|
|
for(var/mob/O in viewers(user, 4))
|
|
O.show_message("\blue The wooden table was sliced apart by [user]!", 1, "\red You hear wood coming apart.", 2)
|
|
new /obj/item/weapon/table_parts/wood( src.loc )
|
|
del(src)
|
|
return
|
|
|
|
if(!(I.flags & ABSTRACT))
|
|
if(user.drop_item())
|
|
I.Move(loc)
|
|
var/list/click_params = params2list(params)
|
|
//Center the icon where the user clicked.
|
|
if(!click_params || !click_params["icon-x"] || !click_params["icon-y"])
|
|
return
|
|
//Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf)
|
|
I.pixel_x = Clamp(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2)
|
|
I.pixel_y = Clamp(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2)
|
|
|
|
return 1
|
|
|
|
/obj/structure/table/woodentable/poker //No specialties, Just a mapping object.
|
|
name = "gambling table"
|
|
desc = "A seedy table for seedy dealings in seedy places."
|
|
icon_state = "pokertable"
|
|
|
|
|
|
/obj/structure/table/woodentable/poker/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
|
|
|
|
if (istype(W, /obj/item/weapon/grab))
|
|
var/obj/item/weapon/grab/G = W
|
|
if(G.affecting.buckled)
|
|
user << "<span class='notice'>[G.affecting] is buckled to [G.affecting.buckled]!</span>"
|
|
return
|
|
if(G.state < GRAB_AGGRESSIVE)
|
|
user << "<span class='notice'>You need a better grip to do that!</span>"
|
|
return
|
|
if(!G.confirm())
|
|
return
|
|
G.affecting.loc = src.loc
|
|
G.affecting.Weaken(5)
|
|
visible_message("\red [G.assailant] puts [G.affecting] on the table.")
|
|
del(W)
|
|
return
|
|
if (istype(W, /obj/item/weapon/wrench))
|
|
user << "\blue Now disassembling the wooden table"
|
|
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
|
|
sleep(50)
|
|
new /obj/item/weapon/table_parts/wood( src.loc )
|
|
new /obj/item/stack/tile/grass( src.loc)
|
|
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
|
|
del(src)
|
|
return
|
|
|
|
if(isrobot(user))
|
|
return
|
|
if(istype(W, /obj/item/weapon/melee/energy/blade))
|
|
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
|
|
spark_system.set_up(5, 0, src.loc)
|
|
spark_system.start()
|
|
playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1)
|
|
playsound(src.loc, "sparks", 50, 1)
|
|
for(var/mob/O in viewers(user, 4))
|
|
O.show_message("\blue The wooden table was sliced apart by [user]!", 1, "\red You hear wood coming apart.", 2)
|
|
new /obj/item/weapon/table_parts/wood( src.loc )
|
|
new /obj/item/stack/tile/grass( src.loc)
|
|
del(src)
|
|
return
|
|
|
|
if(!(W.flags & ABSTRACT))
|
|
if(user.drop_item())
|
|
W.Move(loc)
|
|
var/list/click_params = params2list(params)
|
|
//Center the icon where the user clicked.
|
|
if(!click_params || !click_params["icon-x"] || !click_params["icon-y"])
|
|
return
|
|
//Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf)
|
|
W.pixel_x = Clamp(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2)
|
|
W.pixel_y = Clamp(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2)
|
|
|
|
return 1
|
|
|
|
/obj/structure/glasstable_frame
|
|
name = "glass table frame"
|
|
desc = "A metal frame for a glass table."
|
|
icon = 'icons/obj/structures.dmi'
|
|
icon_state = "glass_table_frame"
|
|
density = 1
|
|
|
|
/obj/structure/glasstable_frame/attackby(obj/item/I as obj, mob/user as mob, params)
|
|
if(istype(I, /obj/item/stack/sheet/glass))
|
|
var/obj/item/stack/sheet/glass/G = I
|
|
if(G.amount >= 2)
|
|
user << "<span class='notice'>You start to add the glass to \the [src].</span>"
|
|
if(do_after(user, 10))
|
|
G.use(2)
|
|
user << "<span class='notice'>You add the glass to \the [src].</span>"
|
|
playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
|
|
new /obj/structure/table/glass(loc)
|
|
del(src)
|
|
else
|
|
user << "<span class='notice'>You don't have enough glass! You need at least 2 sheets.</span>"
|
|
return
|
|
|
|
if(iswrench(I))
|
|
user << "<span class='notice'>You start to deconstruct \the [src].</span>"
|
|
playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
|
|
if(do_after(user, 10))
|
|
playsound(src.loc, 'sound/items/Deconstruct.ogg', 75, 1)
|
|
user << "<span class='notice'>You dismantle \the [src].</span>"
|
|
new /obj/item/stack/sheet/metal(loc)
|
|
new /obj/item/stack/sheet/metal(loc)
|
|
del(src)
|
|
|
|
/obj/structure/table/glass
|
|
name = "glass table"
|
|
desc = "Looks fragile. You should totally flip it. It is begging for it."
|
|
icon_state = "glass_table"
|
|
parts = /obj/item/weapon/table_parts/glass
|
|
health = 10
|
|
|
|
/obj/structure/table/glass/flip(var/direction)
|
|
src.collapse()
|
|
|
|
/obj/structure/table/glass/proc/collapse() //glass table collapse is called twice in this code, more efficent to just have a proc
|
|
src.visible_message("<span class='warning'>\The [src] shatters, and the frame collapses!</span>", "<span class='warning'>You hear metal collapsing and glass shattering.</span>")
|
|
new /obj/item/weapon/table_parts/glass(loc)
|
|
getFromPool(/obj/item/weapon/shard, loc)
|
|
if(prob(50)) //50% chance to spawn two shards
|
|
getFromPool(/obj/item/weapon/shard, loc)
|
|
qdel(src)
|
|
|
|
/obj/structure/table/glass/attackby(obj/item/I as obj, mob/user as mob, params)
|
|
|
|
if (istype(I, /obj/item/weapon/grab))
|
|
var/obj/item/weapon/grab/G = I
|
|
if(G.affecting.buckled)
|
|
user << "<span class='notice'>[G.affecting] is buckled to [G.affecting.buckled]!</span>"
|
|
return
|
|
if(G.state < GRAB_AGGRESSIVE)
|
|
user << "<span class='notice'>You need a better grip to do that!</span>"
|
|
return
|
|
if(!G.confirm())
|
|
return
|
|
G.affecting.loc = src.loc
|
|
G.affecting.Weaken(7)
|
|
visible_message("<span class='warning'>[G.assailant] smashes [G.affecting] onto \the [src]!</span>")
|
|
del(I)
|
|
src.collapse()
|
|
return
|
|
|
|
if (istype(I, /obj/item/weapon/wrench))
|
|
user << "\blue Now disassembling the glass table"
|
|
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
|
|
sleep(50)
|
|
new /obj/item/weapon/table_parts/glass( src.loc )
|
|
new /obj/item/stack/sheet/glass( src.loc )
|
|
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
|
|
del(src)
|
|
return
|
|
|
|
if(isrobot(user))
|
|
return
|
|
if(istype(I, /obj/item/weapon/melee/energy/blade))
|
|
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
|
|
spark_system.set_up(5, 0, src.loc)
|
|
spark_system.start()
|
|
playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1)
|
|
playsound(src.loc, "sparks", 50, 1)
|
|
for(var/mob/O in viewers(user, 4))
|
|
O.show_message("<span class='notice'>\The [src] was sliced apart by [user]!</span>", 1, "<span class='warning'>You hear glass being sliced apart.</span>", 2)
|
|
new /obj/item/weapon/table_parts/glass( src.loc )
|
|
new /obj/item/stack/sheet/glass( src.loc )
|
|
del(src)
|
|
return
|
|
|
|
if(!(I.flags & ABSTRACT))
|
|
if(user.drop_item())
|
|
I.Move(loc)
|
|
var/list/click_params = params2list(params)
|
|
//Center the icon where the user clicked.
|
|
if(!click_params || !click_params["icon-x"] || !click_params["icon-y"])
|
|
return
|
|
//Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf)
|
|
I.pixel_x = Clamp(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2)
|
|
I.pixel_y = Clamp(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2)
|
|
|
|
return 1
|
|
|
|
|
|
/*
|
|
* Reinforced tables
|
|
*/
|
|
/obj/structure/table/reinforced
|
|
name = "reinforced table"
|
|
desc = "A version of the four legged table. It is stronger."
|
|
icon_state = "reinf_table"
|
|
health = 200
|
|
var/status = 2
|
|
parts = /obj/item/weapon/table_parts/reinforced
|
|
|
|
/obj/structure/table/reinforced/flip(var/direction)
|
|
if (status == 2)
|
|
return 0
|
|
else
|
|
return ..()
|
|
|
|
/obj/structure/table/reinforced/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
|
|
if (istype(W, /obj/item/weapon/weldingtool))
|
|
var/obj/item/weapon/weldingtool/WT = W
|
|
if(WT.remove_fuel(0, user))
|
|
if(src.status == 2)
|
|
user << "\blue Now weakening the reinforced table"
|
|
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
|
|
if (do_after(user, 50))
|
|
if(!src || !WT.isOn()) return
|
|
user << "\blue Table weakened"
|
|
src.status = 1
|
|
else
|
|
user << "\blue Now strengthening the reinforced table"
|
|
playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
|
|
if (do_after(user, 50))
|
|
if(!src || !WT.isOn()) return
|
|
user << "\blue Table strengthened"
|
|
src.status = 2
|
|
return
|
|
return
|
|
|
|
if (istype(W, /obj/item/weapon/wrench))
|
|
if(src.status == 2)
|
|
return
|
|
|
|
..()
|
|
|
|
/*
|
|
* Racks
|
|
*/
|
|
/obj/structure/rack
|
|
name = "rack"
|
|
desc = "Different from the Middle Ages version."
|
|
icon = 'icons/obj/objects.dmi'
|
|
icon_state = "rack"
|
|
density = 1
|
|
anchored = 1.0
|
|
throwpass = 1 //You can throw objects over this, despite it's density.
|
|
var/parts = /obj/item/weapon/rack_parts
|
|
|
|
/obj/structure/rack/proc/destroy()
|
|
new parts(loc)
|
|
density = 0
|
|
del(src)
|
|
|
|
/obj/structure/rack/ex_act(severity)
|
|
switch(severity)
|
|
if(1.0)
|
|
qdel(src)
|
|
if(2.0)
|
|
qdel(src)
|
|
if(prob(50))
|
|
new /obj/item/weapon/rack_parts(src.loc)
|
|
if(3.0)
|
|
if(prob(25))
|
|
qdel(src)
|
|
new /obj/item/weapon/rack_parts(src.loc)
|
|
|
|
/obj/structure/rack/blob_act()
|
|
if(prob(75))
|
|
del(src)
|
|
return
|
|
else if(prob(50))
|
|
new /obj/item/weapon/rack_parts(src.loc)
|
|
del(src)
|
|
return
|
|
|
|
/obj/structure/rack/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
|
if(air_group || (height==0)) return 1
|
|
if(src.density == 0) //Because broken racks -Agouri |TODO: SPRITE!|
|
|
return 1
|
|
if(istype(mover) && mover.checkpass(PASSTABLE))
|
|
return 1
|
|
else
|
|
return 0
|
|
|
|
/obj/structure/rack/MouseDrop_T(obj/O as obj, mob/user as mob)
|
|
if ((!( istype(O, /obj/item/weapon) ) || user.get_active_hand() != O))
|
|
return
|
|
if(isrobot(user))
|
|
return
|
|
if(!user.drop_item())
|
|
return
|
|
if (O.loc != src.loc)
|
|
step(O, get_dir(O, src))
|
|
return
|
|
|
|
/obj/structure/rack/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
|
|
if (istype(W, /obj/item/weapon/wrench))
|
|
new /obj/item/weapon/rack_parts( src.loc )
|
|
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
|
|
del(src)
|
|
return
|
|
if(isrobot(user))
|
|
return
|
|
if(!(W.flags & ABSTRACT))
|
|
if(user.drop_item())
|
|
W.Move(loc)
|
|
return
|
|
|
|
/obj/structure/rack/meteorhit(obj/O as obj)
|
|
del(src)
|
|
|
|
|
|
/obj/structure/table/attack_hand(mob/user)
|
|
if(HULK in user.mutations)
|
|
visible_message("<span class='danger'>[user] smashes [src] apart!</span>")
|
|
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
|
|
destroy()
|
|
|
|
|
|
/obj/structure/rack/attack_paw(mob/living/user)
|
|
if(HULK in user.mutations)
|
|
user.do_attack_animation(src)
|
|
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
|
|
visible_message("<span class='danger'>[user] smashes [src] apart!</span>")
|
|
destroy()
|
|
|
|
|
|
/obj/structure/rack/attack_alien(mob/living/user)
|
|
user.do_attack_animation(src)
|
|
visible_message("<span class='danger'>[user] slices [src] apart!</span>")
|
|
destroy()
|
|
|
|
|
|
/obj/structure/rack/attack_animal(mob/living/simple_animal/user)
|
|
if(user.environment_smash)
|
|
user.do_attack_animation(src)
|
|
visible_message("<span class='danger'>[user] smashes [src] apart!</span>")
|
|
destroy()
|
|
|
|
/obj/structure/rack/attack_tk() // no telehulk sorry
|
|
return
|