the cutting room mirror

Operation G.H.O.S.T.

A sequel to Sega AM2's rail shooter Ghost Squad, only this time without AM2's involvement.

Internal Project Name#

The .exe and .ini files are named gs2, which likely stands for Ghost Squad 2.

Unused Graphics#

Found within some UI image files are UI_video_chat_form.png and UI_routemap_movie.png, two placeholder graphics for cutscene imagery.

There's also placeholder graphics, UI_TO_cam1.png and UI_TO_cam2.png, in the UI_route_demo folder for the "Reference Room" and "Elevator Hall" text in the second stage's route map, respectively.

Unused Video#

og_tobecontinued3-2.wmv is a cutscene promoting a "completed" version of the game, likely leftover from a location tested or prototype version.

Uncompiled Source Code#

Present in the same folder as the unused "to be continued" video are two equally-unused Lua scripts for it.

main.lua

  
------------------------------- UTF-8로 저장하기 위한 코멘트/UTF-8でセーブするためのコメント
require ("tools/bindEx" )
require ("tools/og_sequence" )
require ("tools/og_task" )
require ("Sound/Sound" )



local frame = 0
local s_TaskMgr = nil

local g_GeneralSE = new_SoundBank("SE_general.sound", true)

PlayInfo.GM_ToBeContinue()

local function TobeContinueObject()

   local TobeCon_movie = LwMovie( "scene/to_be_continue/og_tobecontinued3-2.wmv" )
   local TobeCon_img_movie = TobeCon_movie:GetTexture()
   local led_space = 12
   TobeCon_img_movie:SetCell( 0, RECT( 0,0,1024 + led_space * 2, 600 + led_space * 2 ) )


   local tbl = {
      Main = function(self)
             end,
      
      Draw = function(self)         
                lwMatrix:Push()
                do 
                   lwMatrix:Translate( 0, 600 , 0 );
                   local x = 1024 / ( 1024 + led_space * 2 );
                   local y = 600 / ( 600 + led_space *2 );
                   lwMatrix:Scale( x, -y,1.0 );
                   TobeCon_img_movie:DrawCell( 0 );
                end
                lwMatrix:Pop()
                
                lwMisc:DebugPrint( "Status".. TobeCon_movie:GetStatus() );
                
             end,
      
      Stop = function(self)
                s_TaskMgr:Remove(self)
             end,
      
      IsPlay = function( self )
                  return TobeCon_movie:GetStatus() == 3
               end,
   }


   do
      ChangeBGM("OG_bgm_tobecontinue.sound")
      lwPostEffect:SetMode( PEM_MOVIE )
      TobeCon_movie:SetPosition(0, 0, SCR_W, SCR_H)
      TobeCon_movie:SetEnableRepeat(0)
      lwMisc:DebugEvent( "TobeCon:Play" )
      TobeCon_movie:Play()
      lwMisc:DebugLog( "TobeCon" .. TobeCon_movie:GetStatus() );
   end

   s_TaskMgr:Add( "continue", tbl )
   return tbl
end



local GameOverObject = function()
    local   nCurrentFrame   = 0
    local   animation       = nil
    local   KeepFrame       = nil
    
    local function GameOverSeq()
       while true do
          if nCurrentFrame > KeepFrame then
             while true do coroutine.yield() end
          end
          
          nCurrentFrame = nCurrentFrame + 1
          coroutine.yield()
       end
    end
    
    local m_co = coroutine.wrap( function()
                                    while true do
                                       local tempPath = AppSetting.ConvertPath("img/UI/UI_gameover/UI_@/UI_gameover.anim")
                                       animation = LwAnimation(tempPath, forLua.PRI_IMMEDIATELY)
                                       KeepFrame = animation:GetAnimationLength(0) - 1
                                       GameOverSeq()
                                       animation = nil
                                       while true do coroutine.yield() end
                                    end
                                 end )
    
    local   tbl = {
       Main = function(self)
                 m_co()
              end,
       
       Draw = function(self)            
                 local f = nCurrentFrame
                 if f > KeepFrame then 
                    f = KeepFrame 
                 end
                 animation:DrawAnimation(0, f)
              end,
       
       Stop = function(self)
                 s_TaskMgr:Remove(self)
                 animation = nil
              end,
    }

    g_GeneralSE:Play("gameover")
    s_TaskMgr:Add( "taskGameOver", tbl )


    return tbl
end



function WaitFrame(frame)
   local iFrame = 0
   while iFrame < frame do
      iFrame = iFrame + 1
      coroutine.yield()
   end
end


local function sequence()

   if true then
      local tobecon = TobeContinueObject()

      
      while tobecon:IsPlay() do
         coroutine.yield();
      end
      tobecon:Stop()
   end
   
   if true then
      local gameover = GameOverObject()
      WaitFrame( 200 )
      gameover:Stop()
   end
      
      

   lwLauncher:SetFile( "scene/title/main.lua" )

   while true do
      coroutine.yield();
   end

end

local function Init()
   s_TaskMgr = og_task.ManagerCreate( "task" )
   s_TaskMgr:Add( "Sequence", og_sequence.ManagerCreate( sequence, "Sequence" ) )
end

function Main()

   if frame == 0 then
      Init()
   end
   s_TaskMgr:Main()
   frame = frame + 1
end

function Draw()
   s_TaskMgr:Draw()
   s_TaskMgr:DebugPrint( 2 )
end

seq_m3_result.lua

  
------------------------------- UTF-8로 저장하기 위한 코멘트/UTF-8でセーブするためのコメント
local TobeCon_movie = LwMovie( "scene/m_desert_result/og_tobecontinued_wmv9_95.wmv" )

local TobeCon_img_movie = TobeCon_movie:GetTexture()
local led_space = 12
TobeCon_img_movie:SetCell( 0, RECT( 0,0,1024 + led_space * 2, 600 + led_space * 2 ) )

function MovieDraw()
   lwMatrix:Push()
   do 
      lwMatrix:Translate( 0, 600 , 0 );
      local x = 1024 / ( 1024 + led_space * 2 );
      local y = 600 / ( 600 + led_space *2 );
      lwMatrix:Scale( x, -y,1.0 );
      TobeCon_img_movie:DrawCell( 0 );
   end
   lwMatrix:Pop()
end




local TobeContinueObject = function()
    local   nCurrentFrame   = 0
    local   taskMgr         = nil

    local   tbl = {
        Main    = function(self)
            nCurrentFrame = nCurrentFrame + 1
        end,

        Draw    = function(self)            
            MovieDraw()
        end,

        Start   = function(self, taskMgr_)
            taskMgr = taskMgr_
            taskMgr:Add( "taskTobeContinue", self )
            ChangeBGM("OG_bgm_tobecontinue.sound")
            lwPostEffect:SetMode( PEM_MOVIE )
        end,
        
        Stop    = function(self)
            taskMgr:Remove(self)
            taskMgr = nil
            
        end,
    }
    return tbl
end


local GameOverObject = function()
    local   nCurrentFrame   = 0
    local   taskMgr         = nil
    local   aniGameOver     = nil
    local   KeepFrame       = nil
    
    local function GameOverSeq()
        while true do
            if nCurrentFrame > KeepFrame then
                    while true do coroutine.yield() end
            end
            
            nCurrentFrame = nCurrentFrame + 1
            coroutine.yield()
        end
    end
    
    local m_co = coroutine.wrap( function()
        while true do
            local tempPath = AppSetting.ConvertPath("img/UI/UI_gameover/UI_@/UI_gameover.anim")
            aniGameOver = LwAnimation(tempPath, forLua.PRI_IMMEDIATELY)
            KeepFrame = aniGameOver:GetAnimationLength(0) - 1
            GameOverSeq()
            aniGameOver = nil
            while true do coroutine.yield() end
        end
    end )
    
    local   tbl = {
        Main    = function(self)
            m_co()
        end,

        Draw    = function(self)            
                local f = nCurrentFrame
                
                --img:SetCell( 0, RECT( 0,0,SCR_W,SCR_H) )
                --img:DrawCell(0)
                if f > KeepFrame then f = KeepFrame end
                    aniGameOver:DrawAnimation(0, f)
        end,

        Start   = function(self, taskMgr_)
            taskMgr = taskMgr_
            taskMgr:Add( "taskGameOver", self )
            g_GeneralSE: Play("gameover")
            
        end,
        
        Stop    = function(self)
            taskMgr:Remove(self)
            taskMgr = nil
            aniGameOver = nil
        end,
    }
    return tbl
end

-- seq info
Seq_m3_result_Info = function()
    return {
        name = "Seq-m3-result",
        main = Seq_m3_result, 
        goto = {
        },
        preload = "scene/to_be_continue/seq_m3_result.preload",
    }
end


function Seq_m3_result()
    SetShootable(false)
    g_bTestHUD  = false
    
    
    local RO = dofile("lua/Direction/ResultScreen.lua")
    RO:Start( g_TaskMgr )   
    RO:Stop()
    RO = nil

    -- 로케 대응 코드
    local tobecon = TobeContinueObject()
    tobecon:Start(g_TaskMgr)
    
    --厭廃汽 advertise Movie亜 馬球 坪漁 鞠嬢赤嬢辞
    --差紫 細食隔奄稽 ToBeContinueMovie 坦軒鞠醸製. 託板 呪舛戚 琶推敗.
     do -- play
     TobeCon_movie:SetPosition(0, 0, SCR_W, SCR_H)
     TobeCon_movie:SetEnableRepeat(0)
     lwMisc:DebugEvent( "TobeCon:Play" )
     TobeCon_movie:Play()
     lwMisc:DebugLog( "TobeCon" .. TobeCon_movie:GetStatus() );
      while TobeCon_movie:GetStatus() == 3 do
      lwMisc:DebugPrint( "WaitStop".. TobeCon_movie:GetStatus() );
      coroutine.yield();
      end
 end
  
 WaitFrame(100)
 tobecon:Stop()
  tobecon = nil
    
  local gameover = GameOverObject()
  gameover:Start(g_TaskMgr)
    
  WaitFrame(200)
  gameover:Stop()
  gameover = nil
    

     ResetCritical()

    lwLauncher:SetFile( "scene/m_ship/Main.lua" )
end