When installing my TC mod to 1.05, it gets through all the RTEs, then crashes when on Metagames.rte.
It's an engine crash, no error numbers, nothing but these:
...etc.
It doesn't even give a consistent debug code, let alone some sort of meaningful log, so I have no idea where to start fixing the mod, unfortunately, or I would have fixed it immediately. It's not affecting non-TC projects, so there's obviously something very particular going on that needs some looking into.
Surely there's an RTE error somewhere or some kind of edge-case problem that can be addressed, but I've spent all this time patiently reporting these very serious, game-crashing bugs with zero tangible support from the devs thus far, and I'd really appreciate it if this issue could be finally brought to Data's attention and addressed
Wed Nov 28, 2012 7:34 pm
Ltp0wer
Joined: Tue Jul 07, 2009 11:44 pm Posts: 5
Re: 1.05, my mod's still broke.
xenoargh wrote:
When [url=linkremovedincaseitiswarez]installing my TC mod[/url] to 1.05, it gets through all the RTEs, then crashes when on Metagames.rte.
What does that archive contain? Is it files from your mod, or is it an upload of all the .RTEs from an outdated Cortex Command folder?
If you took that archive and extracted it's contents to your Cortex Command folder, it would without a doubt break your game due to it replacing newer CC files with outdated ones. I don't know if that's what you're doing, but your post isn't very clear.
Care to elaborate?
EDIT:
That archive contains a lot of unedited content that ships with (outdated) CC, if it is a mod, it needs a major design overhaul. I'm not even sure you're allowed to redistribute those files like that.
Mon Dec 03, 2012 12:10 am
xenoargh
Joined: Fri Dec 30, 2011 3:33 am Posts: 276
Re: 1.05, my mod's still broke.
It had to be designed that way.
Installation is drag-and-drop over an existing install of CC.
Since it's a TC, and due to CC not explicitly supporting TC mods properly (i.e., there is no valid way to tell it not load the existing factions or any of their dependencies) I had to go around it in a fairly complicated way.
Should the engine work like that? Not if we'd like to see serious gameplay mods that are integrated with the campaign or new campaigns that wipe out the default content. That's what any serious modder's going to want to do, after all
But the dependency structure of the game is such that mods aren't allowed to use unitary directory structures very easily for multi-faction mods, aren't allowed to displace or replace the core files without wholesale changes to the core directories (i.e., I can't include a file Foo that replaces file FooBar in the game, explicitly exclude FooBar or anything like that), and generally, that part of the engine needs more serious work, in terms of making it easier for the end-users, just like a lot of the other things related to modding.
Why this situation persists is a bit of a mystery.
Data, hardly anybody bothers playing your game without mods installed, especially if they want a real challenge in the campaign. I built a mod that gave people a 'real game', in the sense that it's actually hard to win the Campaign, playing fair, and I'm getting nothing but crickets here, instead of the kind of support one would expect when one buys your products and invests the kind of time and talent it takes to make stuff like this. What's up with that?
Mon Dec 03, 2012 4:31 pm
p3lb0x
Forum Moderator
Joined: Fri Feb 02, 2007 3:53 pm Posts: 1896 Location: in my little gay bunker
Re: 1.05, my mod's still broke.
I tried making a stripped version of CC at one point that only included effects and an actor or two. But I found that there are a few things that CC is hardcoded to need. Maybe you are overwritting or removing one of these? Or as the guy above was saying, trying to use outdated vanilla content with the newest release is probably a bad idea. I have no idea how extensive your mod is but, I would probably go about remaking it using the values you've already found.
Mon Dec 03, 2012 5:44 pm
xenoargh
Joined: Fri Dec 30, 2011 3:33 am Posts: 276
Re: 1.05, my mod's still broke.
Is it really asking that much to have somebody with a debug build run it once and tell me where the engine's halting? Because whatever's going on here is not a typical RTE error, which I'd be happy to fix.
The problem here is that I have no idea where the haystack is, let alone the needle.
For example, is it crashing because I added new Metagame locations and something changed in the Metagame location file format or definitions of the deployables? This is the most likely, but if true, it's a serious problem. Adding new maps to Metagame should Just Work, provided they're valid CC maps.
Is it crashing because there are new actors in the base directory, or other content / references are now borked? Of course, if so, there should be a RTE error...
Is it crashing because I've defined Turret and ACrabs for Factions that didn't have them defined in Vanilla? If so, it's one of the deep dependency things that really should be taken out, because you can't make a true TC until you're allowed to get rid of the defaults.
Or is it halting because of something arcane, like a sound file not meeting parameters, expecting File A in Directory B to have a byte-length of C, etc.?
Until I know what to look at, it's a complete waste of time, considering how much got changed. I'd pretty much have to rebuild the mod, one directory / RTE dependency tree at a time.
Which, given that it's a TC, is a pretty major undertaking, vs. somebody with a debug version and symbols built running the mod once, seeing the debugger halt, reading the line number and going, "gee, how funny, it stopped on this line because we're now depending on X file in Y directory", etc.
Mon Dec 03, 2012 8:56 pm
Ltp0wer
Joined: Tue Jul 07, 2009 11:44 pm Posts: 5
Re: 1.05, my mod's still broke.
Okay bro, I don't know what you're smoking...
VERY VERY SMALL PARTIAL List of files included in your "mod" that are exactly the same and in the same place as a vanilla CC install:
There are tons more, but after just comparing your Base.rte and the one Activities subfolder, I realized I'd be typing this forum post for the next few hours if I were to continue.
Also, I only bothered mentioning the files that are the same as files in a fresh CC 1.05 install, and didn't even bother mentioning all the outdated VANILLA files that are in there that would replace newer files, therefore breaking the game.
IE, why are you replacing "Cortex Command\Base.rte\Actors\AI\HumanAI.lua" with one from an earlier version?
-- check if this team is controlled by a human local Activ = ActivityMan:GetActivity() for player = Activity.PLAYER_1, Activity.MAXPLAYERCOUNT - 1 do if Activ:PlayerActive(player) and Activ:PlayerHuman(player) then if self.Team == Activ:GetTeamOfPlayer(player) then self.isPlayerOwned = true break end end end
function self:LookForTargets() local Origin local viewAng
if self.deviceState == AHuman.AIMING and self.FirearmIsReady then Origin = ToHeldDevice(self.EquippedItem).MuzzlePos viewAng = 0.1 elseif self.deviceState == AHuman.POINTING then Origin = self.EyePos viewAng = 0.3 elseif self.deviceState == AHuman.THROWING then Origin = self.EyePos viewAng = 0.4 else Origin = self.EyePos viewAng = 0.7 end
local viewLen = SceneMan:ShortestDistance(self.EyePos, self.ViewPoint, false).Magnitude + FrameMan.PlayerScreenWidth*0.5 local Trace = Vector(viewLen, 0):RadRotate(viewAng*NormalRand()+self:GetAimAngle(true)) local ID = SceneMan:CastMORay(Origin, Trace, self.ID, self.IgnoresWhichTeam, rte.grassID, false, 5)
if ID < 255 then local HitPoint = SceneMan:GetLastRayHitPos() if not SceneMan:IsUnseen(HitPoint.X, HitPoint.Y, self.Team) then local MO = MovableMan:GetMOFromID(ID) if ID ~= MO.RootID and MO ~= nil then MO = MovableMan:GetMOFromID(MO.RootID) end
return MO, HitPoint end end end
function self:CalculateThreatLevel(MO) local priority = -SceneMan:ShortestDistance(self.Pos, MO.Pos, false).Magnitude / FrameMan.PlayerScreenWidth if MO.ClassName == "AHuman" or MO.ClassName == "ACrab" then priority = priority + 1 if MO.FirearmIsReady then priority = priority + 2 end end
return priority - MO.Health / 300 end
-- functions that create behaviors. the default behaviors are stored in the HumanBehaviors table. store your custom behaviors in a table to avoid name conflicts between mods. function self:CreateSentryBehavior() if not self.FirearmIsReady and not self.ThrowableIsReady then return end
self.NextBehavior = coroutine.create(HumanBehaviors.Sentry) -- replace "HumanBehaviors.Sentry" with the function name of your own sentry behavior self.NextCleanup = nil self.NextBehaviorName = "Sentry" end
function self:CreatePatrolBehavior() self.NextBehavior = coroutine.create(HumanBehaviors.Patrol) self.NextCleanup = nil self.NextBehaviorName = "Patrol" end
function self:CreateGoldDigBehavior() self.NextBehavior = coroutine.create(HumanBehaviors.GoldDig) self.NextCleanup = nil self.NextBehaviorName = "GoldDig" end
function self:CreateBrainSearchBehavior() self.NextBehavior = coroutine.create(HumanBehaviors.BrainSearch) self.NextCleanup = nil self.NextBehaviorName = "BrainSearch" end
function self:CreateGetToolBehavior() self.NextBehavior = coroutine.create(HumanBehaviors.ToolSearch) self.NextCleanup = nil self.NextBehaviorName = "ToolSearch" end
function self:CreateGetWeaponBehavior() self.NextBehavior = coroutine.create(HumanBehaviors.WeaponSearch) self.NextCleanup = nil self.NextBehaviorName = "WeaponSearch" end
function self:CreateGoToBehavior() self.NextGoTo = coroutine.create(HumanBehaviors.GoToWpt) self.NextGoToCleanup = function(self) self.lateralMoveState = Actor.LAT_STILL self.deviceState = AHuman.STILL self.crawling = false self.jump = false self.fire = false self:EquipFirearm(true) self:ClearMovePath() end self.NextGoToName = "GoToWpt" end
function self:CreateAttackBehavior() --Adds auto-throw behaviors for characters that spawn with thrown items. if self.ThrowableIsReady == true then self.NextBehavior = coroutine.create(HumanBehaviors.ThrowTarget) self.NextBehaviorName = "ThrowTarget" elseif self:EquipFirearm(true) then self.NextBehavior = coroutine.create(HumanBehaviors.ShootTarget) self.NextBehaviorName = "ShootTarget" elseif self:EquipThrowable(true) then self.NextBehavior = coroutine.create(HumanBehaviors.ThrowTarget) self.NextBehaviorName = "ThrowTarget" elseif self:EquipDiggingTool(true) and SceneMan:ShortestDistance(self.Pos, self.Target.Pos, false).Magnitude < 150 then self.NextBehavior = coroutine.create(HumanBehaviors.AttackTarget) self.NextBehaviorName = "AttackTarget" else -- unarmed or far away if self.PickUpTimer:IsPastSimMS(2500) then self.PickUpTimer:Reset() self.NextBehavior = coroutine.create(HumanBehaviors.WeaponSearch) self.NextBehaviorName = "WeaponSearch" self.NextCleanup = nil
return else -- there are probably no weapons around here (in the vicinity of an area adjacent to a location) self.NextBehavior = coroutine.create(HumanBehaviors.AttackTarget) self.NextBehaviorName = "AttackTarget" end end
self.NextCleanup = function(self) self.fire = false self.Target = nil self.deviceState = AHuman.STILL self.proneState = AHuman.NOTPRONE end end
function self:CreateMoveAroundBehavior() self.NextGoTo = coroutine.create(HumanBehaviors.MoveAroundActor) self.NextGoToCleanup = function(self) self.lateralMoveState = Actor.LAT_STILL self.jump = false end self.NextGoToName = "MoveAroundActor" end
-- the controllers self.XposPID = RegulatorPID:New{p=0.04, i=0.00001, d=0.4, filter_leak=0.8, integral_max=100} self.YposPID = RegulatorPID:New{p=0.05, i=0.0001, d=0.2, filter_leak=0.8, integral_max=100} self.isAISet = 0 ---------------- AI variables end ---------------- end
function UpdateAI(self) if self.isAISet == 0 then -- ACTOR SELF-MANAGEMENT -- The brain should try to dig itself into the ground to fortify itself against counterattack print("attempting to set AI states!") if self:IsInGroup("Brains") or self:IsInGroup("Engineers") and not self:IsInGroup("Static Brains") then self.AIMode = Actor.AIMODE_GOLDDIG; self.NextBehavior = coroutine.create(HumanBehaviors.GoldDig) self.NextCleanup = nil self.NextBehaviorName = "GoldDig" end -- Not a brain, so is it a humanoid that can go hunt the enemy brain? if self:IsInGroup("Mecha") or self:IsInGroup("Assault") then self.AIMode = Actor.AIMODE_BRAINHUNT; self.NextBehavior = coroutine.create(HumanBehaviors.BrainSearch) self.NextCleanup = nil self.NextBehaviorName = "BrainSearch" end if self:IsInGroup("Turrets") or self:IsInGroup("Guards") then self.AIMode = Actor.AIMODE_SENTRY; self.NextBehavior = coroutine.create(HumanBehaviors.Sentry) -- replace "HumanBehaviors.Sentry" with the function name of your own sentry behavior self.NextCleanup = nil self.NextBehaviorName = "Sentry" end self.isAISet = 1 end
if self.PlayerInterferedTimer:IsPastSimTimeLimit() then self.Behavior = nil -- remove the current behavior if self.BehaviorCleanup then self.BehaviorCleanup(self) -- clean up after the current behavior self.BehaviorCleanup = nil end
self.GoToBehavior = nil if self.GoToCleanup then self.GoToCleanup(self) self.GoToCleanup = nil end
-- switch to the next GoTo behavior, if avaliable if self.NextGoTo then if self.GoToCleanup then self.GoToCleanup(self) end
self.GoToBehavior = self.NextGoTo self.GoToCleanup = self.NextGoToCleanup self.NextGoTo = nil end
-- check if the AI mode has changed or if we need a new behavior if self.AIMode ~= self.lastAIMode or (not self.Behavior and not self.GoToBehavior) then self.Behavior = nil if self.BehaviorCleanup then self.BehaviorCleanup(self) -- stop the current behavior self.BehaviorCleanup = nil end
self.GoToBehavior = nil if self.GoToCleanup then self.GoToCleanup(self) self.GoToCleanup = nil end
-- select a new behavior based on AI mode if self.AIMode == Actor.AIMODE_GOTO then self:CreateGoToBehavior() elseif self.AIMode == Actor.AIMODE_BRAINHUNT then self:CreateBrainSearchBehavior() elseif self.AIMode == Actor.AIMODE_GOLDDIG then self:CreateGoldDigBehavior() elseif self.AIMode == Actor.AIMODE_PATROL then self:CreatePatrolBehavior() else if self.AIMode ~= self.lastAIMode and self.AIMode == Actor.AIMODE_SENTRY then self.SentryFacing = self.HFlipped -- store the direction in which we should be looking self.SentryPos = Vector(self.Pos.X, self.Pos.Y) -- store the pos on which we should be standing end
self:CreateSentryBehavior() end
self.lastAIMode = self.AIMode end
-- check if the legs reach the ground if self.AirTimer:IsPastSimMS(250) then self.AirTimer:Reset()
if -1 < SceneMan:CastObstacleRay(self.Pos, Vector(0, self.Height/4), Vector(), Vector(), self.ID, self.IgnoresWhichTeam, rte.grassID, 3) then self.flying = false else self.flying = true end
self:EquipShieldInBGArm() -- try to equip a shield end
-- look for targets local FoundMO, HitPoint = self:LookForTargets() if FoundMO then if self.Target and MovableMan:IsActor(self.Target) and FoundMO.ID == self.Target.ID then -- found the same target self.TargetOffset = (self.TargetOffset + SceneMan:ShortestDistance(self.Target.Pos, HitPoint, false))/2 self.TargetLostTimer:Reset() self.ReloadTimer:Reset() elseif MovableMan:IsActor(FoundMO) then if FoundMO.Team == self.Team then if self.Target then if SceneMan:ShortestDistance(self.Pos, FoundMO.Pos, false).Magnitude < SceneMan:ShortestDistance(self.Pos, self.Target.Pos, false).Magnitude then self.Target = nil -- stop shooting end else if FoundMO.ClassName ~= "ADoor" and SceneMan:ShortestDistance(self.Pos, FoundMO.Pos, false).Magnitude < self.Diameter + FoundMO.Diameter then self.BlockingActor = ToActor(FoundMO) end end else if FoundMO.ClassName == "AHuman" then FoundMO = ToAHuman(FoundMO) elseif FoundMO.ClassName == "ACrab" then FoundMO = ToACrab(FoundMO) elseif FoundMO.ClassName == "ACRocket" then FoundMO = ToACRocket(FoundMO) elseif FoundMO.ClassName == "ACDropShip" then FoundMO = ToACDropShip(FoundMO) elseif FoundMO.ClassName == "ADoor" then FoundMO = ToADoor(FoundMO) elseif FoundMO.ClassName == "Actor" then FoundMO = ToActor(FoundMO) else FoundMO = nil end
if FoundMO then self.ReloadTimer:Reset() self.TargetLostTimer:Reset()
if self.Target then -- check if this MO sould be targeted instead if self:CalculateThreatLevel(FoundMO) > self:CalculateThreatLevel(self.Target) + 0.1 then self.OldTargetPos = self.Target.Pos self.Target = FoundMO self.TargetOffset = SceneMan:ShortestDistance(self.Target.Pos, HitPoint, false) -- this it the distance vector from the target center to the point we hit with our ray self:CreateAttackBehavior() end else self.OldTargetPos = nil self.Target = FoundMO self.TargetOffset = SceneMan:ShortestDistance(self.Target.Pos, HitPoint, false) -- this it the distance vector from the target center to the point we hit with our ray self:CreateAttackBehavior() end end end end else -- no target found this frame if self.Target and self.TargetLostTimer:IsPastSimTimeLimit() then self.OldTargetPos = self.Target.Pos self.Target = nil -- the target has been out of sight for too long, ignore it end
if self.ReloadTimer:IsPastSimMS(8000) then -- check if we need to reload self.ReloadTimer:Reset() if ToAHuman(self).FirearmNeedsReload then self:ReloadFirearm() end end end
-- run the move behavior and delete it if it returns true if self.GoToBehavior then local msg, done = coroutine.resume(self.GoToBehavior, self) if not msg then ConsoleMan:PrintString(self.PresetName .. " " .. self.NextGoToName .. " error:\n" .. done) -- print the error message done = true end
if done then self.GoToBehavior = nil if self.GoToCleanup then self.GoToCleanup(self) self.GoToCleanup = nil end end elseif self.flying then -- avoid falling damage if (not self.jump and self.Vel.Y > 9) or (self.jump and self.Vel.Y > 6) then self.jump = true
-- try falling straight down if not self.Target then if self.Vel.X > 2 then self.lateralMoveState = Actor.LAT_LEFT elseif self.Vel.X < -2 then self.lateralMoveState = Actor.LAT_RIGHT else self.lateralMoveState = Actor.LAT_STILL end end else self.jump = false self.lateralMoveState = Actor.LAT_STILL end else self.jump = false self.lateralMoveState = Actor.LAT_STILL end
-- run the selected behavior and delete it if it returns true if self.Behavior then local msg, done = coroutine.resume(self.Behavior, self) if not msg then ConsoleMan:PrintString(self.PresetName .. " behavior " .. self.BehaviorName .. " error:\n" .. done) -- print the error message done = true end
if done then self.Behavior = nil if self.BehaviorCleanup then self.BehaviorCleanup(self) self.BehaviorCleanup = nil end
if not self.NextBehavior and not self.PickupHD and self.PickUpTimer:IsPastSimMS(2000) then self.PickUpTimer:Reset()
if not self:EquipFirearm(false) then self:CreateGetWeaponBehavior() elseif self.AIMode ~= Actor.AIMODE_SENTRY and not self:EquipDiggingTool(false) then self:CreateGetToolBehavior() end end end elseif not self.Target and not self.PickupHD and not self.NextBehavior and self.PickUpTimer:IsPastSimMS(4000) then -- check if we need to look for weapons to pick up self.PickUpTimer:Reset()
if not self:EquipFirearm(false) then self:CreateGetWeaponBehavior() elseif self.AIMode ~= Actor.AIMODE_SENTRY and not self:EquipDiggingTool(false) then self:CreateGetToolBehavior() end end
if self.PickupHD then -- there is a HeldDevice we want to pick up if not MovableMan:IsDevice(self.PickupHD) or self.PickupHD.ID ~= self.PickupHD.RootID then self.PickupHD = nil -- the HeldDevice has been destroyed or picked up self:ClearAIWaypoints()
if self.PrevAIWaypoint or self.FollowingActor then if self.FollowingActor and MovableMan:IsActor(self.FollowingActor) then -- what if the old destination was a moving actor? self:AddAIMOWaypoint(self.FollowingActor) self:CreateGoToBehavior() -- continue towards our old destination else self.FollowingActor = nil if self.PrevAIWaypoint then self:AddAISceneWaypoint(self.PrevAIWaypoint) self:CreateGoToBehavior() -- continue towards our old destination end end end else if SceneMan:ShortestDistance(self.Pos, self.PickupHD.Pos, false).Magnitude < self.Height then self.Ctrl:SetState(Controller.WEAPON_PICKUP, true) end end end
-- react to relevant AlarmEvents if self.AlarmTimer:IsPastSimTimeLimit() then self.LastAlarmPos = self.AlarmPos self.AlarmPos = nil
for Event in MovableMan.AlarmEvents do if Event.Team ~= self.Team then -- caused by some other team's activites - alarming! local AlarmVec = SceneMan:ShortestDistance(self.EyePos, Event.ScenePos, false) -- see how far away the alarm situation is
-- only react if the alarm is within range if AlarmVec.Largest * self.Perceptiveness <= Event.Range then -- if this is the same alarm location as last, then don't repeat the signal -- now check if we have line of sight to the alarm point if (not self.LastAlarmPos or SceneMan:ShortestDistance(self.LastAlarmPos, Event.ScenePos, false).Largest > 15) and not SceneMan:CastStrengthRay(self.EyePos, AlarmVec, 6, Vector(), 7, rte.grassID, true) then self.AlarmPos = Event.ScenePos self.AlarmTimer:Reset() break end end end end elseif self.AlarmPos then -- if alarmed, look at the alarming point until AlarmTimer has expired -- point in the direciton we heard the alarm come from if we're not already engaging a target if not self.Target then -- look/point in the direction of alarm self.deviceState = AHuman.AIMING self.Ctrl.AnalogAim = SceneMan:ShortestDistance(self.EyePos, self.AlarmPos, false).Normalized self.lateralMoveState = Actor.LAT_STILL self.jump = false end end
if self.teamBlockState == Actor.IGNORINGBLOCK then if self.BlockedTimer:IsPastSimMS(10000) then self.teamBlockState = Actor.NOTBLOCKED end elseif self.teamBlockState == Actor.BLOCKED then -- we are blocked by a teammate, stop self.lateralMoveState = Actor.LAT_STILL self.jump = false if self.BlockedTimer:IsPastSimMS(20000) then self.BlockedTimer:Reset() self.teamBlockState = Actor.IGNORINGBLOCK end else self.BlockedTimer:Reset() end
-- controller states if self.fire then self.Ctrl:SetState(Controller.WEAPON_FIRE, true) end
if self.deviceState == AHuman.AIMING then self.Ctrl:SetState(Controller.AIM_SHARP, true) end
if self.crawling then self.Ctrl:SetState(Controller.BODY_CROUCH, true) end
if self.jump and self.JetTimeLeft > TimerMan.DeltaTimeMS then if self.jumpState == AHuman.PREJUMP then self.jumpState = AHuman.UPJUMP elseif self.jumpState ~= AHuman.UPJUMP then -- the jetpack is off if self.JetTimeLeft >= self.minBurstTime then -- don't start the jetpack unless there is enough fuel to fire a burst that is long enough to be useful self.jumpState = AHuman.PREJUMP else self.jumpState = AHuman.NOTJUMPING end end else self.jumpState = AHuman.NOTJUMPING end
if self.jumpState == AHuman.PREJUMP then self.Ctrl:SetState(Controller.BODY_JUMPSTART, true) -- trigger burst elseif self.jumpState == AHuman.UPJUMP then self.Ctrl:SetState(Controller.BODY_JUMP, true) -- trigger normal jetpack emission end
if self.proneState == AHuman.GOPRONE then self.proneState = AHuman.PRONE elseif self.proneState == AHuman.PRONE then self.Ctrl:SetState(Controller.BODY_CROUCH, true) end
if self.lateralMoveState == Actor.LAT_LEFT then self.Ctrl:SetState(Controller.MOVE_LEFT, true) elseif self.lateralMoveState == Actor.LAT_RIGHT then self.Ctrl:SetState(Controller.MOVE_RIGHT, true) end end
That's funny, your mod's copy of HumanAI.lua looks a lot like the old way CC used to handle Human AI, before all that information was moved into NativeHumanAI.lua.
Why are you doing these things? How in the hell can you expect your total conversion mod from an earlier version to work on the newest version if there have been massive changes to how the game works? You can't expect the devs to cater to insane requests to have the newest version of CC codebase to be completely backwards compatible with the way thing used to work. You should also stop replacing up to date files with unedited, outdated files. You need to take some credit for your mess and drop the story about how it's not your fault.
So, to recap, you are: Distributing vanilla CC files that are unedited or outdated, that will replace the user's corresponding vanilla updated files. saying this is Data's fault it's not working because he hasn't opened enough of CC's code/engine to the scripting? Saying that he should make the errors less ambiguous to cater to people who expect miracles?
If you can't find the haystack or the needle, maybe you should find a different barn game to play.
Tue Dec 04, 2012 12:31 am
xenoargh
Joined: Fri Dec 30, 2011 3:33 am Posts: 276
Re: 1.05, my mod's still broke.
Quote:
VERY VERY SMALL PARTIAL List of files included in your "mod" that are exactly the same and in the same place as a vanilla CC install:
If they're exactly the same, they cannot cause an issue. What's your point; nobody said that there was a requirement that I not needlessly duplicate data
Quote:
That's funny, your mod's copy of HumanAI.lua looks a lot like the old way CC used to handle Human AI, before all that information was moved into NativeHumanAI.lua.
It is, but only sort of.
If you know your Lua you can compare with R27 and see where it's radically different. They more-or-less copied my approach (i.e., developing AI via dependencies so that we can keep physical sim thread-safe from AI), not the other way 'round, because it just made sense.
If that were the only issue here, I'd just do some Lua hacking and be done already, but I have a much bigger problem; the game won't start nor will it give me a RTE error in the log.
Anyhow, I'm really sorry that you feel like you need to get on a soapbox and be a jerk, but frankly you have very little understanding of the situation here.
The engine SHOULD be giving me a meaningful error message if it's halting due to RTE dependencies not being present. It SHOULD give me a meaningful error message if a file it needs can't be found. It's not doing that.
So either the problem's in a dependency that's not called via RTE, or there's some edge-case problem where it's looking for a value in a RTE but it's not being called until after the main sequence and therefore isn't caught by the loading-sequence code. Either way, it's a very serious engine-side issue; if we write a mod and it crashes this way, unless we've just changed something, we don't even know where to start.
So we're talking about rebuilding a project that took a couple of months, starting with core dependencies and working upwards. Meanwhile, if the engine could merely tell me what it halted on, I'd be able to work my way forward and get it done inside of a week of my unpaid, spare-time labor.
So, Mr. 3-post lurker, kindly refrain from posting here further until you've taken a big, deep breath and have walked a few miles in my shoes.
Tue Dec 04, 2012 4:08 pm
Ltp0wer
Joined: Tue Jul 07, 2009 11:44 pm Posts: 5
Re: 1.05, my mod's still broke.
I apologize for being a jerk. My rudeness was an inappropriate symptom of my astonishment, and it was wrong.
What I am suggesting is that instead of trying to fix CC 1.05 to work with your mod, you should try to make your mod work with CC 1.05. I understand that it will be difficult, seeing as how the nature of a TC mod requires the editing of core files, but I believe that is the fundemental flaw causing your crash. I realize that it is justifiably useful for the errors to be more helpful, but I still believe that you are going about fixing your mod in the wrong way.
I was pointing out the duplicate files to show you how messy your mod is internally, and to hopefully convince you to look at your mod as being the problem, rather than CC. I am sorry for going about it in the wrong way, but your attitude flabbergasted me. Even the thread title lead me to believe that you are placing blame on the game update for breaking your mod (Which it very well did, but it is the mod makers job to get it working again). You claim to not know where to look to start fixing your mod. I'm trying to show you. Even though it will be difficult going through and thoroughly cleaning up your mod, I believe that it is a far better approach to getting your mod to work with the current version, rather than dropping your mod on a fresh install and then trying to fix all the errors. If your mod was not a total conversion, I would totally understand the latter method.
I am not disagreeing with your request to give modders more freedom with changing the core game. I'm also not disagreeing with your assertion that because of the lack of this freedom, you've had to jump through hoops and have had a much harder time making your mod compatible with newer iterations of the game. All that is understandable, but I believe it is a separate issue.
I hope you don't mind that I've posted in this thread again. I've taken your advice and have taken my deep breath, but I'm afraid I'm too tired to walk that far.
Tue Dec 04, 2012 5:59 pm
xenoargh
Joined: Fri Dec 30, 2011 3:33 am Posts: 276
Re: 1.05, my mod's still broke.
Fair enough; I wasn't in the best of moods when I responded and frankly I should have just held my tongue, but no, I had to get snippy with a total stranger on the Internet
Anyhow, I'm considering rebuilding from square one, eliminating the problems. Perhaps I'll even figure out a way past the major issues (i.e., shipping new Metagame arenas and core AI rewrites and certain other things) without having to touch the base directory, as that's probably where I got into serious trouble.
It's just a long, long walk up the mountain to get back where I started, is all; it's pretty frustrating when you can't just work through the bugs but have to disassemble a big project and check each piece by hand.
Tue Dec 04, 2012 11:43 pm
DoctorMelon
Joined: Wed May 05, 2010 3:59 pm Posts: 9
Re: 1.05, my mod's still broke.
It'll be worth your while getting a program to show you all the differences: I suggest WinMerge.
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum