Skip to content

Commit

Permalink
faction management panel
Browse files Browse the repository at this point in the history
  • Loading branch information
Zonespace27 committed Sep 16, 2024
1 parent 1e2a1c1 commit 1e7152b
Show file tree
Hide file tree
Showing 9 changed files with 374 additions and 42 deletions.
1 change: 1 addition & 0 deletions code/modules/admin/admin_verbs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ GLOBAL_LIST_INIT(admin_verbs_default, list(
/datum/admins/proc/toggle_human_ai,
/datum/admins/proc/create_human_ai_patrol,
/client/proc/open_human_ai_management_panel,
/client/proc/open_human_faction_management_panel,
/client/proc/create_human_ai,
/client/proc/other_records,
))
Expand Down
3 changes: 3 additions & 0 deletions code/modules/client/client_defines.dm
Original file line number Diff line number Diff line change
Expand Up @@ -137,3 +137,6 @@

/// Holds the human AI manager panel for this client
var/datum/human_ai_management_menu/human_ai_menu

/// Holds the human faction manager panel for this client
var/datum/human_faction_management_menu/human_faction_menu
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@
return

human_ai_menu = new /datum/human_ai_management_menu(src)
human_ai_menu.tgui_interact(mob)

/client/proc/create_human_ai()
set name = "Create Human AI"
Expand Down
2 changes: 1 addition & 1 deletion code/modules/mob/living/carbon/human/ai/brain/ai_brain.dm
Original file line number Diff line number Diff line change
Expand Up @@ -307,5 +307,5 @@ GLOBAL_LIST_EMPTY(human_ai_brains)
if(!our_faction)
return

our_faction.neutral_factions -= faction
our_faction.remove_neutral_faction(faction)
our_faction.reapply_faction_data()
53 changes: 47 additions & 6 deletions code/modules/mob/living/carbon/human/ai/brain/ai_brain_factions.dm
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
/datum/human_ai_faction
var/faction = FACTION_NEUTRAL
var/shoot_to_kill = TRUE
VAR_PROTECTED/shoot_to_kill = TRUE

var/list/in_combat_lines = list()
var/list/exit_combat_lines = list()
var/list/squad_member_death_lines = list()
VAR_PROTECTED/list/in_combat_lines = list()
VAR_PROTECTED/list/exit_combat_lines = list()
VAR_PROTECTED/list/squad_member_death_lines = list()

var/list/friendly_factions = list()
var/list/neutral_factions = list()
VAR_PROTECTED/list/friendly_factions = list()
VAR_PROTECTED/list/neutral_factions = list()

/datum/human_ai_faction/proc/apply_faction_data(datum/human_ai_brain/brain)
if(length(in_combat_lines))
Expand All @@ -28,6 +28,47 @@
if(brain.tied_human?.faction == faction)
apply_faction_data(brain)

/datum/human_ai_faction/proc/add_friendly_faction(faction)
if(faction in friendly_factions)
return
friendly_factions += faction
if(faction in neutral_factions)
neutral_factions -= faction
reapply_faction_data()

/datum/human_ai_faction/proc/add_neutral_faction(faction)
if(faction in neutral_factions)
return
neutral_factions += faction
if(faction in friendly_factions)
friendly_factions -= faction
reapply_faction_data()

/datum/human_ai_faction/proc/remove_friendly_faction(faction)
if(!(faction in friendly_factions))
return
friendly_factions -= faction
reapply_faction_data()

/datum/human_ai_faction/proc/remove_neutral_faction(faction)
if(!(faction in neutral_factions))
return
neutral_factions -= faction
reapply_faction_data()

/datum/human_ai_faction/proc/get_friendly_factions()
return friendly_factions

/datum/human_ai_faction/proc/get_neutral_factions()
return neutral_factions

/datum/human_ai_faction/proc/set_shoot_to_kill(new_kill = TRUE)
shoot_to_kill = new_kill
reapply_faction_data()

/datum/human_ai_faction/proc/get_shoot_to_kill()
return shoot_to_kill

/datum/human_ai_faction/clf
faction = FACTION_CLF
friendly_factions = list(
Expand Down
145 changes: 145 additions & 0 deletions code/modules/mob/living/carbon/human/ai/faction_management_panel.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
/datum/human_faction_management_menu

/datum/human_faction_management_menu/New()

/datum/human_faction_management_menu/tgui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "HumanFactionManager")
ui.open()

/datum/human_faction_management_menu/ui_state(mob/user)
return GLOB.admin_state

/datum/human_faction_management_menu/ui_data(mob/user)
var/list/data = list()

data["datumless_factions"] = FACTION_LIST_HUMANOID + FACTION_LIST_XENOMORPH

data["factions"] = list()
for(var/faction_name in SShuman_ai.human_ai_factions)
var/datum/human_ai_faction/ai_faction = SShuman_ai.human_ai_factions[faction_name]
data["factions"] += list(list(
"name" = ai_faction.faction,
"shoot_to_kill" = ai_faction.get_shoot_to_kill(),
"friendly_factions" = english_list(ai_faction.get_friendly_factions()),
"neutral_factions" = english_list(ai_faction.get_neutral_factions()),
"ref" = REF(ai_faction),
))
data["datumless_factions"] -= ai_faction.faction

return data

/datum/human_faction_management_menu/ui_static_data(mob/user)
var/list/data = list()

data["all_factions"] = FACTION_LIST_HUMANOID + FACTION_LIST_XENOMORPH

return data

/datum/human_faction_management_menu/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
. = ..()
if(.)
return

switch(action)
if("create_faction")
if(!params["faction"])
return

var/gotten_faction = params["faction"]
if(gotten_faction in SShuman_ai.human_ai_factions)
return

var/datum/human_ai_faction/new_faction = new()
new_faction.faction = gotten_faction
SShuman_ai.human_ai_factions[new_faction.faction] = new_faction
return TRUE

if("set_shoot_to_kill")
if(!params["new_value"] || !params["faction_name"])
return

var/gotten_faction = params["faction_name"]
if(!(gotten_faction in SShuman_ai.human_ai_factions))
return

var/datum/human_ai_faction/faction_obj = SShuman_ai.human_ai_factions[gotten_faction]
faction_obj.set_shoot_to_kill(text2num(params["new_value"]))
return TRUE

if("remove_neutral_faction")
if(!params["faction"])
return

var/gotten_faction = params["faction"]
if(!(gotten_faction in SShuman_ai.human_ai_factions))
return

var/datum/human_ai_faction/faction_obj = SShuman_ai.human_ai_factions[gotten_faction]
var/gotten_input = tgui_input_list(ui.user, "Remove which faction being neutral to [gotten_faction]?", "Remove Neutral Faction", faction_obj.get_neutral_factions())
if(!gotten_input)
return

faction_obj.remove_neutral_faction(gotten_input)
return TRUE

if("remove_friendly_faction")
if(!params["faction"])
return

var/gotten_faction = params["faction"]
if(!(gotten_faction in SShuman_ai.human_ai_factions))
return

var/datum/human_ai_faction/faction_obj = SShuman_ai.human_ai_factions[gotten_faction]
var/gotten_input = tgui_input_list(ui.user, "Remove which faction being friendly to [gotten_faction]?", "Remove Friendly Faction", faction_obj.get_friendly_factions())
if(!gotten_input)
return

faction_obj.remove_friendly_faction(gotten_input)
return TRUE

if("add_neutral_faction")
if(!params["faction"])
return

var/gotten_faction = params["faction"]
if(!(gotten_faction in SShuman_ai.human_ai_factions))
return

var/datum/human_ai_faction/faction_obj = SShuman_ai.human_ai_factions[gotten_faction]
var/gotten_input = tgui_input_list(ui.user, "Set which faction being neutral to [gotten_faction]?", "Add Neutral Faction", (FACTION_LIST_HUMANOID + FACTION_LIST_XENOMORPH) - faction_obj.get_neutral_factions())
if(!gotten_input)
return

faction_obj.add_neutral_faction(gotten_input)

if("add_friendly_faction")
if(!params["faction"])
return

var/gotten_faction = params["faction"]
if(!(gotten_faction in SShuman_ai.human_ai_factions))
return

var/datum/human_ai_faction/faction_obj = SShuman_ai.human_ai_factions[gotten_faction]
var/gotten_input = tgui_input_list(ui.user, "Set which faction being friendly to [gotten_faction]?", "Add Friendly Faction", (FACTION_LIST_HUMANOID + FACTION_LIST_XENOMORPH) - faction_obj.get_friendly_factions())
if(!gotten_input)
return

faction_obj.add_friendly_faction(gotten_input)

/client/proc/open_human_faction_management_panel()
set name = "Human Faction Management Panel"
set category = "Debug.HumanAI"

if(!check_rights(R_DEBUG))
return

if(human_faction_menu)
human_faction_menu.tgui_interact(mob)
return

human_faction_menu = new /datum/human_faction_management_menu(src)
human_faction_menu.tgui_interact(mob)
1 change: 1 addition & 0 deletions colonialmarines.dme
Original file line number Diff line number Diff line change
Expand Up @@ -1980,6 +1980,7 @@
#include "code\modules\mob\living\carbon\human\whisper.dm"
#include "code\modules\mob\living\carbon\human\ai\ai_equipment.dm"
#include "code\modules\mob\living\carbon\human\ai\ai_management_menu.dm"
#include "code\modules\mob\living\carbon\human\ai\faction_management_panel.dm"
#include "code\modules\mob\living\carbon\human\ai\action_datums\orders\order_action.dm"
#include "code\modules\mob\living\carbon\human\ai\action_datums\orders\patrol_waypoints.dm"
#include "code\modules\mob\living\carbon\human\ai\brain\ai_brain_communication.dm"
Expand Down
49 changes: 14 additions & 35 deletions tgui/packages/tgui/interfaces/HumanAIManager.tsx
Original file line number Diff line number Diff line change
@@ -1,19 +1,7 @@
import { useBackend, useLocalState } from '../backend';
import {
Box,
Button,
LabeledList,
NoticeBox,
ProgressBar,
Section,
Dimmer,
Stack,
Tabs,
Divider,
} from '../components';
import { Button, Section, Stack, Divider } from '../components';
import { Window } from '../layouts';
import { InterfaceLockNoticeBox } from './common/InterfaceLockNoticeBox';
import { classes, BooleanLike } from 'common/react';
import { BooleanLike } from 'common/react';

type Squad = {
id: number;
Expand Down Expand Up @@ -52,11 +40,11 @@ const AIContext = (props, context) => {
const { data, act } = useBackend<BackendContext>();
const [squadAssignmentMode, setSquadAssignmentMode] = useLocalState(
'squad_assignment_mode',
false
false,
);
const [orderAssignmentMode, setOrderAssignmentMode] = useLocalState(
'order_assignment_mode',
false
false,
);
return (
<Stack fill vertical>
Expand Down Expand Up @@ -115,19 +103,19 @@ const AIContext = (props, context) => {
<Divider />
<div>
{data.orders.map((order) => (
<CreatedOrder order={order} context={context} id={order.ref} />
<CreatedOrder order={order} id={order.ref} />
))}
</div>
<Divider />
<div>
{data.ai_humans.map((human) => (
<HumanAIReadout human={human} context={context} id={human.ref} />
<HumanAIReadout human={human} id={human.ref} />
))}
</div>
<Divider />
<div>
{data.squads.map((squad) => (
<SquadReadout squad={squad} context={context} id={squad.ref} />
<SquadReadout squad={squad} id={squad.ref} />
))}
</div>
</Stack>
Expand All @@ -140,12 +128,9 @@ const CreatedOrder = (props) => {
const { data, act } = useBackend<BackendContext>();
const [orderAssignmentMode, setOrderAssignmentMode] = useLocalState(
'order_assignment_mode',
false
);
const [selectedSquad, setSelectedSquad] = useLocalState(
'selected_squad',
-1
false,
);
const [selectedSquad, setSelectedSquad] = useLocalState('selected_squad', -1);
return (
<div
style={{
Expand Down Expand Up @@ -201,12 +186,9 @@ const HumanAIReadout = (props) => {
const context: BackendContext = props.context;
const [squadAssignmentMode, setSquadAssignmentMode] = useLocalState(
'squad_assignment_mode',
false
);
const [selectedSquad, setSelectedSquad] = useLocalState(
'selected_squad',
-1
false,
);
const [selectedSquad, setSelectedSquad] = useLocalState('selected_squad', -1);
const { data, act } = useBackend<BackendContext>();
const gottenSquad: Squad = data.squads[selectedSquad];
return (
Expand Down Expand Up @@ -306,15 +288,12 @@ const SquadReadout = (props) => {
const { data, act } = useBackend<BackendContext>();
const [squadAssignmentMode, setSquadAssignmentMode] = useLocalState(
'squad_assignment_mode',
false
);
const [selectedSquad, setSelectedSquad] = useLocalState(
'selected_squad',
-1
false,
);
const [selectedSquad, setSelectedSquad] = useLocalState('selected_squad', -1);
const [orderAssignmentMode, setOrderAssignmentMode] = useLocalState(
'order_assignment_mode',
false
false,
);
return (
<div
Expand Down
Loading

0 comments on commit 1e7152b

Please sign in to comment.