Easiest RTS?

Because we play other games too.
Best Deals, MoM, Fanstratics
User avatar
ThunderTitan
Perpetual Poster
Perpetual Poster
Posts: 23271
Joined: 06 Jan 2006
Location: Now/here
Contact:

Unread postby ThunderTitan » 07 Jul 2009, 08:20

Yeah, i got stuck on that mission too... because my old PC (twice over now) lagged like hell... once i got a new one the mission was surprisingly easy... though that might be because i had tried it a few times before and i knew it.

You're probably just used to anti-swarm tactics instead of hard counters... l2p.
Disclaimer: May contain sarcasm!
I have never faked a sarcasm in my entire life. - ???
"With ABC deleting dynamite gags from cartoons, do you find that your children are using explosives less frequently?" — Mark LoPresti

Alt-0128: €

Image

User avatar
Asheera
Round Table Knight
Round Table Knight
Posts: 4506
Joined: 06 Jul 2008
Location: The Shadows
Contact:

Unread postby Asheera » 07 Jul 2009, 16:38

Zubbus wrote:Where were you having trouble in spellforce 1?
Did you play on Hard the expansions? There was that mission when the dark elves attack you from 3 different sides... on hard they attack so fast and so powerful that there's no way you can you can beat them with your army and your avatar if not overpowered (I heard there are some uber combos like Ice Magic - but I played an average hero I guess) can't handle them alone either... you have no idea how much buildings and workers I lost on that, and how much I 'kited' the enemy armies with my hero until I had enough army and could drive them back.

The second expansion also had some hard missions... yes the same, too fast attacks and too strong before I could build much... resources in Spellforce are hard to get at the start before you have a big army.

But if you're talking about the original (no expansions) yes I agree it's not that hard.


Also from expansion 1 onward there's a "Coop" mode that can be played with 2 friends or solo... Try Coop 30 and tell me if you beat it, ok? :P

I did finish that with my bro but it was unbelievable hard, and failed 5 times btw... on the Spellforce forums they said nobody could finish that (at least a long time ago when I checked those), go figure how hard it is considered compared to other games :D
No matter how powerful one becomes, there is always someone stronger. That's why I'm in a constant pursuit of power, so I can be prepared when an enemy tries to take advantage of me.

User avatar
Zubbus
Peasant
Peasant
Posts: 56
Joined: 02 Aug 2008
Location: Necropolis XL

Unread postby Zubbus » 07 Jul 2009, 20:31

Might want to figure out which mission you are talking about.

Of course I beat coop 30. You just need to know how to exploit the 2-line AI, it is not difficult.
The icy yet intense predator hails from Antarctica. His focused eyes betray nothing but lethal instincts. In those eyes every adversary is but a mere fish.

User avatar
Asheera
Round Table Knight
Round Table Knight
Posts: 4506
Joined: 06 Jul 2008
Location: The Shadows
Contact:

Unread postby Asheera » 08 Jul 2009, 01:27

I'm talking about that mission where there are 3 different Dark Elven factions, something with Moon (north), Star (east), and Sun (south). And with those sun towers that can be destroyed only using some special elementals. From Breath of Winter campaign I mean.

And I did not exploit anything at Coop 30, except destroying the Cyclopes real fast with my avatar and heroes... it is almost impossible to play from starting place, not even enough resources.
No matter how powerful one becomes, there is always someone stronger. That's why I'm in a constant pursuit of power, so I can be prepared when an enemy tries to take advantage of me.

User avatar
Zubbus
Peasant
Peasant
Posts: 56
Joined: 02 Aug 2008
Location: Necropolis XL

Unread postby Zubbus » 08 Jul 2009, 13:41

Try to at least name the map. Yes I do know which map you are talking about, but I think we can all see where you are having troubles now.
The icy yet intense predator hails from Antarctica. His focused eyes betray nothing but lethal instincts. In those eyes every adversary is but a mere fish.

User avatar
Zubbus
Peasant
Peasant
Posts: 56
Joined: 02 Aug 2008
Location: Necropolis XL

Unread postby Zubbus » 08 Jul 2009, 13:42

Asheera wrote:And I did not exploit anything at Coop 30, except destroying the Cyclopes real fast with my avatar and heroes... it is almost impossible to play from starting place, not even enough resources.
That what I mean but the AI. You just did not do it well enough. Also, I did not use any resources (except rune power, if you count that.)
The icy yet intense predator hails from Antarctica. His focused eyes betray nothing but lethal instincts. In those eyes every adversary is but a mere fish.

User avatar
Asheera
Round Table Knight
Round Table Knight
Posts: 4506
Joined: 06 Jul 2008
Location: The Shadows
Contact:

Unread postby Asheera » 08 Jul 2009, 18:09

LOL!

If you don't activate your monument the AI won't attack... that's just lame, play it normally without any abuses like this :P

Yes it's bad design but that doesn't mean Coop 30 is easy.
No matter how powerful one becomes, there is always someone stronger. That's why I'm in a constant pursuit of power, so I can be prepared when an enemy tries to take advantage of me.

User avatar
Zubbus
Peasant
Peasant
Posts: 56
Joined: 02 Aug 2008
Location: Necropolis XL

Unread postby Zubbus » 09 Jul 2009, 12:37

Asheera wrote:Yes it's bad design...
Yes. The game is. Definitely 1 of the things I'm looking for from this SpellForce discussion.
------
Asheera wrote:play it normally without any abuses like this :P
Sure...
Asheera wrote:...And I did not exploit anything at Coop 30, except destroying the Cyclopes real fast with my avatar and heroes... it is almost impossible to play from starting place, not even enough resources.
Except there you said yourself you did exploit.

But when someone else does it right is "lame" and "abuse"?
------
Asheera wrote:LOL!

If you don't activate your monument the AI won't attack...
Also, actually that is still wrong. The AI will still attack.
------
Asheera wrote: I did finish that with my bro but it was unbelievable hard, and failed 5 times btw... on the Spellforce forums they said nobody could finish that (at least a long time ago when I checked those), go figure how hard it is considered compared to other games :D
Want to link the thread or are you just making it up?
For 1 thing you said you beat it the 6th try.
For another I beat it. So 2 people out of 2 people talking have beat it. That is 100% of the people. And yet you claim on the Spellforce forums you claim there's nobody could finish that?
------
On top of all that, you're not making a fair comparison. Warcraft 3 campaigns are solo only. Spellforce Coop 29 is soloable. Coop 30 is designed for 3 maxed out players. And you tried to beat it with 2 people? It's your own setting then, not the game.
The icy yet intense predator hails from Antarctica. His focused eyes betray nothing but lethal instincts. In those eyes every adversary is but a mere fish.

User avatar
Asheera
Round Table Knight
Round Table Knight
Posts: 4506
Joined: 06 Jul 2008
Location: The Shadows
Contact:

Unread postby Asheera » 09 Jul 2009, 17:55

If you don't activate the monument the enemy doesn't attack. Yes I know this and this is the exploit I'm talking about. And if the enemy creatures aren't dying they have a 'max cap' to spawn and won't spawn anymore. Again, an exploit.

And trust me when I say I know many stuff, I used to disassemble Spellforce's scripts and make my own maps & spawning points :P


As for me exploiting, I *did* activate the monument at start, but instead of waiting with my hero while my workers were building stuff I attacked the enemy with her and the other heroes... I wouldn't call that exploit.


And I can't seem to find that thread anymore (was very very old) but notice here that the only post and 'help' received is to abuse like you did, by not activating the starting monument and not letting the AI attack...
No matter how powerful one becomes, there is always someone stronger. That's why I'm in a constant pursuit of power, so I can be prepared when an enemy tries to take advantage of me.

User avatar
Zubbus
Peasant
Peasant
Posts: 56
Joined: 02 Aug 2008
Location: Necropolis XL

Unread postby Zubbus » 10 Jul 2009, 15:12

Asheera wrote:And trust me when I say I know many stuff, I used to disassemble Spellforce's scripts and make my own maps & spawning points :P

Really? Then how come you don't know
Asheera wrote: If you don't activate your monument the AI won't attack... that's just lame, play it normally without any abuses like this :P
is wrong?
"Trust me" is not going to work when the person you're saying it to actually knows it's not true.

You want to keep making things up out of ignorance? Go on, "dissassemble some scripts".
The icy yet intense predator hails from Antarctica. His focused eyes betray nothing but lethal instincts. In those eyes every adversary is but a mere fish.

User avatar
theLuckyDragon
Round Table Knight
Round Table Knight
Posts: 4883
Joined: 06 Jan 2006

Unread postby theLuckyDragon » 10 Jul 2009, 17:09

Let's keep the discussion civil, shall we?
"Not all those who wander are lost." -- JRRT

User avatar
Asheera
Round Table Knight
Round Table Knight
Posts: 4506
Joined: 06 Jul 2008
Location: The Shadows
Contact:

Unread postby Asheera » 10 Jul 2009, 17:26

You know what? Why didn't you activate your monument then, hmm? Just go ahead, do it, and try to finish it that way. I'm not saying you should train workers or army, etc. And of course I mean just activate the monument that is near your starting place, the race one not a hero monument.

And I don't really care if you believe me or not. But perhaps this will show you I did disassemble scripts:

gdsrtscoopspawnhelper.lua

Code: Select all

----------------------------------------------------------------------------------------------
-- adds a spawn point on the map at (posX, posY)                                            --
--                                                                                          --
-- the enemies that are spawned here have the clan 'clan'                                   --
--                                                                                          --
-- spawn_data has the following parameters:                                                 --
--   Goal        = the goal (look in gdsdefines.lua for goal ids)                           --
--   MaxClanSize = the max number of units this clan can have                               --
--   Init        = the creatures that are spawned at the start of the game                  --
--   Groups      =                                                                          --
--     WaitTime  = the time (in game frames) before a new creature is spawned (a game frame --
--                 is a tenth of a second)                                                  --
--     Units     = the creatures that are spawned are choosen from this list                --
--                                                                                          --
-- and the following optional parameters:                                                   --
--   numBoss     = the number of Chiefs +1 (the chiefs are the creatures from the start of  --
--                 the Init table and they are not appended to the table when the InitFactor--
--                 is greater than 1.0) DEFAULT = 1 (no bosses)                             --
--   Groups      =                                                                          --
--     BeginTime = the time needed for this group to start spawning (DEFAULT = 0)           --
--     EndTime   = the time before this group stops spawning (rest in peace, Mr.SpawnGroup) --
--                 DEFAULT = INFINITE                                                       --
--   CreatedConditions   = the conditions that must be met before this spawn point starts   --
--                         spawning (DEFAULT = NONE)                                        --
--   DestroyedConditions = if these conditions are met, the spawn point stops spawning and  --
--                         destroys itself (DEFAULT = NO_BUILDINGS_AROUND_SPAWN_GROUP)      --
--   DisabledConditions  = if these conditions are met, the spawn point stops spawning but  --
--                         can be enabled later using the negation of these conditions      --
--                         DEFAULT = NEVER                                                  --
----------------------------------------------------------------------------------------------
AddSpawnPoint = function(posX, posY, clan, spawn_data)
  local trig_base_name = "RtsCoopSpawnSystem" .. clan
  local var -- a temporary variable

  -- create the spawn point on the map
  Trig_Init:AddAction(CGdsSetEffect:new(4, 0, posX, posY, EffectList["GroundWave"], 0))
  Trig_Init:AddAction(CGdsSetObject:new(posX, posY, 2541, 0, 0, 0))

  -- if this camp has creation conditions, make sure we create another begin timer for this camp and start it when these conditions are met
  local GlobalTimer = "gtGlobalCoopSpawnTimer"
  if spawn_data.CreatedConditions ~= nil then
    GlobalTimer = "gtGlobalCoopSpawnTimer" .. clan
    local Trig_InitSpawn = trig_base_name .. "_InitSpawn"
    local Trigger = StateIdle:CreateTransition(Trig_InitSpawn, StateIdle)
    foreachi(spawn_data.CreatedConditions, function(i, data) %Trigger:AddCondition(data) end)
    Trigger:AddAction(CGdsDbSetTimestamp:new(GlobalTimer, 0))
    Trigger:AddAction(CGdsRemoveTransition:new("", Trig_InitSpawn))
  end

  -- create the camp destroyed trigger
  local Trig_CampDestroyed = trig_base_name .. "_DestroyCamp"
  local Trig_End = StateIdle:CreateTransition(Trig_CampDestroyed, StateIdle)

  -- add conditions
  if spawn_data.DestroyedConditions == nil then
    var = CGdsBuildingInRangeCircle:new(posX, posY, 16, kGdsOwnerNpc, 0)
    var:ToggleNegated()
    var:SetUpdateInterval(60)
    spawn_data.DestroyedConditions = {var}
    Trig_End:AddCondition(var)
  else
    foreachi(spawn_data.DestroyedConditions, function(i, data) %Trig_End:AddCondition(data) end)
  end

  -- add actions
  Trig_End:AddAction(CGdsStopEffect:new(4, 0, posX, posY))
  Trig_End:AddAction(CGdsSetEffect:new(4, 0, posX, posY, EffectList["AreaHit"], 3000))
  Trig_End:AddAction(CGdsSetEffect:new(4, 0, posX, posY, EffectList["Lightning"], 3500))
  Trig_End:AddAction(CGdsSetObject:new(posX, posY, 2541, 0, 1))

  -- if this camp can be disabled, create two triggers to handle the enabled/disabled states
  local flag_camp_disabled
  if spawn_data.DisabledConditions ~= nil then
    flag_camp_disabled = "nfRtsCoopSpawn_CampDisabled" .. clan

    -- create the camp disabled and camp enabled triggers
    local Trig_Name = trig_base_name .. "_DisableCamp"
    local Trig_Disable = StateIdle:CreateTransition(Trig_Name, StateIdle)
    Trig_End:AddAction(CGdsRemoveTransition:new("", Trig_Name))

    Trig_Name = trig_base_name .. "_EnableCamp"
    local Trig_Enable = StateIdle:CreateTransition(Trig_Name, StateIdle)
    Trig_End:AddAction(CGdsRemoveTransition:new("", Trig_Name))

    -- add conditions
    var = CGdsDbVariable:new(flag_camp_disabled, 0, 0, kDbScriptVariableCompareEqual, 1)
    var:SetUpdateInterval(60)
    Trig_Disable:AddCondition(var)

    var = CGdsDbVariable:new(flag_camp_disabled, 0, 1, kDbScriptVariableCompareEqual, 1)
    var:SetUpdateInterval(60)
    Trig_Enable:AddCondition(var)

    foreachi(spawn_data.DisabledConditions, function(i, data)
      local data2 = data:Clone()
      data2:ToggleNegated()
      %Trig_Disable:AddCondition(data)
      %Trig_Enable:AddCondition(data2)
    end)

    -- add actions
    Trig_Disable:AddAction(CGdsDbVariableSet:new(flag_camp_disabled, 0, 1))
    Trig_Disable:AddAction(CGdsStopEffect:new(4, 0, posX, posY))
    Trig_Disable:AddAction(CGdsSetEffect:new(4, 0, posX, posY, EffectList["AreaHit"], 2000))
    Trig_Disable:AddAction(CGdsSetEffect:new(4, 0, posX, posY, EffectList["Lightning"], 2300))
    Trig_Disable:AddAction(CGdsSetObject:new(posX, posY, 2541, 0, 1))

    Trig_Enable:AddAction(CGdsDbVariableSet:new(flag_camp_disabled, 0, 0))
    Trig_Enable:AddAction(CGdsSetEffect:new(4, 0, posX, posY, EffectList["GroundWave"], 0))
    Trig_Enable:AddAction(CGdsSetObject:new(posX, posY, 2541, 0, 0, 0))
  end

  -- go through all groups
  for i=1,getn(spawn_data.Groups) do
    local group = spawn_data.Groups[i]
    local timer = "ntClan" .. clan .. "_RtsCoopSpawnTimer" .. tostring(i)
    Trig_Init:AddAction(CGdsDbSetTimestamp:new(timer, 0))

    -- create spawn trigger
    local Trig_Spawn = trig_base_name .. "_SpawnGroup" .. tostring(i)
    local Trigger = StateIdle:CreateTransition(Trig_Spawn, StateIdle)

    -- add conditions
    if group.BeginTime ~= nil then
      var = CGdsDbTimeElapsed:new(GlobalTimer, 0, floor(group.BeginTime * BeginWaveFactor))
      var:SetUpdateInterval(60)
      Trigger:AddCondition(var)
    end

    local wait_time = floor(group.WaitTime * SpawnDelayFactor)
    local time = wait_time * 0.49 + random(0,5); if time < 60 then time = 58 + random(0,4) end
    var = CGdsDbTimeElapsed:new(timer, 0, wait_time)
    var:SetUpdateInterval(time)
    Trigger:AddCondition(var)

    time = wait_time * 0.35 + random(0,5); if time < 50 then time = 50 + random(0,5) end
    var = CGdsClanMember:new(clan, ceil(spawn_data.MaxClanSize * MaxClanSizeFactor))
    var:ToggleNegated()
    var:SetUpdateInterval(time)
    Trigger:AddCondition(var)

    if flag_camp_disabled ~= nil then
      var = CGdsDbVariable:new(flag_camp_disabled, 0, 0, kDbScriptVariableCompareEqual, 1)
      var:SetUpdateInterval(60)
      Trigger:AddCondition(var)
    end

    -- add actions
    Trigger:AddAction(CGdsDbSetTimestamp:new(timer, 0))

    var = CGdsFigureSpawn:new(0, posX, posY, 0, -1, 0, clan, 1, EffectList["Materialize"], 25, HardMode)
    foreachi(group.Units, function(i, data) %var:AddUnit(data) end)
    Trigger:AddAction(var)

    -- create ending trigger
    if group.EndTime ~= nil then
      local Trig_EndSpawn = trig_base_name .. "_EndSpawnGroup" .. tostring(i)
      Trigger = StateIdle:CreateTransition(Trig_EndSpawn, StateIdle)

      -- add conditions
      var = CGdsDbTimeElapsed:new(GlobalTimer, 0, floor(group.EndTime * BeginWaveFactor))
      var:SetUpdateInterval(60)
      local var2 = spawn_data.DestroyedConditions[1]:Clone()
      for i=2,getn(spawn_data.DestroyedConditions) do
        var2 = CGdsConditionLogicalAnd:new(var2, spawn_data.DestroyedConditions[i]:Clone())
      end
      Trigger:AddCondition(CGdsConditionLogicalOr:new(var, var2))

      -- add actions
      Trigger:AddAction(CGdsRemoveTransition:new("", Trig_Spawn))
      Trigger:AddAction(CGdsRemoveTransition:new("", Trig_EndSpawn))
    else
      Trig_End:AddAction(CGdsRemoveTransition:new("", Trig_Spawn))
    end
  end

  -- tell the camp destroyed trigger to destroy itself
  Trig_End:AddAction(CGdsRemoveTransition:new("", Trig_CampDestroyed))

  -- create the 'spawn startup units' trigger
  local Trig_Name = trig_base_name .. "_Init"
  local Trigger = StateIdle:CreateTransition(Trig_Name, StateIdle)

  -- add actions
  local numUnits = getn(spawn_data.Init)
  local numUnitsAdjusted = ceil(numUnits * InitSpawnFactor)
  local j = numUnitsAdjusted
  if numUnits < numUnitsAdjusted then
    j = numUnits
    spawn_data.numBoss = spawn_data.numBoss or 1
    for i=numUnits+1, numUnitsAdjusted do
      var = CGdsFigureSpawn:new(0, posX, posY, 0, -1, 0, clan, 1, 0, 0, HardMode)
      var:AddUnit(spawn_data.Init[random(spawn_data.numBoss, numUnits)])
      Trigger:AddAction(var)
    end
  end
  for i=1, j do
    var = CGdsFigureSpawn:new(0, posX, posY, 0, -1, 0, clan, 1, 0, 0, HardMode)
    var:AddUnit(spawn_data.Init[i])
    Trigger:AddAction(var)
  end
  GlobalTimer = "ntAiChangeGoalClan" .. clan
  Trigger:AddAction(CGdsDbSetTimestamp:new(GlobalTimer, 0))
  Trigger:AddAction(CGdsRemoveTransition:new("", Trig_Name))

  -- create the 'set goal' trigger
  Trig_Name = trig_base_name .. "_ChangeGoal"
  Trigger = StateIdle:CreateTransition(Trig_Name, StateIdle)

  -- add conditions
  var = CGdsDbTimeElapsed:new(GlobalTimer, 0, 100)
  var:SetUpdateInterval(10)
  Trigger:AddCondition(var)

  -- add actions
  Trigger:AddAction(CGdsAiChangeGoal:new(clan, spawn_data.Goal))
  Trigger:AddAction(CGdsRemoveTransition:new("", Trig_Name))
end


---------------------------------------------------------------------------
-- creates the State Machine and the basic states and triggers for a Npc --
--                                                                       --
-- npc_id is the id of the NPC (isn't this obvious?!?)                   --
---------------------------------------------------------------------------
SelectNpc = function(npc_id)
  NpcId = npc_id
  StateMachine = GdsMain:CreateStateMachine("_NPC_" .. NpcId, kGdsStateMachineTypeFigureScript, NpcId)
  StateInit = StateMachine:CreateState("_INIT")
  StateIdle = StateMachine:CreateState("_IDLE")
  StateDead = nil
  Trig_Init = StateInit:CreateTransition("NpcInit", StateIdle)
end


----------------------------------------------------------------------------------------------
-- creates a respawn system for the selected NPC (NOTE: call this before CreateWaypointSets)--
--                                                                                          --
-- respawn_data has the following parameters:                                               --
--  Unit    = the id of the unit being respawned                                            --
--  Time    = this timer must elapse before this NPC is respawned; starts when the NPC dies --
--  Respawn =                                                                               --
--    X     = the X coordinate of the respawning place for this NPC                         --
--    Y     = the Y coordinate of the respawning place for this NPC                         --
--    Conditions = the conditions that must be met before the NPC can respawn at this place --
----------------------------------------------------------------------------------------------
CreateRespawnSystem = function(respawn_data)
  StateDead = StateMachine:CreateState("_DEAD")

  -- create death trigger
  local Trig_Die = StateIdle:CreateTransition("Respawn_DIE", StateDead)

  -- add conditions
  Trig_Die:AddCondition(CGdsFigureDeadEvent:new(NpcId))

  -- add actions
  Trig_Die:AddAction(CGdsDbSetTimestamp:new("ntNPC" .. NpcId .. "RespawnTimer", 0))

  -- go through all respawn data
  foreachi(respawn_data.Respawn, function(i, data)
    -- create respawn trigger
    local Trigger = StateDead:CreateTransition("Respawn" .. i, StateIdle)

    -- add conditions
    foreachi(data.Conditions, function(j, cond) %Trigger:AddCondition(cond) end)

    local var = CGdsDbTimeElapsed:new("ntNPC" .. NpcId .. "RespawnTimer", 0, %respawn_data.Time)
    var:SetUpdateInterval(60)
    Trigger:AddCondition(var)

    -- add actions
    var = CGdsFigureSpawn:new(NpcId, data.X, data.Y, 0, -1, 0, 0, 1, EffectList["Materialize"], 35, 0)
    var:AddUnit(%respawn_data.Unit)
    Trigger:AddAction(var)
  end)
end


--------------------------------------------------------------------------------------------------
-- creates a set of waypoints for the selected NPC                                              --
--                                                                                              --
-- wpdata contains a list of waypoint sets                                                      --
--                                                                                              --
-- a waypoint set has the following parameters:                                                 --
--   Waypoints = the waypoint table; a waypoint has the following parameters:                   --
--                 X       = the X coordinate of the waypoint                                   --
--                 Y       = the Y coordinate of the waypoint                                   --
--                 Radius  = the radius of the waypoint (in tiles); it's used for smoother      --
--                           transitions between waypoints, among other things.                 --
--                 Wait    = this timer must elapse before the NPC goes to the next waypoint    --
--                           Note that this timer starts when the NPC arrives at the previous   --
--                           waypoint, not when it arrives at this one (DEFAULT = 0)            --
--                 Actions = user-defined actions that are called when the NPC arrives at this  --
--                           waypoint (DEFAULT = None)                                          --
--                                                                                              --
-- and the following optional parameters:                                                       --
--   Conditions = these conditions must be met before this waypoint set can be executed         --
--   GotoMode   = this parameter can have one of the following values: kGtWalkModeNormalGoto,   --
--                kGtWalkModeForceGoto and kGtWalkModeContinuousGoto                            --
--                 kGtWalkModeNormalGoto     = the NPC attacks it's enemies when they become a  --
--                                             threat                                           --
--                 kGtWalkModeForceGoto      = the NPC ignores it's enemies even if they attack --
--                 kGtWalkModeContinuousGoto = I haven't figured out this yet; it's like Normal --
--                DEFAULT = kGtWalkModeNormalGoto                                               --
--   Run        = if this flag is 1, the NPC runs to the waypoints in this set (DEFAULT = 0)    --
--   Loop       = if this flag appears there, the NPC goes back to the first waypoint when it   --
--                arrives at the end of the set                                                 --
--                NOTE: when the NPC arrives at the end of the set and there is no Loop flag,   --
--                      the NPC will not move to the waypoints in this set again. If you want   --
--                      to make it move later, though, you must set the following flag to 0:    --
--                      WaypointSet<i>_End_NPC<n>                                               --
--                      where i = index of waypoint set and n = NpcId (DON'T INSERT THE '<>' !) --
--                                                                                              --
-- IMPORTANT: if there is only one waypoint in the set, the NPC will go to that location and    --
--            guard it. NOTE that you must not place the Loop flag or you'll screw something... --
--            You have been warned!                                                             --
--------------------------------------------------------------------------------------------------
CreateWaypointSets = function(wpdata)
  local timer = "ntNPC" .. NpcId .. "_waypoint_timer"

  -- go through all waypoint sets
  for i,v in wpdata do
    -- set moving modes
    local mode_goto = v.GotoMode or kGtWalkModeNormalGoto
    local mode_run = v.Run or 0

    -- define basic variables
    local set_name = "WaypointSet" .. i
    local pt = v.Waypoints[1]

    -- create first waypoint state
    local state = StateMachine:CreateState(set_name .. "_STATE1")
    local state_first = state
    local state_next = state

    -- create starting trigger
    local Trigger = StateIdle:CreateTransition(set_name .. "_Point0", state)

    -- add conditions
    if getn(v.Waypoints) == 1 then
      Trigger:AddCondition(CGdsFigureNotInRangeCircle:new(NpcId, pt.X, pt.Y, pt.Radius))
    elseif v.Loop == nil then
      local end_var = set_name .. "_End_NPC" .. NpcId
      Trig_Init:AddAction(CGdsDbVariableSet:new(end_var, 0, 0))
      Trigger:AddCondition(CGdsDbVariable:new(end_var, 0, 0, kDbScriptVariableCompareEqual, 1))
    end

    if v.Conditions ~= nil then
      foreachi(v.Conditions, function(j, data) %Trigger:AddCondition(data) end)
    end

    Trigger:AddCondition(CGdsFigureJob:new(NpcId, CGdsFigureJob.kJobIdle))
    var = CGdsFigureIsDominated:new(NpcId)
    var:ToggleNegated()
    Trigger:AddCondition(var)

    -- add actions
    Trigger:AddAction(CGdsFigureGoto:new(NpcId, pt.X, pt.Y, pt.Radius, mode_goto, mode_run))

    if pt.Wait ~= nil then
      Trigger:AddAction(CGdsDbSetTimestamp:new(timer, 0))
    end

    -- go through all waypoints but the last one
    local k = 1
    for j=1, getn(v.Waypoints)-1 do
      k = j+1
      local pt = v.Waypoints[j]
      local pt_nxt = v.Waypoints[k]
      local trig_base_name = set_name .. "_Point" .. j

      -- create next waypoint state
      state_next = StateMachine:CreateState(set_name .. "_STATE" .. k)

      -- create arrived trigger
      Trigger = state:CreateTransition(trig_base_name, state_next)

      -- add conditions
      if pt.Wait ~= nil then
        var = CGdsDbTimeElapsed:new(timer, 0, pt.Wait)
        var:SetUpdateInterval(50)
        Trigger:AddCondition(var)
      end

      Trigger:AddCondition(CGdsFigureInRangeCircle:new(NpcId, pt.X, pt.Y, pt.Radius))
      Trigger:AddCondition(CGdsFigureJob:new(NpcId, CGdsFigureJob.kJobIdle))
      var = CGdsFigureIsDominated:new(NpcId)
      var:ToggleNegated()
      Trigger:AddCondition(var)

      -- add actions
      Trigger:AddAction(CGdsFigureGoto:new(NpcId, pt_nxt.X, pt_nxt.Y, pt_nxt.Radius, mode_goto, mode_run))

      if pt_nxt.Wait ~= nil then
        Trigger:AddAction(CGdsDbSetTimestamp:new(timer, 0))
      end

      if pt.Actions ~= nil then
        foreachi(pt.Actions, function(x, data) %Trigger:AddAction(data) end)
      end

      -- create remind trigger
      Trigger = state:CreateTransition(trig_base_name .. "_REMIND", state)

      -- add conditions
      Trigger:AddCondition(CGdsFigureJob:new(NpcId, CGdsFigureJob.kJobIdle))
      var = CGdsFigureIsDominated:new(NpcId)
      var:ToggleNegated()
      Trigger:AddCondition(var)

      -- add actions
      Trigger:AddAction(CGdsFigureGoto:new(NpcId, pt.X, pt.Y, pt.Radius, mode_goto, mode_run))

      -- if this set has conditions
      if v.Conditions ~= nil then
        -- create abort trigger
        Trigger = state:CreateTransition(trig_base_name .. "_ABORT", StateIdle)

        -- add conditions
        foreachi(v.Conditions, function(x, data) local cond = data:Clone(); cond:ToggleNegated(); %Trigger:AddCondition(cond) end)
      end

      -- if this NPC can respawn
      if StateDead ~= nil then
        -- create death trigger
        Trigger = state:CreateTransition(trig_base_name .. "_DIE", StateDead)

        -- add conditions
        Trigger:AddCondition(CGdsFigureDeadEvent:new(NpcId))

        -- add actions
        Trigger:AddAction(CGdsDbSetTimestamp:new("ntNPC" .. NpcId .. "RespawnTimer", 0))
      end

      -- change state for next waypoint
      state = state_next
    end

    -- NOTE: state_next and k are the variables for the last waypoint when we arrive here!
    pt = v.Waypoints[k]
    local trig_base_name = set_name .. "_Point" .. k

    if v.Loop ~= nil then
      -- create arrived trigger
      Trigger = state_next:CreateTransition(trig_base_name, state_first)

      -- add conditions
      if pt.Wait ~= nil then
        var = CGdsDbTimeElapsed:new(timer, 0, pt.Wait)
        var:SetUpdateInterval(50)
        Trigger:AddCondition(var)
      end

      Trigger:AddCondition(CGdsFigureInRangeCircle:new(NpcId, pt.X, pt.Y, pt.Radius))
      Trigger:AddCondition(CGdsFigureJob:new(NpcId, CGdsFigureJob.kJobIdle))
      var = CGdsFigureIsDominated:new(NpcId)
      var:ToggleNegated()
      Trigger:AddCondition(var)

      -- add actions
      Trigger:AddAction(CGdsFigureGoto:new(NpcId, v.Waypoints[1].X, v.Waypoints[1].Y, v.Waypoints[1].Radius, mode_goto, mode_run))

      if v.Waypoints[1].Wait ~= nil then
        Trigger:AddAction(CGdsDbSetTimestamp:new(timer, 0))
      end
    else
      -- create finished trigger
      Trigger = state_next:CreateTransition(trig_base_name, StateIdle)

      -- add conditions
      Trigger:AddCondition(CGdsFigureInRangeCircle:new(NpcId, pt.X, pt.Y, pt.Radius))

      -- add actions
      if getn(v.Waypoints) ~= 1 then
        Trigger:AddAction(CGdsDbVariableSet:new(set_name .. "_End_NPC" .. NpcId, 0, 1))
      end
    end

    if pt.Actions ~= nil then
      foreachi(pt.Actions, function(j, data) %Trigger:AddAction(data) end)
    end

    -- create remind trigger
    Trigger = state_next:CreateTransition(trig_base_name .. "_REMIND", state_next)

    -- add conditions
    Trigger:AddCondition(CGdsFigureJob:new(NpcId, CGdsFigureJob.kJobIdle))
    var = CGdsFigureIsDominated:new(NpcId)
    var:ToggleNegated()
    Trigger:AddCondition(var)

    -- add actions
    Trigger:AddAction(CGdsFigureGoto:new(NpcId, pt.X, pt.Y, pt.Radius, mode_goto, mode_run))

    -- if this set has conditions
    if v.Conditions ~= nil then
      -- create abort trigger
      Trigger = state_next:CreateTransition(trig_base_name .. "_ABORT", StateIdle)

      -- add conditions
      foreachi(v.Conditions, function(j, data) local cond = data:Clone(); cond:ToggleNegated(); %Trigger:AddCondition(cond) end)
    end

    -- if this NPC can respawn
    if StateDead ~= nil then
      -- create death trigger
      Trigger = state_next:CreateTransition(trig_base_name .. "_DIE", StateDead)

      -- add conditions
      Trigger:AddCondition(CGdsFigureDeadEvent:new(NpcId))

      -- add actions
      Trigger:AddAction(CGdsDbSetTimestamp:new("ntNPC" .. NpcId .. "RespawnTimer", 0))
    end
  end
end


--------------------------------------------------------------------------------------------------
-- creates a dialog system for the selected NPC                                                 --
--                                                                                              --
-- dlg has the following parameters:                                                            --
--   BeginEvents = the events that are called at the start of a conversation                    --
--                                                                                              --
--   the first numDialogEvents keys contain the other dialog events (the index of the event     --
--   being the one of the key)                                                                  --
--                                                                                              --
--   a dialog event contains a list of sub-events; if there is only one, you must not place any --
--   conditions in the Conditions param; if there are more, you must place conditions in each   --
--                                                                                              --
--   a dialog sub-event has the following parameters:                                           --
--     Conditions = the conditions that must be met before this event can occur                 --
--     Text       = the message the NPC sends to the player                                     --
--     Answer     = the list of the possible answers. These answers can be selected by the      --
--                  player; there also appears an Exit Dialog answer at the end of the list.    --
--                  If you want to create an automatic answer (that is, an answer that can't be --
--                  selected by the player), DON'T place a list of the answers in here, but     --
--                  rather the answer itself (this answer can have no text, so that the player  --
--                  doesn't say anything). If you want to have only one answer, but selectable, --
--                  create only one table in here with the respective data.                     --
--                  There can be no answers (Answer = {}), thus leaving only the Exit answer    --
--                                                                                              --
--                  an answer has the following data:                                           --
--                    Text  = the message the player sends to the NPC                           --
--                    Color = the color of the message (optional; defaults to white)            --
--                    Id    = the index of the event this answer activates                      --
--                                                                                              --
-- and the following optional parameters:                                                       --
--   Type      = the type of the sign above the Npc's head:                                     --
--               0 = question mark; 1 (DEFAULT) = exclamation mark                              --
--   EndEvents = a list of user-defined events that are called at the end of the conversation   --
--                                                                                              --
--               an end event has the following data:                                           --
--                 Conditions = the conditions that must be met before this event can occur     --
--                 Actions    = the actions that take place when this event occurs              --
--------------------------------------------------------------------------------------------------
CreateDialog = function(dlg)
  -- initialize dialog
  Trig_Init:AddAction(CGdsFigureSetDialogFlag:new(NpcId, dlg.Type or 1))

  -- temporary variables
  local dlgsize = getn(dlg)
  local x = dlgsize+1
  local y = dlg.BeginEvents

  -- create dialog states, ending triggers and initialize 'from' indices
  local StateDialogDone = StateMachine:CreateState("DLG_STATE_END")
  local DlgStates = {}
  local DlgFrom = {}
  for i=1, x do
    local state = StateMachine:CreateState("DLG_STATE" .. i)
    tinsert(DlgStates, state)

    local Trig_End = state:CreateTransition("DlgState" .. i .. "_ExitDialog", StateDialogDone)
    Trig_End:AddCondition(CGdsDialogEnd:new(NpcId))
    Trig_End:AddAction(CGdsDbSetTimestamp:new("ntDialogEndTimer_NPC" .. NpcId, 0))

    DlgFrom[i] = {}
  end

  -- create 'from' indices
  DlgFrom[x] = nil
  for i=0, dlgsize do
    for j,v in y do
      if v.Answer.Id == nil then
        foreachi(v.Answer, function(k, data) tadd(%DlgFrom[data.Id], %x) end)
      else
        tadd(DlgFrom[v.Answer.Id], x)
      end
    end
    x = i+1
    y = dlg[x]
  end

  -- define helpful function
  function handle_dlg_trig(Trigger, data)
    -- add user-defined conditions
    if data.Conditions ~= nil then
      foreachi(data.Conditions, function(i, cond) %Trigger:AddCondition(cond) end)
    end

    -- add talking actions
    local talk = CGdsTalk:new()
    talk:SetMessage(nil, data.Text, ColorWhite)
    if data.Answer.Id ~= nil then
      talk:AddAnswer(data.Answer.Id, nil, data.Answer.Text, data.Answer.Color or ColorWhite, 1)
    else
      foreachi(data.Answer, function(i, answer) %talk:AddAnswer(answer.Id, nil, answer.Text, answer.Color or ColorWhite) end)
    end
    Trigger:AddAction(talk)

    -- add user-defined actions
    if data.Actions ~= nil then
      foreachi(data.Actions, function(i, action) %Trigger:AddAction(action) end)
    end

    -- add miscellaneous actions
    Trigger:AddAction(CGdsFigureSetTalkingFlag:new(NpcId, 1))
    Trigger:AddAction(CGdsDbVariableSet:new("gfGDS_PlayerIsTalking", 0, 1))
  end

  -- go through all dialog begin events
  foreachi(dlg.BeginEvents, function(i, data)
    -- create dialog trigger
    local Trigger = StateIdle:CreateTransition("DlgBegin" .. i, %DlgStates[%x])

    -- add conditions
    Trigger:AddCondition(CGdsDialogBegin:new(NpcId))

    -- add actions
    Trigger:AddAction(CGdsFigureStop:new(NpcId))

    -- add default dialog conditions and actions
    handle_dlg_trig(Trigger, data)
  end)

  -- go through all dialog events
  for i=1, dlgsize do
    -- go through all sub-events
    foreachi(dlg[i], function(j, data)
      -- create dialog trigger
      local Trigger = %DlgStates[%DlgFrom[%i][1]]:CreateTransition("DlgTransition" .. %i .. "_" .. j .. "_", %DlgStates[%i])

      -- add conditions
      Trigger:AddCondition(CGdsDialogAnswer:new(NpcId, %i))

      -- add default dialog conditions and actions
      handle_dlg_trig(Trigger, data)

      -- go through the remaining 'from' states and create a trigger for them as well
      for k=2, getn(%DlgFrom[%i]) do
        %DlgStates[%DlgFrom[%i][k]]:CreateTransitionFromTemplate(Trigger)
      end
    end)
  end

  -- go through all dialog end events
  if dlg.EndEvents ~= nil then
    foreachi(dlg.EndEvents, function(i, data)
      -- create custom dialog ending trigger
      local Trig_Name = "DlgEnd" .. i
      local Trigger = %StateDialogDone:CreateTransition(Trig_Name, StateIdle)

      -- add conditions
      foreachi(data.Conditions, function(j, cond) %Trigger:AddCondition(cond) end)

      -- add actions
      foreachi(data.Actions, function(j, action) %Trigger:AddAction(action) end)
    end)
  end

  -- create dialog ending trigger
  local TrigDialogDone = StateDialogDone:CreateTransition("DlgEnd0", StateIdle)

  -- add conditions
  local cond = CGdsDbTimeElapsed:new("ntDialogEndTimer_NPC" .. NpcId, 0, 3)
  cond:SetUpdateInterval(2)
  TrigDialogDone:AddCondition(cond)

  -- add actions
  TrigDialogDone:AddAction(CGdsFigureSetTalkingFlag:new(NpcId, 0))
  TrigDialogDone:AddAction(CGdsDbVariableSet:new("gfGDS_PlayerIsTalking", 0, 0))
end
gdsrtscoopspawnsystem.lua

Code: Select all

SetCoopSpawnParams = function(factor1, factor2, factor3, factor4)
  MaxClanSizeFactor, InitSpawnFactor, BeginWaveFactor, SpawnDelayFactor = factor1, factor2, factor3, factor4
end

RtsCoopSpawnNT = function(skill_lvl, num_players, clan_id, spawnX, spawnY, map_id)
  SkillLevel = skill_lvl
  HardMode = 0
  NumPlayers = num_players
  PlatformId = 0
  NpcId = spawnY * 2 + spawnX
  NpcX = spawnX
  NpcY = spawnY

  -- seed the random number generator
  randomseed(tonumber(date("%H%M%S")) - NpcId + NpcX*NpcY)

  -- initialize default text color
  ColorWhite = kMnu_csWhite or 4294967040

  -- adjust the coop factors by the level of difficulty
  if SkillLevel == 0 then -- easy
    InitSpawnFactor   = InitSpawnFactor   * 0.73
    MaxClanSizeFactor = MaxClanSizeFactor * 0.78
    BeginWaveFactor   = BeginWaveFactor   * 1.55
    SpawnDelayFactor  = SpawnDelayFactor  * 1.61

  elseif SkillLevel == 2 then -- hard
    InitSpawnFactor   = InitSpawnFactor   * 1.68
    MaxClanSizeFactor = MaxClanSizeFactor * 1.76
    BeginWaveFactor   = BeginWaveFactor   * 0.66
    SpawnDelayFactor  = SpawnDelayFactor  * 0.59
  end

  -- include helper files
  dofile("script/GdsRtsCoopSpawnHelper.lua")
  dofile("script/GdsConditions.lua")
  dofile("script/GdsActions.lua")
  dofile("script/GdsVariables.lua")

  -- get effect list
  dofile("object/object_scripteffects.lua")
  EffectList = GetScriptEffectList()

  -- init spawn points
  StateMachine = GdsMain:CreateStateMachine("_RtsCoopSpawn_", kGdsStateMachineTypeFigureScript, NpcId)
  StateInit = StateMachine:CreateState("_INIT")
  StateIdle = StateMachine:CreateState("_IDLE")

  Trig_Init = StateInit:CreateTransition("RtsInit", StateIdle)
  Trig_Init:AddAction(CGdsSetObject:new(NpcX, NpcY, 2541, 0, 1)) -- delete the spawn point placed on the map
  Trig_Init:AddAction(CGdsDbSetTimestamp:new("gtGlobalCoopSpawnTimer", 0))

  -- execute the map script (NOTE: the spawn points must be the first things handled in the map scripts!!!)
  dofile("script/map_" .. map_id .. ".lua")
  RunMapScript()
end
and many more but pointless to add here...
No matter how powerful one becomes, there is always someone stronger. That's why I'm in a constant pursuit of power, so I can be prepared when an enemy tries to take advantage of me.

User avatar
Avonu
Round Table Hero
Round Table Hero
Posts: 3858
Joined: 06 Aug 2006
Location: City of Griffin
Contact:

Unread postby Avonu » 10 Jul 2009, 19:20

theLuckyDragon wrote:Let's keep the discussion civil, shall we?
If you like civil wars... :devil:

User avatar
Zubbus
Peasant
Peasant
Posts: 56
Joined: 02 Aug 2008
Location: Necropolis XL

Unread postby Zubbus » 10 Jul 2009, 20:24

Now.
1) Do you understand any of the script you printed?
2) If you can understand any of the scripts. Why didn't you know that
Asheera wrote:LOL!

If you don't activate your monument the AI won't attack...
This is not true?
The icy yet intense predator hails from Antarctica. His focused eyes betray nothing but lethal instincts. In those eyes every adversary is but a mere fish.

User avatar
Asheera
Round Table Knight
Round Table Knight
Posts: 4506
Joined: 06 Jul 2008
Location: The Shadows
Contact:

Unread postby Asheera » 11 Jul 2009, 01:18

Zubbus wrote:1) Do you understand any of the script you printed?
Are you kidding? I wrote it myself!

I am not lying

Sheesh...
2) If you can understand any of the scripts. Why didn't you know that
Asheera wrote:LOL!

If you don't activate your monument the AI won't attack...
This is not true?
Because I know they don't attack...

or wait, I played the game and saw that, then I made scripts and 'cheats' and same story, and then people on the official forums say the same thing... but no, you are the one and only right one.

btw I don't know what you understood from attack, but it's 'charging' to your monument and rune stone... not that the enemies will stay like ducks and won't react to your hits, lol

They do react, and hit you, but they do not move to attack your 'base'


And anyway this is really off-topic. The original topic was about easiest RTS, it has nothing to do with a poor or intelligent AI... I know Spellforce AI sucks, but it's still a hard game. And no, not activating your monument is an exploit and I'd rather call it a cheat... if you want I can also include the cheat codes in Blizzard games and you'll see which one is easier then.

A hard game doesn't imply a good AI. Take State of War (another 'RTS' or something similar), AI is dumb, all it does is move the units to your buildings to destroy them, doesn't even accumulate an attack, etc. And the enemy advancer always goes to the closest building. So very very, dumb.

But still, last mission is extremely difficult, since enemy has 3 advancers (you only 1) and loads of turrets and factories.
No matter how powerful one becomes, there is always someone stronger. That's why I'm in a constant pursuit of power, so I can be prepared when an enemy tries to take advantage of me.

User avatar
Zubbus
Peasant
Peasant
Posts: 56
Joined: 02 Aug 2008
Location: Necropolis XL

Unread postby Zubbus » 11 Jul 2009, 06:22

Asheera wrote:
Zubbus wrote: or wait, I played the game and saw that, then I made scripts and 'cheats' and same story, and then people on the official forums say the same thing... but no, you are the one and only right one.
Alright then. Let's see the thread.
Asheera wrote:
Zubbus wrote: or wait, I played the game and saw that, then I made scripts and 'cheats' and same story, and then people on the official forums say the same thing... but no, you are the one and only right one.
It's YOU who claimed there's a certain thread and then oops, couldn't find it, last time.

You want to talk about being the the only one?
You're the only one who wouldn't call what you do exploit:
Asheera wrote:As for me exploiting, I *did* activate the monument at start, but instead of waiting with my hero while my workers were building stuff I attacked the enemy with her and the other heroes... I wouldn't call that exploit.
And even you disagree with yourself.:
Asheera wrote:And I did not exploit anything at Coop 30, except destroying the Cyclopes real fast with my avatar and heroes... it is almost impossible to play from starting place, not even enough resources.
Asheera wrote:...but notice here that the only post and 'help' received is to abuse like you did, by not activating the starting monument and not letting the AI attack...
Notice this is the only way you found in the SF forums. And you call that abuse. Notice how no one in that thread thinks that is abuse. So the way everyone plays is abuse to you. The way you played is the only way that is not exploit?
The icy yet intense predator hails from Antarctica. His focused eyes betray nothing but lethal instincts. In those eyes every adversary is but a mere fish.

User avatar
Asheera
Round Table Knight
Round Table Knight
Posts: 4506
Joined: 06 Jul 2008
Location: The Shadows
Contact:

Unread postby Asheera » 11 Jul 2009, 16:49

No I did not disagree with myself... probably phrased it poorly but the only abuse is to not activate the starting monument since it handicaps the AI. If you then rush or build your army slowly that's just a play style, nothing to do with abuse or exploits... I guess everyone agrees with this, right?

But the way the dumb AI in SF is made, it is an exploit not to activate the monument since they will not charge or attack your base, etc...

As for more links I found one more: (but seems Google doesn't find too well... they may be too old or something, oh well)

http://spellforce.jowood.de/forum/archi ... 21585.html

http://www.spellforce.com/forum/showthread.php?p=358507 (seems same text though)


Now let's see the counter-arguments and links. I encourage you to find some threads about Coop 30 being easy with activating the monument at start and thus making the AI 'work'. Let's see if you find any.


And now really, I provided lots of links, I provided my scripts I did for the game... where are your sources for your claims? For example about the AI attacking you without activating monument? Or that you even finished it normally without any cheats or abuses? (and btw Spellforce does have a console as well so cheats are in game too)

This is pointless anyway. I provide scripts, links, etc, and it's still not enough, and you will never believe me anyway... even though the irony is you are the one who have no backup whatsoever to your claims.
No matter how powerful one becomes, there is always someone stronger. That's why I'm in a constant pursuit of power, so I can be prepared when an enemy tries to take advantage of me.

User avatar
Zubbus
Peasant
Peasant
Posts: 56
Joined: 02 Aug 2008
Location: Necropolis XL

Unread postby Zubbus » 11 Jul 2009, 19:27

Asheera wrote:No I did not disagree with myself... probably phrased it poorly but the only abuse is to not activate the starting monument since it handicaps the AI. If you then rush or build your army slowly that's just a play style, nothing to do with abuse or exploits... I guess everyone agrees with this, right?
Who's everyone? You and yourself?
Asheera wrote: But the way the dumb AI in SF is made, it is an exploit not to activate the monument since they will not charge or attack your base, etc...
Can't see anyone who call anything exploit or abuse there. Again, you give yourself all the say what is abuse and what is not. Nothing you linked ever mentioned the word abuse.
Asheera wrote: As for more links I found one more: (but seems Google doesn't find too well... they may be too old or something, oh well)

http://spellforce.jowood.de/forum/archi ... 21585.html
So this is the 2nd thread you found that is (roughly) the way I beat it?
Anyone in these threads besides you calling it abuse? No.
Anyone in these threads besides you calling it exploit? No.
Asheera wrote:Now let's see the counter-arguments and links. I encourage you to find some threads about Coop 30 being easy with activating the monument at start and thus making the AI 'work'. Let's see if you find any.
The thing is, I didn't imagine a thread that backs me up. I check that something exists in the real world before remembering it.
Asheera wrote: And now really, I provided lots of links, I provided my scripts I did for the game... where are your sources for your claims? For example about the AI attacking you without activating monument?
Uh you provided them. Remember?
You found 1 thread that says how other beat it is the way I beat it. Then you found a 2nd one.
You also agreed with me:
Asheera wrote: But if you're talking about the original (no expansions) yes I agree it's not that hard.
And then you found out yourself that:
Asheera wrote: Also from expansion 1 onward there's a "Coop" mode that can be played with 2 friends or solo... Try Coop 30 and tell me if you beat it, ok? :P
A lot of people beat it and gave out advices on how to beat it.
You linked 2 such threads from the official forums.
Asheera wrote:even though the irony is you are the one who have no backup whatsoever to your claims.
So actually, you beat me to backing me up.

And then you found out yourself that the reason you thought it's hard
Asheera wrote:...on the Spellforce forums they said nobody could finish that (at least a long time ago when I checked those), go figure how hard it is considered compared to other games smile_teeth

Does not exists:
Asheera wrote:And I can't seem to find that thread anymore (was very very old)
:hoo:
Zubbus wrote:
Asheera wrote: or wait, I played the game and saw that, then I made scripts and 'cheats' and same story, and then people on the official forums say the same thing... but no, you are the one and only right one.
Alright then. Let's see the thread.
Where's that thread that say "the same thing" now? Or is this the 2nd time you imagine a thread existed, but turns out it doesn't?
Asheera wrote: Or that you even finished it normally without any cheats or abuses? (and btw Spellforce does have a console as well so cheats are in game too)
So are you saying you don't believe I beat coop 30 at lv 28?
Asheera wrote:For example about the AI attacking you without activating monument?
It's really simple. Start a co-op game. Leave the game on. They will come for your bindstone. Anyone with a copy of the game can see for himself.
Asheera wrote: This is pointless anyway. I provide scripts, links, etc, and it's still not enough, and you will never believe me anyway...
Uh you're the one who claimed a certain post exists and then admitted it did not.
And you're the one who posted a thread that says what other people do is what I do. And neither of those threads said anything about abuse or exploit. You added that bit yourself.
And posting scripts is not the same is showing you disassembled it. Anyone can post a bunch of scripts.
And it's not pointless to me.
-You agreed with me about part of the game being easy.
-You linked the stuff you said you wanted me to link. Saves me doing it.
-You agreed SF's AI is "bad design"+ "sucks".
-And then you...say a game with "bad design" and "sucks" AI is hard?
I am happy with all 4 of those.
If this is pointless to you, it sucks to be you to be here :hoo: doing this.
Asheera wrote:No I did not disagree with myself... probably phrased it poorly...
Yes, come back when you learn to phrase things better. Some people don't have time to keep coming back to see what you need to "rephrase".
The icy yet intense predator hails from Antarctica. His focused eyes betray nothing but lethal instincts. In those eyes every adversary is but a mere fish.

User avatar
Asheera
Round Table Knight
Round Table Knight
Posts: 4506
Joined: 06 Jul 2008
Location: The Shadows
Contact:

Unread postby Asheera » 12 Jul 2009, 01:57

The 2nd thread I linked contained no abuses, lol. He did activate the monument. He used my strategy to rush, that's ok... the only abuse is to not activate monument & handicap the AI.

About that old thread & nobody finishing Coop 30, what did you expect? Yes it was old, which means people didn't have years time to discover a strategy for that map. At that time nobody finished it yet, and I can tell you that map wasn't completed without cheats or abuses for some months... which makes it one of the hardest maps in a game (most game maps get finished in 1 day). Yeah I didn't check the forums after, but after I got my ass kicked at Coop 30 first time I went to the forums for help, and there this thread where somoene asked for help and nobody said that it was done, or how. And do note that I didn't buy Spellforce the moment it was out, either...

And if you want to take into consideration all of this then you could say type "Power Overwhelming" in starcraft chat in single player and it's instantly the easiest RTS ever, right? (that cheat makes you invincible). Well, I don't care how you classify, point is, the thread creator asked for an easy RTS that he plays, not handicaps the AI, destroys the enemy with an abuse or uses cheats. Yeah you may kite the enemy troops due to bad AI while killing them slowly, you may rush without activating the monument so the AI is handicapped, you may use cheats, etc, this doesn't make the game easy, at least not what the original poster wanted. Your posts didn't help at all, period.
It's really simple. Start a co-op game. Leave the game on. They will come for your bindstone. Anyone with a copy of the game can see for himself.
Nope they do not. And I had the latest patch with 2nd expansion too.
And posting scripts is not the same is showing you disassembled it. Anyone can post a bunch of scripts.
Find them with Google or something then... you will not be able to (except my post maybe) since I never made them public until now.


Oh and stop the quote wars, please. This is not the Observatory :P
No matter how powerful one becomes, there is always someone stronger. That's why I'm in a constant pursuit of power, so I can be prepared when an enemy tries to take advantage of me.

User avatar
theLuckyDragon
Round Table Knight
Round Table Knight
Posts: 4883
Joined: 06 Jan 2006

Unread postby theLuckyDragon » 12 Jul 2009, 17:38

Asheera wrote:Oh and stop the quote wars, please. This is not the Observatory :P
I´m supposed to say that. But I agree nonetheless.
"Not all those who wander are lost." -- JRRT


Return to “Hall of the Heretics”

Who is online

Users browsing this forum: No registered users and 2 guests