mirror of
https://github.com/goonstation/goonstation-2020.git
synced 2026-07-10 22:52:21 +01:00
904 lines
25 KiB
Plaintext
904 lines
25 KiB
Plaintext
var/list/globalContextActions = null
|
|
/atom/var/list/contextActions = null
|
|
|
|
/atom/var/datum/contextLayout/contextLayout = null //Targets layout is used if possible, users layout otherwise.
|
|
|
|
//Uncomment these two lines for expanding menu testing
|
|
/*
|
|
/obj/item/contextActions = list(/datum/contextAction/expandadd)
|
|
/obj/item/contextLayout = new/datum/contextLayout/expandtest()
|
|
*/
|
|
|
|
/datum/contextLayout
|
|
proc/showButtons(var/list/buttons, var/atom/target)
|
|
return
|
|
|
|
flexdefault
|
|
var/width = 2
|
|
var/spacingX = 16
|
|
var/spacingY = 16
|
|
var/offsetX = 0
|
|
var/offsetY = 0
|
|
|
|
New(var/Width = 2, var/SpacingX = 16, var/SpacingY = 16, var/OffsetX = 0, var/OffsetY = 0)
|
|
width = Width
|
|
spacingX = SpacingX
|
|
spacingY = SpacingY
|
|
offsetX = OffsetX
|
|
offsetY = OffsetY
|
|
return ..()
|
|
|
|
showButtons(var/list/buttons, var/atom/target)
|
|
var/atom/screenCenter = usr.client.virtual_eye
|
|
var/screenX = ((screenCenter.x - target.x) * (-1)) * 32
|
|
var/screenY = ((screenCenter.y - target.y) * (-1)) * 32
|
|
var/offX = 0
|
|
var/offY = spacingY
|
|
|
|
screenX += offsetX
|
|
screenY += offsetY
|
|
|
|
for(var/obj/screen/contextButton/C in buttons)
|
|
C.screen_loc = "CENTER[(screenX) < 0 ? ":[screenX]":":[screenX]"],CENTER[(screenY) < 0 ? ":[screenY]":":[screenY]"]"
|
|
|
|
var/mob/living/carbon/human/H = usr
|
|
if(istype(H)) H.hud.add_screen(C)
|
|
var/mob/living/critter/R = usr
|
|
if(istype(R)) R.hud.add_screen(C)
|
|
var/mob/wraith/W = usr
|
|
if(istype(W)) W.hud.add_screen(C)
|
|
|
|
var/matrix/trans = unpool(/matrix)
|
|
trans = trans.Reset()
|
|
trans.Translate(offX, offY)
|
|
|
|
animate(C, alpha=255, transform=trans, easing=CUBIC_EASING, time=5)
|
|
|
|
offX += spacingX
|
|
if(offX >= spacingX * width)
|
|
offX = 0
|
|
offY -= spacingY
|
|
|
|
return buttons
|
|
|
|
experimentalcircle
|
|
showButtons(var/list/buttons, var/atom/target)
|
|
var/atom/screenCenter = usr.client.virtual_eye
|
|
var/screenX = ((screenCenter.x - target.x) * (-1)) * 32
|
|
var/screenY = ((screenCenter.y - target.y) * (-1)) * 32
|
|
|
|
var/anglePer = round(360 / buttons.len)
|
|
var/dist = 16
|
|
|
|
var/count = 0
|
|
|
|
var/list/bounds = getIconBounds(icon(target.icon, target.icon_state), target.icon_state)
|
|
var/sizeX = bounds["top"] - bounds["bottom"]
|
|
var/sizeY = bounds["right"] - bounds["left"]
|
|
|
|
var/additionalX = target.pixel_x + round((sizeX / 2) )
|
|
var/additionalY = target.pixel_y + round((sizeY / 2) )
|
|
|
|
screenX += additionalX
|
|
screenY += additionalY
|
|
|
|
for(var/obj/screen/contextButton/C in buttons)
|
|
C.screen_loc = "CENTER[(screenX) < 0 ? ":[screenX]":":[screenX]"],CENTER[(screenY) < 0 ? ":[screenY]":":[screenY]"]"
|
|
|
|
var/mob/living/carbon/human/H = usr
|
|
if(istype(H)) H.hud.add_screen(C)
|
|
var/mob/living/critter/R = usr
|
|
if(istype(R)) R.hud.add_screen(C)
|
|
var/mob/wraith/W = usr
|
|
if(istype(W)) W.hud.add_screen(C)
|
|
|
|
var/offX = round(dist*cos(anglePer*count)) + additionalX
|
|
var/offY = round(dist*sin(anglePer*count)) + additionalY
|
|
|
|
var/matrix/trans = unpool(/matrix)
|
|
trans = trans.Reset()
|
|
trans.Translate(offX, offY)
|
|
|
|
animate(C, alpha=255, transform=trans, easing=CUBIC_EASING, time=5)
|
|
count++
|
|
|
|
default
|
|
showButtons(var/list/buttons, var/atom/target)
|
|
var/atom/screenCenter = usr.client.virtual_eye
|
|
var/screenX = ((screenCenter.x - target.x) * (-1)) * 32
|
|
var/screenY = ((screenCenter.y - target.y) * (-1)) * 32
|
|
var/offX = 0
|
|
var/offY = 16
|
|
|
|
for(var/obj/screen/contextButton/C in buttons)
|
|
C.screen_loc = "CENTER[(screenX) < 0 ? ":[screenX]":":[screenX]"],CENTER[(screenY) < 0 ? ":[screenY]":":[screenY]"]"
|
|
|
|
var/mob/living/carbon/human/H = usr
|
|
if(istype(H)) H.hud.add_screen(C)
|
|
var/mob/living/critter/R = usr
|
|
if(istype(R)) R.hud.add_screen(C)
|
|
var/mob/wraith/W = usr
|
|
if(istype(W)) W.hud.add_screen(C)
|
|
|
|
var/matrix/trans = unpool(/matrix)
|
|
trans = trans.Reset()
|
|
trans.Translate(offX, offY)
|
|
|
|
animate(C, alpha=255, transform=trans, easing=CUBIC_EASING, time=5)
|
|
|
|
offX += 16
|
|
if(offX > 16)
|
|
offX = 0
|
|
offY -= 16
|
|
return buttons
|
|
|
|
expandtest
|
|
showButtons(var/list/buttons, var/atom/target)
|
|
var/atom/screenCenter = usr.client.virtual_eye
|
|
var/screenX = ((screenCenter.x - target.x) * (-1)) * 32
|
|
var/screenY = ((screenCenter.y - target.y) * (-1)) * 32
|
|
var/offX = 0
|
|
var/offY = 16
|
|
|
|
var/first = 1
|
|
for(var/obj/screen/contextButton/C in buttons)
|
|
C.screen_loc = "CENTER[(screenX) < 0 ? ":[screenX]":":[screenX]"],CENTER[(screenY) < 0 ? ":[screenY]":":[screenY]"]"
|
|
|
|
var/mob/living/carbon/human/H = usr
|
|
if(istype(H)) H.hud.add_screen(C)
|
|
var/mob/living/critter/R = usr
|
|
if(istype(R)) R.hud.add_screen(C)
|
|
var/mob/wraith/W = usr
|
|
if(istype(W)) W.hud.add_screen(C)
|
|
|
|
var/matrix/trans = unpool(/matrix)
|
|
trans = trans.Reset()
|
|
trans.Translate(offX, offY + (first ? 16 : 0))
|
|
|
|
animate(C, alpha=255, transform=trans, easing=CUBIC_EASING, time=5)
|
|
|
|
offX += (first ? 0 : 16)
|
|
if(offX > 16)
|
|
offX = 0
|
|
offY -= 16
|
|
first = 0
|
|
return buttons
|
|
|
|
//for drawing context menu buttons based on screen_loc position instead of //DONE NOTHING YET
|
|
screen_HUD_default
|
|
var/count_start_pos = 1
|
|
showButtons(var/list/buttons, var/obj/screen/target)
|
|
var/longitude_dir
|
|
var/lattitude_dir
|
|
var/targetx
|
|
var/targety
|
|
|
|
// var/atom/screenCenter = usr.client.virtual_eye
|
|
if (istype(target, /obj/screen))
|
|
var/obj/screen/T = target
|
|
var/regex/R1 = regex("(EAST|WEST)((\\-|\\+)\\d+|)")
|
|
R1.Find(T.screen_loc)
|
|
if (R1.match)
|
|
longitude_dir = R1.group[1]
|
|
targetx = R1.group[2]
|
|
if (R1.group[2] == "")
|
|
targetx = 0
|
|
|
|
var/regex/R2 = regex("(NORTH|SOUTH)((\\-|\\+)\\d+|)")
|
|
R2.Find(T.screen_loc)
|
|
if (R2.match)
|
|
lattitude_dir = R2.group[1]
|
|
targety = R2.group[2]
|
|
if (R2.group[2] == "")
|
|
targety = 0
|
|
else return 0
|
|
|
|
var/count = count_start_pos
|
|
for(var/obj/screen/contextButton/C in buttons)
|
|
//C.screen_loc = "CENTER[(screenX) < 0 ? ":[screenX]":":[screenX]"],CENTER[(screenY) < 0 ? ":[screenY]":":[screenY]"]"
|
|
C.screen_loc = "[lattitude_dir][targetx],[longitude_dir][targety]"
|
|
var/mob/living/carbon/human/H = usr
|
|
if(istype(H)) H.hud.add_screen(C)
|
|
var/mob/living/critter/R = usr
|
|
if(istype(R)) R.hud.add_screen(C)
|
|
var/mob/wraith/W = usr
|
|
if(istype(W)) W.hud.add_screen(C)
|
|
var/mob/dead/observer/GO = usr
|
|
if(istype(GO)) GO.hud.add_screen(C)
|
|
|
|
var/matrix/trans = unpool(/matrix)
|
|
trans = trans.Reset()
|
|
trans.Translate(0, -32*count)
|
|
|
|
animate(C, alpha=255, transform=trans, easing=CUBIC_EASING, time=5)
|
|
|
|
count++
|
|
return buttons
|
|
screen_HUD_default/click_to_close
|
|
count_start_pos = 0
|
|
|
|
/mob
|
|
var/list/contextButtons = list()
|
|
contextLayout = new/datum/contextLayout/flexdefault()
|
|
|
|
proc/checkContextActions(var/atom/target)
|
|
var/list/applicable = list()
|
|
var/obj/item/W = src.equipped()
|
|
if(W && W.contextActions && W.contextActions.len)
|
|
for(var/datum/contextAction/C in W.contextActions)
|
|
var/action = C.checkRequirements(target, src)
|
|
if(action) applicable.Add(action)
|
|
|
|
if(target && target.contextActions && target.contextActions.len)
|
|
for(var/datum/contextAction/C in target.contextActions)
|
|
var/action = C.checkRequirements(target, src)
|
|
if(action) applicable.Add(C)
|
|
|
|
if(src.contextActions && src.contextActions.len)
|
|
for(var/datum/contextAction/C in src.contextActions)
|
|
var/action = C.checkRequirements(target, src)
|
|
if(action) applicable.Add(C)
|
|
|
|
if(applicable.len) return applicable
|
|
else return list()
|
|
|
|
proc/showContextActions(var/list/applicable, var/atom/target)
|
|
if(contextButtons.len)
|
|
closeContextActions()
|
|
var/list/buttons = list()
|
|
for(var/datum/contextAction/C in applicable)
|
|
var/obj/screen/contextButton/B = unpool(/obj/screen/contextButton)
|
|
B.setup(C, src, target)
|
|
B.alpha = 0
|
|
buttons.Add(B)
|
|
if(target.contextLayout)
|
|
target.contextLayout.showButtons(buttons,target)
|
|
else
|
|
contextLayout.showButtons(buttons,target)
|
|
|
|
contextButtons = buttons
|
|
return
|
|
|
|
proc/closeContextActions()
|
|
for(var/obj/screen/contextButton/C in contextButtons)
|
|
var/mob/living/carbon/human/H = src
|
|
if(istype(H)) H.hud.remove_screen(C)
|
|
var/mob/living/critter/R = src
|
|
if(istype(R)) R.hud.remove_screen(C)
|
|
var/mob/wraith/W = src
|
|
if(istype(W)) W.hud.remove_screen(C)
|
|
var/mob/dead/observer/GO = usr
|
|
if(istype(GO)) GO.hud.remove_screen(C)
|
|
contextButtons.Remove(C)
|
|
|
|
pool(C)
|
|
return
|
|
|
|
/atom
|
|
New()
|
|
if(contextActions != null)
|
|
if(globalContextActions == null)
|
|
buildContextActions()
|
|
|
|
var/list/newList = list()
|
|
for(var/A in contextActions) //List of typepaths gets turned into references to instance at runtime.
|
|
if(ispath(A))
|
|
if(globalContextActions && globalContextActions[A])
|
|
if(!(globalContextActions[A] in newList))
|
|
newList.Add(globalContextActions[A])
|
|
contextActions = newList
|
|
..()
|
|
|
|
proc/addContextAction(var/contextType)
|
|
if(!ispath(contextType)) return
|
|
if(globalContextActions && globalContextActions[contextType])
|
|
if(!(globalContextActions[contextType] in contextActions))
|
|
contextActions.Add(globalContextActions[contextType])
|
|
return
|
|
|
|
proc/removeContextAction(var/contextType)
|
|
if(!ispath(contextType)) return
|
|
for(var/datum/contextAction/C in contextActions)
|
|
if(C.type == contextType)
|
|
contextActions.Remove(C)
|
|
return
|
|
|
|
/proc/buildContextActions()
|
|
globalContextActions = list()
|
|
for(var/A in childrentypesof(/datum/contextAction))
|
|
globalContextActions.Add(A)
|
|
globalContextActions[A] = new A()
|
|
return
|
|
|
|
/obj/screen/contextButton
|
|
name = ""
|
|
icon = 'icons/ui/context16x16.dmi'
|
|
icon_state = ""
|
|
var/datum/contextAction/action = null
|
|
var/image/background = null
|
|
var/mob/user = null
|
|
var/atom/target = null
|
|
|
|
proc/setup(var/datum/contextAction/A, var/mob/U, var/atom/T)
|
|
if(!A || !U || !T)
|
|
CRASH("Context Button setup called without valid instances [A],[U],[T]")
|
|
action = A
|
|
user = U
|
|
target = T
|
|
icon = action.getIcon(target,user)
|
|
icon_state = action.getIconState(target, user)
|
|
name = action.getName(target, user)
|
|
|
|
var/matrix/trans = unpool(/matrix)
|
|
trans = trans.Reset()
|
|
trans.Translate(8, 16)
|
|
|
|
|
|
//var/matrix/trans = unpool(/matrix)
|
|
//trans = trans.Reset()
|
|
transform = trans
|
|
|
|
var/possible_bg = action.buildBackgroundIcon(target,user)
|
|
if (possible_bg)
|
|
background = possible_bg
|
|
src.underlays += background
|
|
|
|
if(background == null)
|
|
background = image('icons/ui/context16x16.dmi', src, "[action.getBackground(target, user)]0")
|
|
background.appearance_flags = RESET_COLOR
|
|
src.underlays += background
|
|
return
|
|
|
|
MouseEntered(location,control,params)
|
|
if (usr != user) return
|
|
src.underlays.Cut()
|
|
background.icon_state = "[action.getBackground(target, user)]1"
|
|
src.underlays += background
|
|
if (usr.client.tooltipHolder && (action != null))
|
|
usr.client.tooltipHolder.showHover(src, list(
|
|
"params" = params,
|
|
"title" = action.getName(target, user),
|
|
"content" = action.getDesc(target, user),
|
|
"theme" = "stamina"
|
|
))
|
|
return
|
|
|
|
MouseExited(location,control,params)
|
|
if (usr != user) return
|
|
src.underlays.Cut()
|
|
background.icon_state = "[action.getBackground(target, user)]0"
|
|
src.underlays += background
|
|
if (usr.client.tooltipHolder)
|
|
usr.client.tooltipHolder.hideHover()
|
|
return
|
|
|
|
clicked(list/params)
|
|
if(action.checkRequirements(target, user)) //Let's just check again, just in case.
|
|
SPAWN_DBG(0) action.execute(target, user)
|
|
user.closeContextActions()
|
|
|
|
/datum/contextAction
|
|
var/icon = 'icons/ui/context16x16.dmi'
|
|
var/icon_state = "eye"
|
|
var/icon_background = "bg"
|
|
var/name = ""
|
|
var/desc = ""
|
|
|
|
proc/checkRequirements(var/atom/target, var/mob/user) //Is this action even allowed to show up under the given circumstances? 1=yes, 0=no
|
|
return 0
|
|
|
|
proc/execute(var/atom/target, var/mob/user) //Make sure that people are really allowed to do the thing they are doing in here. Double check equipped items, distance etc.
|
|
return 0
|
|
|
|
proc/getIcon()
|
|
.= icon
|
|
|
|
proc/getIconState(var/atom/target, var/mob/user) //If you want to dynamically change the icon. Cutting/mending wires on doors etc?
|
|
return icon_state
|
|
|
|
proc/getBackground(var/atom/target, var/mob/user)
|
|
return icon_background
|
|
|
|
proc/buildBackgroundIcon(var/atom/target, var/mob/user)
|
|
.= null
|
|
|
|
proc/getName(var/atom/target, var/mob/user)
|
|
return name
|
|
|
|
proc/getDesc(var/atom/target, var/mob/user)
|
|
return desc
|
|
|
|
expandadd
|
|
name = "expandadd"
|
|
desc = "Test One"
|
|
icon_state = "plus"
|
|
icon_background = "bg"
|
|
|
|
checkRequirements(var/atom/target, var/mob/user)
|
|
return 1
|
|
|
|
execute(var/atom/target, var/mob/user) //Order is important for this. Remove first, add after. Always add the expansion button first.
|
|
target.removeContextAction(/datum/contextAction/expandadd)
|
|
target.addContextAction(/datum/contextAction/expandremove)
|
|
target.addContextAction(/datum/contextAction/expandone)
|
|
target.addContextAction(/datum/contextAction/expandtwo)
|
|
target.addContextAction(/datum/contextAction/expandthree)
|
|
var/list/contexts = user.checkContextActions(target)
|
|
if(contexts.len)
|
|
user.showContextActions(contexts, target)
|
|
return 0
|
|
|
|
expandremove
|
|
name = "expandremove"
|
|
desc = "Test Two"
|
|
icon_state = "minus"
|
|
icon_background = "bg"
|
|
|
|
checkRequirements(var/atom/target, var/mob/user)
|
|
return 1
|
|
|
|
execute(var/atom/target, var/mob/user)
|
|
target.removeContextAction(/datum/contextAction/expandremove)
|
|
target.removeContextAction(/datum/contextAction/expandone)
|
|
target.removeContextAction(/datum/contextAction/expandtwo)
|
|
target.removeContextAction(/datum/contextAction/expandthree)
|
|
target.addContextAction(/datum/contextAction/expandadd)
|
|
var/list/contexts = user.checkContextActions(target)
|
|
if(contexts.len)
|
|
user.showContextActions(contexts, target)
|
|
return 0
|
|
|
|
expandone
|
|
name = "expandone"
|
|
desc = "expandone"
|
|
icon_state = "cog"
|
|
icon_background = "bg"
|
|
|
|
checkRequirements(var/atom/target, var/mob/user)
|
|
return 1
|
|
|
|
execute(var/atom/target, var/mob/user)
|
|
return 0
|
|
|
|
expandtwo
|
|
name = "expandtwo"
|
|
desc = "expandtwo"
|
|
icon_state = "cog"
|
|
icon_background = "bg"
|
|
|
|
checkRequirements(var/atom/target, var/mob/user)
|
|
return 1
|
|
|
|
execute(var/atom/target, var/mob/user)
|
|
return 0
|
|
|
|
expandthree
|
|
name = "expandthree"
|
|
desc = "expandthree"
|
|
icon_state = "cog"
|
|
icon_background = "bg"
|
|
|
|
checkRequirements(var/atom/target, var/mob/user)
|
|
return 1
|
|
|
|
execute(var/atom/target, var/mob/user)
|
|
return 0
|
|
|
|
testone
|
|
name = "testone"
|
|
desc = "Test One"
|
|
icon_state = "plus"
|
|
icon_background = "bg"
|
|
|
|
checkRequirements(var/atom/target, var/mob/user)
|
|
return 1
|
|
|
|
execute(var/atom/target, var/mob/user)
|
|
target.addContextAction(/datum/contextAction/testtwo)
|
|
return 0
|
|
|
|
testtwo
|
|
name = "testtwo"
|
|
desc = "Test Two"
|
|
icon_state = "plus"
|
|
icon_background = "bg"
|
|
|
|
checkRequirements(var/atom/target, var/mob/user)
|
|
return 1
|
|
|
|
execute(var/atom/target, var/mob/user)
|
|
target.addContextAction(/datum/contextAction/testthree)
|
|
return 0
|
|
|
|
testthree
|
|
name = "testthree"
|
|
desc = "Test three"
|
|
icon_state = "plus"
|
|
icon_background = "bg"
|
|
|
|
checkRequirements(var/atom/target, var/mob/user)
|
|
return 1
|
|
|
|
execute(var/atom/target, var/mob/user)
|
|
target.addContextAction(/datum/contextAction/testfour)
|
|
return 0
|
|
|
|
testfour
|
|
name = "testfour"
|
|
desc = "Test four"
|
|
icon_state = "minus"
|
|
icon_background = "bg"
|
|
|
|
checkRequirements(var/atom/target, var/mob/user)
|
|
return 1
|
|
|
|
execute(var/atom/target, var/mob/user)
|
|
target.removeContextAction(/datum/contextAction/testtwo)
|
|
target.removeContextAction(/datum/contextAction/testthree)
|
|
target.removeContextAction(/datum/contextAction/testfour)
|
|
return 0
|
|
|
|
ghost_respawn
|
|
name = "ghost"
|
|
desc = "Test"
|
|
icon = 'icons/mob/ghost_observer_abilities.dmi'
|
|
icon_state = "teleport"
|
|
icon_background = ""
|
|
|
|
checkRequirements(var/atom/target, var/mob/user)
|
|
return 1
|
|
|
|
execute(var/atom/target, var/mob/user)
|
|
user.closeContextActions()
|
|
return 0
|
|
|
|
ghost_respawn/close
|
|
name = "Close"
|
|
desc = "Close the menu"
|
|
icon_state = "ghost-close"
|
|
|
|
ghost_respawn/virtual_reality
|
|
name = "Ghost VR"
|
|
desc = "Enter ghost virtual reality"
|
|
icon_state = "ghost-vr"
|
|
|
|
execute(var/atom/target, var/mob/user)
|
|
if (user && istype(user, /mob/dead/observer))
|
|
var/mob/dead/observer/ghost = user
|
|
spawn(1 DECI SECOND)
|
|
ghost.go_to_vr()
|
|
..()
|
|
|
|
ghost_respawn/respawn_animal
|
|
name = "Respawn Animal"
|
|
desc = "Respawn as a tiny critter"
|
|
icon_state = "respawn-animal"
|
|
|
|
execute(var/atom/target, var/mob/user)
|
|
if (user && istype(user, /mob/dead/observer))
|
|
var/mob/dead/observer/ghost = user
|
|
spawn(1 DECI SECOND)
|
|
ghost.respawn_as_animal()
|
|
..()
|
|
|
|
ghost_respawn/ghostdrone
|
|
name = "Ghost Drone"
|
|
desc = "Step on the ghost catcher and be added to the ghost drone queue"
|
|
icon_state = "ghost-drone"
|
|
execute(var/atom/target, var/mob/user)
|
|
if (user && istype(user, /mob/dead/observer))
|
|
var/mob/dead/observer/ghost = user
|
|
spawn(1 DECI SECOND)
|
|
ghost.enter_ghostdrone_queue()
|
|
..()
|
|
|
|
ghost_respawn/afterlife_bar
|
|
name = "Afterlife Bar"
|
|
desc = "Enter the afterlife Bar"
|
|
icon_state = "afterlife-bar"
|
|
|
|
execute(var/atom/target, var/mob/user)
|
|
if (user && istype(user, /mob/dead/observer))
|
|
var/mob/dead/observer/ghost = user
|
|
spawn(1 DECI SECOND)
|
|
ghost.go_to_deadbar()
|
|
..()
|
|
|
|
// ghost_respawn/blobtutorial
|
|
// name = "Blob Tutorial"
|
|
// desc = "Practice blobbing around"
|
|
// icon_state = "blob-tutorial"
|
|
|
|
wraith_poltergeist_button
|
|
name = "wraith"
|
|
desc = "Test"
|
|
icon = 'icons/ui/context32x32.dmi'
|
|
icon_state = "minus"
|
|
icon_background = ""
|
|
var/ability_code = 0
|
|
|
|
New(var/code as num)
|
|
..()
|
|
src.ability_code = code
|
|
switch(code)
|
|
if (1)
|
|
name = "Flip light switches"
|
|
desc = "Flip lights on/off in your area."
|
|
icon_state = "wraith-switch"
|
|
if (2)
|
|
name = "Burn out lights"
|
|
desc = "Break all lights in your area."
|
|
icon_state = "wraith-break-lights"
|
|
if (3)
|
|
name = "Create smoke"
|
|
desc = "Create a smoke that blinds mortals."
|
|
icon_state = "wraith-smoke"
|
|
if (4)
|
|
name = "Create ectoplasm"
|
|
desc = "Summon matter from your realm to you."
|
|
icon_state = "wraith-ectoplasm"
|
|
if (5)
|
|
name = "Sap APC"
|
|
desc = "Drain power from this apc sending it to your realm."
|
|
icon_state = "wraith-apc"
|
|
if (6)
|
|
name = "Haunt PDAs"
|
|
desc = "Haunt PDAs by sending them gruesome and spooky messages."
|
|
icon_state = "wraith-pda"
|
|
if (7)
|
|
name = "Open things"
|
|
desc = "Open doors, lockers, crates"
|
|
icon_state = "wraith-doors"
|
|
if (8)
|
|
name = "random"
|
|
desc = "selects one of the other choices at random to perform."
|
|
icon_state = "wraith-random"
|
|
|
|
checkRequirements(var/atom/target, var/mob/user)
|
|
if (istype(target, /obj/screen/ability/topBar/wraith))
|
|
var/obj/screen/ability/topBar/wraith/B = target
|
|
if (istype(B.owner, /datum/targetable/wraithAbility/poltergeist))
|
|
var/datum/targetable/wraithAbility/poltergeist/A = B.owner
|
|
if (A.cooldowncheck())
|
|
return 1
|
|
else
|
|
return 0
|
|
return 1
|
|
|
|
execute(var/atom/target, var/mob/user)
|
|
if (istype(target, /obj/screen/ability/topBar/wraith))
|
|
var/obj/screen/ability/topBar/wraith/B = target
|
|
if (istype(B.owner, /datum/targetable/wraithAbility/poltergeist))
|
|
var/datum/targetable/wraithAbility/poltergeist/A = B.owner
|
|
A.do_poltergeist_ability(ability_code)
|
|
A.doCooldown()
|
|
// target.addContextAction(/datum/contextAction/testfour)
|
|
user.closeContextActions()
|
|
return 0
|
|
|
|
|
|
genebooth_product
|
|
icon = 'icons/ui/context32x32.dmi'
|
|
var/datum/geneboothproduct/GBP = 0
|
|
var/obj/machinery/genetics_booth/GB = 0
|
|
var/spamt = 0
|
|
|
|
disposing()
|
|
GBP = 0
|
|
GB = 0
|
|
..()
|
|
|
|
execute(var/atom/target, var/mob/user)
|
|
if (GB && GBP)
|
|
GB.select_product(GBP)
|
|
return 0
|
|
|
|
checkRequirements(var/atom/target, var/mob/user)
|
|
.= 0
|
|
if (get_dist(target,user) <= 1 && isliving(user))
|
|
.= GBP && GB
|
|
if (GB && GB.occupant && world.time > spamt + 5)
|
|
user.show_text("[target] is currently occupied. Wait until it's done.", "blue")
|
|
spamt = world.time
|
|
.= 0
|
|
|
|
buildBackgroundIcon(var/atom/target, var/mob/user)
|
|
var/image/background = image('icons/ui/context32x32.dmi', src, "[getBackground(target, user)]0")
|
|
background.appearance_flags = RESET_COLOR
|
|
.= background
|
|
|
|
getIcon()
|
|
if (GBP && GBP.BE)
|
|
.= GBP.BE.icon
|
|
else
|
|
..()
|
|
|
|
getIconState()
|
|
if (GBP && GBP.BE)
|
|
.= GBP.BE.icon_state
|
|
else
|
|
..()
|
|
|
|
getName(var/atom/target, var/mob/user)
|
|
if (GBP)
|
|
.= GBP.name
|
|
else
|
|
..()
|
|
|
|
getDesc(var/atom/target, var/mob/user)
|
|
if (GBP)
|
|
.= "PRICE : [GBP.cost]<br>[GBP.desc]<br><br>There are [GBP.uses] applications left."
|
|
else
|
|
..()
|
|
|
|
deconstruction
|
|
icon = 'icons/ui/context16x16.dmi'
|
|
name = "Deconstruct with Tool"
|
|
desc = "You shouldn't be reading this, bug."
|
|
icon_state = "wrench"
|
|
|
|
execute(var/atom/target, var/mob/user)
|
|
if (isobj(target))
|
|
var/obj/O = target
|
|
if (O.decon_contexts)
|
|
O.decon_contexts -= src
|
|
if (O.decon_contexts.len <= 0)
|
|
user.show_text("Looks like [target] is ready to be deconstructed with the device.", "blue")
|
|
else
|
|
user.showContextActions(O.decon_contexts, O)
|
|
else
|
|
target.removeContextAction(src.type)
|
|
|
|
checkRequirements(var/atom/target, var/mob/user)
|
|
.= 0
|
|
for (var/obj/item/deconstructor/D in user.equipped_list())
|
|
return 1
|
|
|
|
wrench
|
|
name = "Wrench"
|
|
desc = "Wrenching required to deconstruct."
|
|
icon_state = "wrench"
|
|
|
|
execute(var/atom/target, var/mob/user)
|
|
for (var/obj/item/I in user.equipped_list())
|
|
if (iswrenchingtool(I))
|
|
user.show_text("You wrench [target]'s bolts.", "blue")
|
|
playsound(get_turf(target), "sound/items/Ratchet.ogg", 50, 1)
|
|
return ..()
|
|
|
|
cut
|
|
name = "Cut"
|
|
desc = "Cutting required to deconstruct."
|
|
icon_state = "cut"
|
|
|
|
execute(var/atom/target, var/mob/user)
|
|
for (var/obj/item/I in user.equipped_list())
|
|
if (iscuttingtool(I) || issnippingtool(I))
|
|
user.show_text("You cut some vestigial wires from [target].", "blue")
|
|
playsound(get_turf(target), "sound/items/Wirecutter.ogg", 50, 1)
|
|
return ..()
|
|
weld
|
|
name = "Weld"
|
|
desc = "Welding required to deconstruct."
|
|
icon_state = "weld"
|
|
|
|
execute(var/atom/target, var/mob/user)
|
|
user.show_text("You weld [target] carefully.", "blue")
|
|
for (var/obj/item/weldingtool/W in user.equipped_list())
|
|
if (W.get_fuel())
|
|
W.use_fuel(2)
|
|
playsound(get_turf(target), "sound/items/Welder.ogg", 50, 1)
|
|
return ..()
|
|
|
|
pry
|
|
name = "Pry"
|
|
desc = "Prying required to deconstruct. Try a crowbar."
|
|
icon_state = "bar"
|
|
|
|
execute(var/atom/target, var/mob/user)
|
|
for (var/obj/item/I in user.equipped_list())
|
|
if (ispryingtool(I))
|
|
user.show_text("You pry on [target] without remorse.", "blue")
|
|
playsound(get_turf(target), "sound/items/Crowbar.ogg", 50, 1)
|
|
return ..()
|
|
|
|
screw
|
|
name = "Screw"
|
|
desc = "Screwing required to deconstruct."
|
|
icon_state = "screw"
|
|
|
|
execute(var/atom/target, var/mob/user)
|
|
for (var/obj/item/I in user.equipped_list())
|
|
if (isscrewingtool(I))
|
|
user.show_text("You unscrew some of the screws on [target].", "blue")
|
|
playsound(get_turf(target), "sound/items/Screwdriver.ogg", 50, 1)
|
|
return ..()
|
|
|
|
pulse
|
|
name = "Pulse"
|
|
desc = "Pulsing required to deconstruct. Try a multitool."
|
|
icon_state = "pulse"
|
|
|
|
execute(var/atom/target, var/mob/user)
|
|
for (var/obj/item/I in user.equipped_list())
|
|
if (ispulsingtool(I))
|
|
user.show_text("You pulse [target]. In a general sense.", "blue")
|
|
playsound(get_turf(target), "sound/items/penclick.ogg", 50, 1)
|
|
return ..()
|
|
|
|
/*
|
|
offered
|
|
icon = null
|
|
icon_background = null
|
|
|
|
maptext = "<span class='ps2p ol vt c' style='color: #f00;'>Do you want to?</span>"
|
|
charge.maptext_y = -5
|
|
charge.maptext_width = 96
|
|
charge.maptext_x = -9
|
|
|
|
execute(var/atom/target, var/mob/user)
|
|
.= 0
|
|
|
|
checkRequirements(var/atom/target, var/mob/user)
|
|
.= 0
|
|
|
|
item
|
|
var/obj/item/I = null
|
|
|
|
disposing()
|
|
I = null
|
|
..()
|
|
|
|
buildBackgroundIcon-(var/atom/target, var/mob/user)
|
|
var/image/background = image('icons/ui/context32x32.dmi', src, "[getBackground(target, user)]0")
|
|
background.appearance_flags = RESET_COLOR
|
|
.= background
|
|
|
|
|
|
getIcon()
|
|
if (I)
|
|
.= I.icon
|
|
else
|
|
..()
|
|
|
|
getIconState()
|
|
if (I)
|
|
.= I.icon_state
|
|
else
|
|
..()
|
|
|
|
getName(var/atom/target, var/mob/user)
|
|
if (I)
|
|
.= I.name
|
|
else
|
|
..()
|
|
|
|
getDesc(var/atom/target, var/mob/user)
|
|
if (I)
|
|
.= I.desc
|
|
else
|
|
..()
|
|
|
|
accept
|
|
icon_state = "yes"
|
|
var/datum/yesno_dialog/give_dialog = null
|
|
|
|
checkRequirements(var/atom/target, var/mob/user)
|
|
return 1
|
|
|
|
execute(var/atom/target, var/mob/user)
|
|
target.addContextAction(/datum/contextAction/testfour)
|
|
return 0
|
|
|
|
refuse
|
|
icon_state = "no"
|
|
var/datum/yesno_dialog/give_dialog = null
|
|
|
|
|
|
checkRequirements(var/atom/target, var/mob/user)
|
|
return 1
|
|
|
|
execute(var/atom/target, var/mob/user)
|
|
target.addContextAction(/datum/contextAction/testfour)
|
|
return 0
|
|
*/ |