mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-13 11:43:31 +00:00
[MIRROR] Adds AlliCo Grab-A-Gift
This commit is contained in:
@@ -30,7 +30,7 @@
|
|||||||
// If it's a generic arcade machine, pick a random arcade
|
// If it's a generic arcade machine, pick a random arcade
|
||||||
// circuit board for it and make the new machine
|
// circuit board for it and make the new machine
|
||||||
if(!circuit)
|
if(!circuit)
|
||||||
var/choice = pick(typesof(/obj/item/weapon/circuitboard/arcade) - /obj/item/weapon/circuitboard/arcade)
|
var/choice = pick(subtypesof(/obj/item/weapon/circuitboard/arcade) - /obj/item/weapon/circuitboard/arcade/clawmachine)
|
||||||
var/obj/item/weapon/circuitboard/CB = new choice()
|
var/obj/item/weapon/circuitboard/CB = new choice()
|
||||||
new CB.build_path(loc, CB)
|
new CB.build_path(loc, CB)
|
||||||
qdel(src)
|
qdel(src)
|
||||||
@@ -1072,3 +1072,250 @@
|
|||||||
#undef ORION_STATUS_NORMAL
|
#undef ORION_STATUS_NORMAL
|
||||||
#undef ORION_STATUS_GAMEOVER
|
#undef ORION_STATUS_GAMEOVER
|
||||||
#undef ORION_STATUS_MARKET
|
#undef ORION_STATUS_MARKET
|
||||||
|
|
||||||
|
//////////////////
|
||||||
|
// Claw Machine //
|
||||||
|
//////////////////
|
||||||
|
|
||||||
|
/obj/machinery/computer/arcade/clawmachine
|
||||||
|
name = "AlliCo Grab-a-Gift"
|
||||||
|
desc = "Show off your arcade skills for that special someone!"
|
||||||
|
icon_state = "clawmachine"
|
||||||
|
icon_keyboard = null
|
||||||
|
icon_screen = null
|
||||||
|
circuit = /obj/item/weapon/circuitboard/arcade/clawmachine
|
||||||
|
prizes = list(/obj/random/plushie)
|
||||||
|
var/wintick = 0
|
||||||
|
var/winprob = 0
|
||||||
|
var/instructions = "Insert 1 thaler or swipe a card to play!"
|
||||||
|
var/gameStatus = "CLAWMACHINE_NEW"
|
||||||
|
var/gamepaid = 0
|
||||||
|
var/gameprice = 1
|
||||||
|
var/winscreen = ""
|
||||||
|
|
||||||
|
/// Payment
|
||||||
|
/obj/machinery/computer/arcade/clawmachine/attackby(obj/item/I as obj, mob/user as mob)
|
||||||
|
if(..())
|
||||||
|
return
|
||||||
|
|
||||||
|
if(gamepaid == 0 && vendor_account && !vendor_account.suspended)
|
||||||
|
var/paid = 0
|
||||||
|
var/obj/item/weapon/card/id/W = I.GetID()
|
||||||
|
if(W) //for IDs and PDAs and wallets with IDs
|
||||||
|
paid = pay_with_card(W,I)
|
||||||
|
else if(istype(I, /obj/item/weapon/spacecash/ewallet))
|
||||||
|
var/obj/item/weapon/spacecash/ewallet/C = I
|
||||||
|
paid = pay_with_ewallet(C)
|
||||||
|
else if(istype(I, /obj/item/weapon/spacecash))
|
||||||
|
var/obj/item/weapon/spacecash/C = I
|
||||||
|
paid = pay_with_cash(C, user)
|
||||||
|
if(paid)
|
||||||
|
gamepaid = 1
|
||||||
|
instructions = "Hit start to play!"
|
||||||
|
return
|
||||||
|
return
|
||||||
|
|
||||||
|
////// Cash
|
||||||
|
/obj/machinery/computer/arcade/clawmachine/proc/pay_with_cash(var/obj/item/weapon/spacecash/cashmoney, mob/user)
|
||||||
|
if(!emagged)
|
||||||
|
if(gameprice > cashmoney.worth)
|
||||||
|
|
||||||
|
// This is not a status display message, since it's something the character
|
||||||
|
// themselves is meant to see BEFORE putting the money in
|
||||||
|
to_chat(usr, "[bicon(cashmoney)] <span class='warning'>That is not enough money.</span>")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if(istype(cashmoney, /obj/item/weapon/spacecash))
|
||||||
|
|
||||||
|
visible_message("<span class='info'>\The [usr] inserts some cash into \the [src].</span>")
|
||||||
|
cashmoney.worth -= gameprice
|
||||||
|
|
||||||
|
if(cashmoney.worth <= 0)
|
||||||
|
usr.drop_from_inventory(cashmoney)
|
||||||
|
qdel(cashmoney)
|
||||||
|
else
|
||||||
|
cashmoney.update_icon()
|
||||||
|
|
||||||
|
// Machine has no idea who paid with cash
|
||||||
|
credit_purchase("(cash)")
|
||||||
|
return 1
|
||||||
|
if(emagged)
|
||||||
|
playsound(src, 'sound/arcade/steal.ogg', 50, 1, extrarange = -3, falloff = 0.1, ignore_walls = FALSE)
|
||||||
|
to_chat(user, "<span class='info'>It doesn't seem to accept that! Seem you'll need to swipe a valid ID.</span>")
|
||||||
|
|
||||||
|
|
||||||
|
///// Ewallet
|
||||||
|
/obj/machinery/computer/arcade/clawmachine/proc/pay_with_ewallet(var/obj/item/weapon/spacecash/ewallet/wallet)
|
||||||
|
if(!emagged)
|
||||||
|
visible_message("<span class='info'>\The [usr] swipes \the [wallet] through \the [src].</span>")
|
||||||
|
playsound(src, 'sound/machines/id_swipe.ogg', 50, 1)
|
||||||
|
if(gameprice > wallet.worth)
|
||||||
|
visible_message("<span class='info'>Insufficient funds.</span>")
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
wallet.worth -= gameprice
|
||||||
|
credit_purchase("[wallet.owner_name] (chargecard)")
|
||||||
|
return 1
|
||||||
|
if(emagged)
|
||||||
|
playsound(src, 'sound/arcade/steal.ogg', 50, 1, extrarange = -3, falloff = 0.1, ignore_walls = FALSE)
|
||||||
|
to_chat(usr, "<span class='info'>It doesn't seem to accept that! Seem you'll need to swipe a valid ID.</span>")
|
||||||
|
|
||||||
|
///// ID
|
||||||
|
/obj/machinery/computer/arcade/clawmachine/proc/pay_with_card(var/obj/item/weapon/card/id/I, var/obj/item/ID_container)
|
||||||
|
if(I==ID_container || ID_container == null)
|
||||||
|
visible_message("<span class='info'>\The [usr] swipes \the [I] through \the [src].</span>")
|
||||||
|
else
|
||||||
|
visible_message("<span class='info'>\The [usr] swipes \the [ID_container] through \the [src].</span>")
|
||||||
|
playsound(src, 'sound/machines/id_swipe.ogg', 50, 1)
|
||||||
|
var/datum/money_account/customer_account = get_account(I.associated_account_number)
|
||||||
|
if(!customer_account)
|
||||||
|
visible_message("<span class='info'>Error: Unable to access account. Please contact technical support if problem persists.</span>")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if(customer_account.suspended)
|
||||||
|
visible_message("<span class='info'>Unable to access account: account suspended.</span>")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
// Have the customer punch in the PIN before checking if there's enough money. Prevents people from figuring out acct is
|
||||||
|
// empty at high security levels
|
||||||
|
if(customer_account.security_level != 0) //If card requires pin authentication (ie seclevel 1 or 2)
|
||||||
|
var/attempt_pin = input("Enter pin code", "Vendor transaction") as num
|
||||||
|
customer_account = attempt_account_access(I.associated_account_number, attempt_pin, 2)
|
||||||
|
|
||||||
|
if(!customer_account)
|
||||||
|
visible_message("<span class='info'>Unable to access account: incorrect credentials.</span>")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if(gameprice > customer_account.money)
|
||||||
|
visible_message("<span class='info'>Insufficient funds in account.</span>")
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
// Okay to move the money at this point
|
||||||
|
if(emagged)
|
||||||
|
gameprice = customer_account.money
|
||||||
|
// debit money from the purchaser's account
|
||||||
|
customer_account.money -= gameprice
|
||||||
|
|
||||||
|
// create entry in the purchaser's account log
|
||||||
|
var/datum/transaction/T = new()
|
||||||
|
T.target_name = "[vendor_account.owner_name] (via [name])"
|
||||||
|
T.purpose = "Purchase of arcade game([name])"
|
||||||
|
if(gameprice > 0)
|
||||||
|
T.amount = "([gameprice])"
|
||||||
|
else
|
||||||
|
T.amount = "[gameprice]"
|
||||||
|
T.source_terminal = name
|
||||||
|
T.date = current_date_string
|
||||||
|
T.time = stationtime2text()
|
||||||
|
customer_account.transaction_log.Add(T)
|
||||||
|
|
||||||
|
// Give the vendor the money. We use the account owner name, which means
|
||||||
|
// that purchases made with stolen/borrowed card will look like the card
|
||||||
|
// owner made them
|
||||||
|
credit_purchase(customer_account.owner_name)
|
||||||
|
return 1
|
||||||
|
|
||||||
|
/// Add to vendor account
|
||||||
|
|
||||||
|
/obj/machinery/computer/arcade/clawmachine/proc/credit_purchase(var/target as text)
|
||||||
|
vendor_account.money += gameprice
|
||||||
|
|
||||||
|
var/datum/transaction/T = new()
|
||||||
|
T.target_name = target
|
||||||
|
T.purpose = "Purchase of arcade game([name])"
|
||||||
|
T.amount = "[gameprice]"
|
||||||
|
T.source_terminal = name
|
||||||
|
T.date = current_date_string
|
||||||
|
T.time = stationtime2text()
|
||||||
|
vendor_account.transaction_log.Add(T)
|
||||||
|
|
||||||
|
/// End Payment
|
||||||
|
|
||||||
|
/obj/machinery/computer/arcade/clawmachine/New()
|
||||||
|
..()
|
||||||
|
|
||||||
|
/obj/machinery/computer/arcade/clawmachine/attack_hand(mob/living/user)
|
||||||
|
if(..())
|
||||||
|
return
|
||||||
|
tgui_interact(user)
|
||||||
|
|
||||||
|
/// TGUI Stuff
|
||||||
|
|
||||||
|
/obj/machinery/computer/arcade/clawmachine/tgui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/tgui_state/state = GLOB.tgui_default_state)
|
||||||
|
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||||
|
if(!ui)
|
||||||
|
ui = new(user, src, ui_key, "ClawMachine", name, 300, 400, master_ui, state)
|
||||||
|
ui.autoupdate = TRUE
|
||||||
|
ui.open()
|
||||||
|
|
||||||
|
/obj/machinery/computer/arcade/clawmachine/tgui_data(mob/user)
|
||||||
|
var/list/data = list()
|
||||||
|
|
||||||
|
data["wintick"] = wintick
|
||||||
|
data["instructions"] = instructions
|
||||||
|
data["gameStatus"] = gameStatus
|
||||||
|
data["winscreen"] = winscreen
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
|
/obj/machinery/computer/arcade/clawmachine/tgui_act(action, params)
|
||||||
|
if(..())
|
||||||
|
return
|
||||||
|
|
||||||
|
if(action == "newgame" && gamepaid == 0)
|
||||||
|
playsound(src, 'sound/arcade/steal.ogg', 50, 1, extrarange = -3, falloff = 0.1, ignore_walls = FALSE)
|
||||||
|
|
||||||
|
if(action == "newgame" && gamepaid == 1)
|
||||||
|
gameStatus = "CLAWMACHINE_ON"
|
||||||
|
icon_state = "clawmachine_move"
|
||||||
|
instructions = "Guide the claw to the prize you want!"
|
||||||
|
wintick = 0
|
||||||
|
|
||||||
|
if(action == "return" && gameStatus == "CLAWMACHINE_END")
|
||||||
|
gameStatus = "CLAWMACHINE_NEW"
|
||||||
|
|
||||||
|
if(action == "pointless" && wintick < 10)
|
||||||
|
wintick += 1
|
||||||
|
|
||||||
|
if(action == "pointless" && wintick >= 10)
|
||||||
|
instructions = "Insert 1 thaler or swipe a card to play!"
|
||||||
|
clawvend()
|
||||||
|
|
||||||
|
/obj/machinery/computer/arcade/clawmachine/proc/clawvend() /// True to a real claw machine, it's NEARLY impossible to win.
|
||||||
|
winprob += 1 /// Yeah.
|
||||||
|
|
||||||
|
if(prob(winprob)) /// YEAH.
|
||||||
|
if(!emagged)
|
||||||
|
prizevend()
|
||||||
|
winscreen = "You won!"
|
||||||
|
else if(emagged)
|
||||||
|
gameprice = 1
|
||||||
|
emagged = 0
|
||||||
|
winscreen = "You won...?"
|
||||||
|
var/obj/item/weapon/grenade/G = new /obj/item/weapon/grenade/explosive(get_turf(src)) /// YEAAAAAAAAAAAAAAAAAAH!!!!!!!!!!
|
||||||
|
G.activate()
|
||||||
|
G.throw_at(get_turf(usr),10,10) /// Play stupid games, win stupid prizes.
|
||||||
|
|
||||||
|
playsound(src, 'sound/arcade/Ori_win.ogg', 50, 1, extrarange = -3, falloff = 0.1, ignore_walls = FALSE)
|
||||||
|
winprob = 0
|
||||||
|
|
||||||
|
else
|
||||||
|
playsound(src, 'sound/arcade/Ori_fail.ogg', 50, 1, extrarange = -3, falloff = 0.1, ignore_walls = FALSE)
|
||||||
|
winscreen = "Aw, shucks. Try again!"
|
||||||
|
wintick = 0
|
||||||
|
gamepaid = 0
|
||||||
|
icon_state = "clawmachine"
|
||||||
|
gameStatus = "CLAWMACHINE_END"
|
||||||
|
|
||||||
|
/obj/machinery/computer/arcade/clawmachine/emag_act(mob/user)
|
||||||
|
if(!emagged)
|
||||||
|
to_chat(user, "<span class='info'>You modify the claw of the machine. The next one is sure to win! You just have to pay...</span>")
|
||||||
|
name = "AlliCo Snag-A-Prize"
|
||||||
|
desc = "Get some goodies, all for you!"
|
||||||
|
instructions = "Swipe a card to play!"
|
||||||
|
winprob = 100
|
||||||
|
gamepaid = 0
|
||||||
|
wintick = 0
|
||||||
|
gameStatus = "CLAWMACHINE_NEW"
|
||||||
|
emagged = 1
|
||||||
|
return 1
|
||||||
@@ -101,6 +101,11 @@
|
|||||||
build_path = /obj/machinery/computer/arcade/orion_trail
|
build_path = /obj/machinery/computer/arcade/orion_trail
|
||||||
origin_tech = list(TECH_DATA = 1)
|
origin_tech = list(TECH_DATA = 1)
|
||||||
|
|
||||||
|
/obj/item/weapon/circuitboard/arcade/clawmachine
|
||||||
|
name = T_BOARD("grab-a-gift arcade machine")
|
||||||
|
build_path = /obj/machinery/computer/arcade/clawmachine
|
||||||
|
origin_tech = list(TECH_DATA = 1)
|
||||||
|
|
||||||
/obj/item/weapon/circuitboard/turbine_control
|
/obj/item/weapon/circuitboard/turbine_control
|
||||||
name = T_BOARD("turbine control console")
|
name = T_BOARD("turbine control console")
|
||||||
build_path = /obj/machinery/computer/turbine_computer
|
build_path = /obj/machinery/computer/turbine_computer
|
||||||
|
|||||||
85
tgui/packages/tgui/interfaces/ClawMachine.js
Normal file
85
tgui/packages/tgui/interfaces/ClawMachine.js
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
import { useBackend } from "../backend";
|
||||||
|
import { Button, ProgressBar, Flex, Box, LabeledList } from "../components";
|
||||||
|
import { Window } from "../layouts";
|
||||||
|
|
||||||
|
export const ClawMachine = (props, context) => {
|
||||||
|
const { act, data } = useBackend(context);
|
||||||
|
const {
|
||||||
|
wintick,
|
||||||
|
instructions,
|
||||||
|
gameStatus,
|
||||||
|
winscreen,
|
||||||
|
} = data;
|
||||||
|
|
||||||
|
let body;
|
||||||
|
|
||||||
|
if (gameStatus === 'CLAWMACHINE_NEW') {
|
||||||
|
body = (
|
||||||
|
<Box
|
||||||
|
align="center">
|
||||||
|
<br /> <hr />
|
||||||
|
<b>Pay to Play!</b> <br /> <hr />
|
||||||
|
{instructions}
|
||||||
|
<br /> <hr /> <br />
|
||||||
|
<Button content="Start"
|
||||||
|
onClick={() => act('newgame')} />
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else if (gameStatus === 'CLAWMACHINE_END') {
|
||||||
|
body = (
|
||||||
|
<Box
|
||||||
|
align="center">
|
||||||
|
<br /> <hr />
|
||||||
|
<b>Thank you for playing!</b> <br /> <hr />
|
||||||
|
{winscreen}
|
||||||
|
<br /> <hr /> <br />
|
||||||
|
<Button content="Close"
|
||||||
|
onClick={() => act('return')} />
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else if (gameStatus === 'CLAWMACHINE_ON') {
|
||||||
|
body = (
|
||||||
|
<Window.Content>
|
||||||
|
<LabeledList>
|
||||||
|
<LabeledList.Item label="Progress">
|
||||||
|
<ProgressBar
|
||||||
|
ranges={{
|
||||||
|
bad: [-Infinity, 0],
|
||||||
|
average: [1, 7],
|
||||||
|
good: [8, Infinity],
|
||||||
|
}}
|
||||||
|
value={data.wintick}
|
||||||
|
minValue={0}
|
||||||
|
maxValue={10} />
|
||||||
|
</LabeledList.Item>
|
||||||
|
</LabeledList>
|
||||||
|
<Box
|
||||||
|
align="center">
|
||||||
|
<br /> <hr /> <br />
|
||||||
|
{instructions}
|
||||||
|
<br /> <br /> <hr /> <br /> <br />
|
||||||
|
<Button content="Up"
|
||||||
|
onClick={() => act('pointless')} />
|
||||||
|
<br /> <br />
|
||||||
|
<Button content="Left"
|
||||||
|
onClick={() => act('pointless')} />
|
||||||
|
<Button content="Right"
|
||||||
|
onClick={() => act('pointless')} />
|
||||||
|
<br /> <br />
|
||||||
|
<Button content="Down"
|
||||||
|
onClick={() => act('pointless')} />
|
||||||
|
</Box>
|
||||||
|
</Window.Content>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<Window
|
||||||
|
resizable>
|
||||||
|
<center>
|
||||||
|
{body}
|
||||||
|
</center>
|
||||||
|
</Window>
|
||||||
|
);
|
||||||
|
};
|
||||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user