mirror of
https://github.com/spencershepard/RotorOps.git
synced 2025-11-10 15:45:30 +00:00
..
This commit is contained in:
parent
d2f413a126
commit
fc83ebdc1d
BIN
Generator/Forces/red/RED Armor, Infantry & Artillery (Med).miz
Normal file
BIN
Generator/Forces/red/RED Armor, Infantry & Artillery (Med).miz
Normal file
Binary file not shown.
Binary file not shown.
BIN
Generator/Forces/red/RED Trucks & Infantry (Easy).miz
Normal file
BIN
Generator/Forces/red/RED Trucks & Infantry (Easy).miz
Normal file
Binary file not shown.
@ -167,6 +167,7 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
"slots": self.slot_template_comboBox.currentText(),
|
"slots": self.slot_template_comboBox.currentText(),
|
||||||
"zone_protect_sams": self.zone_sams_checkBox.isChecked(),
|
"zone_protect_sams": self.zone_sams_checkBox.isChecked(),
|
||||||
"zone_farps": self.farp_buttonGroup.checkedButton().objectName(),
|
"zone_farps": self.farp_buttonGroup.checkedButton().objectName(),
|
||||||
|
"inf_spawn_msgs": self.inf_spawn_voiceovers_checkBox.isChecked(),
|
||||||
}
|
}
|
||||||
os.chdir(self.m.home_dir + '/Generator')
|
os.chdir(self.m.home_dir + '/Generator')
|
||||||
n = ROps.RotorOpsMission()
|
n = ROps.RotorOpsMission()
|
||||||
|
|||||||
@ -93,7 +93,7 @@ class Ui_MainWindow(object):
|
|||||||
font.setPointSize(12)
|
font.setPointSize(12)
|
||||||
self.blueqty_spinBox.setFont(font)
|
self.blueqty_spinBox.setFont(font)
|
||||||
self.blueqty_spinBox.setMinimum(0)
|
self.blueqty_spinBox.setMinimum(0)
|
||||||
self.blueqty_spinBox.setMaximum(50)
|
self.blueqty_spinBox.setMaximum(8)
|
||||||
self.blueqty_spinBox.setProperty("value", 3)
|
self.blueqty_spinBox.setProperty("value", 3)
|
||||||
self.blueqty_spinBox.setObjectName("blueqty_spinBox")
|
self.blueqty_spinBox.setObjectName("blueqty_spinBox")
|
||||||
self.redqty_spinBox = QtWidgets.QSpinBox(self.centralwidget)
|
self.redqty_spinBox = QtWidgets.QSpinBox(self.centralwidget)
|
||||||
@ -102,7 +102,7 @@ class Ui_MainWindow(object):
|
|||||||
font.setPointSize(12)
|
font.setPointSize(12)
|
||||||
self.redqty_spinBox.setFont(font)
|
self.redqty_spinBox.setFont(font)
|
||||||
self.redqty_spinBox.setMinimum(0)
|
self.redqty_spinBox.setMinimum(0)
|
||||||
self.redqty_spinBox.setMaximum(50)
|
self.redqty_spinBox.setMaximum(8)
|
||||||
self.redqty_spinBox.setProperty("value", 2)
|
self.redqty_spinBox.setProperty("value", 2)
|
||||||
self.redqty_spinBox.setObjectName("redqty_spinBox")
|
self.redqty_spinBox.setObjectName("redqty_spinBox")
|
||||||
self.scenario_label_4 = QtWidgets.QLabel(self.centralwidget)
|
self.scenario_label_4 = QtWidgets.QLabel(self.centralwidget)
|
||||||
@ -161,7 +161,7 @@ class Ui_MainWindow(object):
|
|||||||
font.setPointSize(12)
|
font.setPointSize(12)
|
||||||
self.inf_spawn_spinBox.setFont(font)
|
self.inf_spawn_spinBox.setFont(font)
|
||||||
self.inf_spawn_spinBox.setMinimum(0)
|
self.inf_spawn_spinBox.setMinimum(0)
|
||||||
self.inf_spawn_spinBox.setMaximum(50)
|
self.inf_spawn_spinBox.setMaximum(20)
|
||||||
self.inf_spawn_spinBox.setProperty("value", 2)
|
self.inf_spawn_spinBox.setProperty("value", 2)
|
||||||
self.inf_spawn_spinBox.setObjectName("inf_spawn_spinBox")
|
self.inf_spawn_spinBox.setObjectName("inf_spawn_spinBox")
|
||||||
self.scenario_label_5 = QtWidgets.QLabel(self.centralwidget)
|
self.scenario_label_5 = QtWidgets.QLabel(self.centralwidget)
|
||||||
@ -216,7 +216,7 @@ class Ui_MainWindow(object):
|
|||||||
font.setPointSize(12)
|
font.setPointSize(12)
|
||||||
self.e_attack_helos_spinBox.setFont(font)
|
self.e_attack_helos_spinBox.setFont(font)
|
||||||
self.e_attack_helos_spinBox.setMinimum(0)
|
self.e_attack_helos_spinBox.setMinimum(0)
|
||||||
self.e_attack_helos_spinBox.setMaximum(50)
|
self.e_attack_helos_spinBox.setMaximum(8)
|
||||||
self.e_attack_helos_spinBox.setProperty("value", 2)
|
self.e_attack_helos_spinBox.setProperty("value", 2)
|
||||||
self.e_attack_helos_spinBox.setObjectName("e_attack_helos_spinBox")
|
self.e_attack_helos_spinBox.setObjectName("e_attack_helos_spinBox")
|
||||||
self.scenario_label_7 = QtWidgets.QLabel(self.centralwidget)
|
self.scenario_label_7 = QtWidgets.QLabel(self.centralwidget)
|
||||||
@ -237,7 +237,7 @@ class Ui_MainWindow(object):
|
|||||||
font.setPointSize(12)
|
font.setPointSize(12)
|
||||||
self.e_attack_planes_spinBox.setFont(font)
|
self.e_attack_planes_spinBox.setFont(font)
|
||||||
self.e_attack_planes_spinBox.setMinimum(0)
|
self.e_attack_planes_spinBox.setMinimum(0)
|
||||||
self.e_attack_planes_spinBox.setMaximum(50)
|
self.e_attack_planes_spinBox.setMaximum(8)
|
||||||
self.e_attack_planes_spinBox.setProperty("value", 1)
|
self.e_attack_planes_spinBox.setProperty("value", 1)
|
||||||
self.e_attack_planes_spinBox.setObjectName("e_attack_planes_spinBox")
|
self.e_attack_planes_spinBox.setObjectName("e_attack_planes_spinBox")
|
||||||
self.zone_sams_checkBox = QtWidgets.QCheckBox(self.centralwidget)
|
self.zone_sams_checkBox = QtWidgets.QCheckBox(self.centralwidget)
|
||||||
@ -257,6 +257,7 @@ class Ui_MainWindow(object):
|
|||||||
font = QtGui.QFont()
|
font = QtGui.QFont()
|
||||||
font.setPointSize(10)
|
font.setPointSize(10)
|
||||||
self.inf_spawn_voiceovers_checkBox.setFont(font)
|
self.inf_spawn_voiceovers_checkBox.setFont(font)
|
||||||
|
self.inf_spawn_voiceovers_checkBox.setChecked(True)
|
||||||
self.inf_spawn_voiceovers_checkBox.setObjectName("inf_spawn_voiceovers_checkBox")
|
self.inf_spawn_voiceovers_checkBox.setObjectName("inf_spawn_voiceovers_checkBox")
|
||||||
self.farp_never = QtWidgets.QRadioButton(self.centralwidget)
|
self.farp_never = QtWidgets.QRadioButton(self.centralwidget)
|
||||||
self.farp_never.setGeometry(QtCore.QRect(950, 500, 95, 20))
|
self.farp_never.setGeometry(QtCore.QRect(950, 500, 95, 20))
|
||||||
|
|||||||
@ -255,7 +255,7 @@ p, li { white-space: pre-wrap; }
|
|||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>50</number>
|
<number>8</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="value">
|
<property name="value">
|
||||||
<number>3</number>
|
<number>3</number>
|
||||||
@ -282,7 +282,7 @@ p, li { white-space: pre-wrap; }
|
|||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>50</number>
|
<number>8</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="value">
|
<property name="value">
|
||||||
<number>2</number>
|
<number>2</number>
|
||||||
@ -471,7 +471,7 @@ p, li { white-space: pre-wrap; }
|
|||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>50</number>
|
<number>20</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="value">
|
<property name="value">
|
||||||
<number>2</number>
|
<number>2</number>
|
||||||
@ -647,7 +647,7 @@ p, li { white-space: pre-wrap; }
|
|||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>50</number>
|
<number>8</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="value">
|
<property name="value">
|
||||||
<number>2</number>
|
<number>2</number>
|
||||||
@ -710,7 +710,7 @@ p, li { white-space: pre-wrap; }
|
|||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>50</number>
|
<number>8</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="value">
|
<property name="value">
|
||||||
<number>1</number>
|
<number>1</number>
|
||||||
@ -775,6 +775,9 @@ p, li { white-space: pre-wrap; }
|
|||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Voiceovers on Infantry Spawn</string>
|
<string>Voiceovers on Infantry Spawn</string>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QRadioButton" name="farp_never">
|
<widget class="QRadioButton" name="farp_never">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
|
|||||||
@ -445,7 +445,7 @@ class RotorOpsMission:
|
|||||||
russia, "Enemy Attack Planes", plane["type"],
|
russia, "Enemy Attack Planes", plane["type"],
|
||||||
airport=enemy_airport,
|
airport=enemy_airport,
|
||||||
maintask=dcs.task.CAS,
|
maintask=dcs.task.CAS,
|
||||||
start_type=dcs.mission.StartType.Warm,
|
start_type=dcs.mission.StartType.Cold,
|
||||||
group_size=2)
|
group_size=2)
|
||||||
zone_attack(afg, plane)
|
zone_attack(afg, plane)
|
||||||
|
|
||||||
@ -471,6 +471,7 @@ class RotorOpsMission:
|
|||||||
"RotorOps.force_offroad = " + lb("force_offroad") + "\n\n" +
|
"RotorOps.force_offroad = " + lb("force_offroad") + "\n\n" +
|
||||||
"RotorOps.voice_overs = " + lb("voiceovers") + "\n\n" +
|
"RotorOps.voice_overs = " + lb("voiceovers") + "\n\n" +
|
||||||
"RotorOps.zone_status_display = " + lb("game_display") + "\n\n" +
|
"RotorOps.zone_status_display = " + lb("game_display") + "\n\n" +
|
||||||
|
"RotorOps.inf_spawn_messages = " + lb("inf_spawn_msgs") + "\n\n" +
|
||||||
"RotorOps.inf_spawns_per_zone = " + lb("inf_spawn_qty") + "\n\n" +
|
"RotorOps.inf_spawns_per_zone = " + lb("inf_spawn_qty") + "\n\n" +
|
||||||
"RotorOps.apcs_spawn_infantry = " + lb("apc_spawns_inf") + " \n\n"))))
|
"RotorOps.apcs_spawn_infantry = " + lb("apc_spawns_inf") + " \n\n"))))
|
||||||
self.m.triggerrules.triggers.append(trig)
|
self.m.triggerrules.triggers.append(trig)
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
63
RotorOps.lua
63
RotorOps.lua
@ -64,7 +64,10 @@ local initial_stage_units
|
|||||||
local apcs = {} --table to keep track of infantry vehicles
|
local apcs = {} --table to keep track of infantry vehicles
|
||||||
local low_units_message_fired = false
|
local low_units_message_fired = false
|
||||||
local inf_spawn_zones = {}
|
local inf_spawn_zones = {}
|
||||||
|
local cooldown = {
|
||||||
|
["attack_helo_msg"] = 0,
|
||||||
|
["attack_plane_msg"] = 0,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
RotorOps.gameMsgs = {
|
RotorOps.gameMsgs = {
|
||||||
@ -171,24 +174,51 @@ local sound_effects = {
|
|||||||
["troop_dropoff"] = {'troops_unload_thanks.ogg', 'troops_unload_everybody_off.ogg', 'troops_unload_get_off.ogg', 'troops_unload_here_we_go.ogg', 'troops_unload_moving_out.ogg',},
|
["troop_dropoff"] = {'troops_unload_thanks.ogg', 'troops_unload_everybody_off.ogg', 'troops_unload_get_off.ogg', 'troops_unload_here_we_go.ogg', 'troops_unload_moving_out.ogg',},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function RotorOps.getTime()
|
||||||
|
return timer.getAbsTime() - timer.getTime0() --time since mission started
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function RotorOps.eventHandler:onEvent(event)
|
function RotorOps.eventHandler:onEvent(event)
|
||||||
|
---ENGINE STARTUP EVENTS
|
||||||
if (world.event.S_EVENT_ENGINE_STARTUP == event.id) then --play some sound files when a player starts engines
|
if (world.event.S_EVENT_ENGINE_STARTUP == event.id) then --play some sound files when a player starts engines
|
||||||
local initaitor = event.initiator:getGroup():getID()
|
local initiator = event.initiator:getGroup():getID()
|
||||||
|
|
||||||
|
if #event.initiator:getGroup():getUnits() == 1 then --if there are no other units in the player flight group (preventing duplicated messages for ai wingman flights)
|
||||||
if RotorOps.defending then
|
if RotorOps.defending then
|
||||||
trigger.action.outSoundForGroup(initaitor , RotorOps.gameMsgs.enemy_pushing[RotorOps.active_zone_index + 1][2])
|
trigger.action.outSoundForGroup(initiator , RotorOps.gameMsgs.enemy_pushing[RotorOps.active_zone_index + 1][2])
|
||||||
else
|
else
|
||||||
trigger.action.outSoundForGroup(initaitor , RotorOps.gameMsgs.push[RotorOps.active_zone_index + 1][2])
|
trigger.action.outSoundForGroup(initiator , RotorOps.gameMsgs.push[RotorOps.active_zone_index + 1][2])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if (world.event.S_EVENT_TAKEOFF == event.id) then
|
|
||||||
local initiator_name = event.initiator:getGroup()
|
|
||||||
if initiator_name == "Enemy Attack Helicopters" then
|
|
||||||
RotorOps.gameMsg(RotorOps.gameMsgs.attack_helos)
|
|
||||||
elseif initiator_name == "Enemy Attack Planes" then
|
|
||||||
RotorOps.gameMsg(RotorOps.gameMsgs.attack_planes)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
---TAKEOFF EVENTS
|
||||||
|
if (world.event.S_EVENT_TAKEOFF == event.id) then
|
||||||
|
local initiator_name = event.initiator:getGroup():getName()
|
||||||
|
|
||||||
|
if (initiator_name == "Enemy Attack Helicopters") then
|
||||||
|
--we use flights of two aircraft which triggers two events, but we only want to use one event so we use a cooldown timer
|
||||||
|
if ((RotorOps.getTime() - cooldown["attack_helo_msg"]) > 90) then
|
||||||
|
RotorOps.gameMsg(RotorOps.gameMsgs.attack_helos)
|
||||||
|
cooldown["attack_helo_msg"] = RotorOps.getTime()
|
||||||
|
else
|
||||||
|
env.warning("RotorOps attack helo message skipped")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if initiator_name == "Enemy Attack Planes" then
|
||||||
|
if ((RotorOps.getTime() - cooldown["attack_plane_msg"]) > 90) then
|
||||||
|
RotorOps.gameMsg(RotorOps.gameMsgs.attack_planes)
|
||||||
|
cooldown["attack_plane_msg"] = RotorOps.getTime()
|
||||||
|
else
|
||||||
|
env.warning("RotorOps attack plane message skipped")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
@ -535,7 +565,12 @@ function RotorOps.chargeEnemy(vars)
|
|||||||
|
|
||||||
|
|
||||||
if vars.zone then ---mist getUnitsInZones method
|
if vars.zone then ---mist getUnitsInZones method
|
||||||
local units_in_zone = mist.getUnitsInZones(mist.makeUnitTable({'[red][vehicle]'}), {vars.zone}, "spherical")
|
local units_in_zone
|
||||||
|
if enemy_coal == 1 then
|
||||||
|
units_in_zone = mist.getUnitsInZones(mist.makeUnitTable({'[red][vehicle]'}), {vars.zone}, "spherical")
|
||||||
|
elseif enemy_coal == 2 then
|
||||||
|
units_in_zone = mist.getUnitsInZones(mist.makeUnitTable({'[blue][vehicle]'}), {vars.zone}, "spherical")
|
||||||
|
end
|
||||||
local closest_dist = 10000
|
local closest_dist = 10000
|
||||||
local closest_unit
|
local closest_unit
|
||||||
for index, unit in pairs(units_in_zone) do
|
for index, unit in pairs(units_in_zone) do
|
||||||
@ -904,13 +939,13 @@ function RotorOps.assessUnitsInZone(var)
|
|||||||
local staged_units_remaining = {}
|
local staged_units_remaining = {}
|
||||||
for index, unit in pairs(RotorOps.staged_units) do
|
for index, unit in pairs(RotorOps.staged_units) do
|
||||||
if unit:isExist() then
|
if unit:isExist() then
|
||||||
staged_units_remaining[#staged_units_remaining] = unit
|
staged_units_remaining[#staged_units_remaining + 1] = unit
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
local percent_staged_remain = 0
|
local percent_staged_remain = 0
|
||||||
percent_staged_remain = math.floor((#staged_units_remaining / #RotorOps.staged_units) * 100)
|
percent_staged_remain = math.floor((#staged_units_remaining / #RotorOps.staged_units) * 100)
|
||||||
trigger.action.setUserFlag(RotorOps.staged_units_flag, percent_staged_remain)
|
trigger.action.setUserFlag(RotorOps.staged_units_flag, percent_staged_remain)
|
||||||
debug("Staged units remaining: " + percent_staged_remain + "%")
|
debugMsg("Staged units remaining: "..percent_staged_remain.."%")
|
||||||
|
|
||||||
|
|
||||||
--is the game finished?
|
--is the game finished?
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user