Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Topics - TheVolumeRemote

#1
Hello everyone!

After nearly 4 years of development, The Phantom Fellows is now available! I've poured my heart and soul into every single line of dialog, every pixel, musical note and line of scripting - and I've had the best 4 years of my life making this game.

If you play, I hope it brings you much laughter and fulfillment :)

GOG
Steam
itch.io
Fireflower
ThePhantomFellows.com



The Phantom Fellows has heart, lots of laughter and provides endless rewards for the players exploration. Taking place over 7 Days, with each day it's own case, you'll be able to take control over Oliver (the breather) and Englebert (the floater), switching between them to utilize their strengths. The game features a travel map that opens the world up, allowing players to travel back to previous locations where they can find alternate solutions to current puzzles and be rewarded with fresh interactions and laughs. There is also an in-game, dialog based hint system which has a very natural, conversational feel since Englebert already plays the role of mentor to Oliver. The hints are delivered one at a time and the player can chose how much or how little help they want.

The Phantom Fellows features observational and situational humor that is incredibly authentic and unique, while also providing satisfying character arcs, an over-arcing story that slowly comes to a boil for the final day and it handles the subject of death with a certain grace that balances comedy and philosophy in a way that leaves the player with a feeling of satisfaction and fulfillment. Each and every single line of dialog, every pixel and musical note was shown love and care in a way that only a solo developer in love with adventure games can provide.

You're invited to explore the world, interact with hundreds of unique hotspots, dozens of characters and see the dead come to life, in The Phantom Fellows!









#2
(Large Edit, reorganizing and focusing on MacOS)

While I have the Windows build working in Galaxy Client, I can't get the Mac build to even connect with Galaxy at all, no overlay, no time-played tracking- nothing.

I suspect something is blocking my signature bc Galaxy says my build is from an unknown developer when I did sign, notarize and staple the app as well as sign the dylibs before hand. Oddly enough Galaxy also says A Golden Wake and Strangeland is also unverified.

Here's the entitlements.plist that Hob's Barrow uses and it works for them:
Code: ags
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.security.cs.allow-dyld-environment-variables</key>
    <true/>
    <key>com.apple.security.cs.disable-library-validation</key>
    <true/>
</dict>
</plist>

I'm trying different dylibs to the same result but from what the other AGS games on GOG are doing, like Hob's Barrow, I'm mostly using
Code: ags
libagsgalaxy.dylib
libGalaxy64.dylib
with libGalaxy64.dylib in both Resources and Contents. Sometimes I try libGalaxy.dylib which is newer, to no difference.
#3
Hi all! I'm struggling to get achievements to trigger during game play, only on my Mac build.

Can someone break down exactly what dylib files I need and where to put them and at what point in the build process do I put them there?

I'm using AGS2Client so it's jointed. I use cmake to build my Mac ports from the ags-master folder by putting my Data files in OSX > Resources. I rename the .ags file game.ags as standard practice and then terminal-at-folder:

Code: ags
export BUILD_TYPE=Release
mkdir build_$BUILD_TYPE
cd build_$BUILD_TYPE
cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE ..
make

Previously I'd next sign and staple it. But for achievements, after compiling w cmake, I now add to Contents/Resources:

steam_appid.txt (with my games App ID)
libsteam_api.dylib
libagsteam.dylib
libagsteam-unified.dylib

- I got libsteam_api.dylib from Steam's latest SDK and I got the other dylib's from monkies repo or git
- I'm signing the dylibs I've placed in Resources separately and before signing the entire app.
- Before cmake, when I have AGS compile the game, I have also placed the dylibs in my project folder's root and in _Debug folder.

From my own Steam library I see some games use agsteam.dylib instead of libagsteam.dylib. No idea why. Newer games such as Hob's Barrow and Old Skies Demo use libagsteam.dylib so that's what I'm using (I did try agsteam.dylib at some point)

Additionally, no other game on Steam uses "game.ags" as the exe, they use "ac2game.dat" so I began trying with my executable named as "ac2game.dat" which made no difference- it still compiles, runs and does not trigger achievements.

Lastly, I'll be building for GOG next so if anyone responding has done both, I'd also greatly appreciate the same info for Galaxy, what dylibs, where and at what point in the process do I put them there.

Thank you for any help :)

PS - @Dualnames if you're around I'd be super grateful for any pointers or tips, I think you recently ported Hob's?
#4
Hey everyone! So, within the editor I created a template of my game. I then quit AGS, launched it again and tried to create a new game from my template and this is the error I'm getting:

Code: ags
Error: The process cannot access the file 'acsprset.spr' because it is being used by another process.
Version: AGS 3.6.1.24

System.IO.IOException: The process cannot access the file 'acsprset.spr' because it is being used by another process.
   at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound, WIN32_FIND_DATA& data)
   at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
   at AGS.Editor.GUIController.CreateNewGame(String newGamePath, String newFileName, String newGameName, GameTemplate createFromTemplate)
   at AGS.Editor.GUIController.ShowNewGameWizard()
   at AGS.Editor.GUIController.ShowWelcomeScreen()
   at AGS.Editor.frmMain.frmMain_Shown(Object sender, EventArgs e)
   at System.Windows.Forms.Form.OnShown(EventArgs e)
   at System.Windows.Forms.Form.CallShownEvent()
   at System.Windows.Forms.Control.InvokeMarshaledCallbackDo(ThreadMethodEntry tme)
   at System.Windows.Forms.Control.InvokeMarshaledCallbackHelper(Object obj)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Windows.Forms.Control.InvokeMarshaledCallback(ThreadMethodEntry tme)
   at System.Windows.Forms.Control.InvokeMarshaledCallbacks()

I've tried the following:

- Restart computer
- Run AGS as Admin
- Remove backup_acsprset.spr before creating template
- Checked task manager to make sure no instance of AGS was running
- Tried creating and loading the template on another PC with even more memory
- Changed the templates save path from the default C:\Users\me\AppData\Local\AGS\Templates
To where the preset templates are stored C:\Program Files (x86)\Adventure Game Studio 3.6.1

I'd appreciate any tips or help with this, thank you :)
#5
I've recently installed the AGS2Client plugin's and I can no longer compile the Linux build due to this error
Code: ags
Linux: plugin libags2clientstub.so not found for any arch
I haven't been able to find that file locally or online and would greatly appreciate any help.

It was a little tricky finding all I needed for the AGS2Client plugin, I suspect I'm both missing some files and am using superfluous files but alas, here are the DLL's I have in my AGS 3.6.1 folder
Code: ags
Galaxy.dll
steam_api.dll
AGSteam.dll
AGSteam-disjoint.dll
ags2clientstub.dll
agsgalaxy-disjoint.dll
agsgalaxy.dll

I currently only have AGS2Client enabled because I believe this is correct (if I want to produce a unified/joined build for both GOG and Steam). I'm also wondering if this is correct.
Image-5-10-24-at-5-33-PM" border="0

thank you for any help :)

Edit: I've found these files in Monkey's repo for Mac and Linux (both of which I have ports to) and I assume they go with the executable file but I'm wondering if they should also go in the AGS folder?
Code: ags
 Linux
libsteam_api.so
libagsteam.so
OSX
libsteam_api.dylib
agsteam.dylib 
#6
I'm attaching screenshot of how I filled it out (sans name and PW). I also tried creating a dummy .jks file but it doesn't want an existing file with the same name. On AGS 3.6.1.23-P1

the file path I directed the generator to was
Code: ags
C:\users\me\keystores\thephantomfellows_keystore.jks

Code: ags
Error: Value cannot be null.
Parameter name: path1
Version: AGS 3.6.1.23

System.ArgumentNullException: Value cannot be null.
Parameter name: path1
   at System.IO.Path.Combine(String path1, String path2)
   at AGS.Editor.Utils.AndroidUtilities.RunGenerateKeystore(AndroidKeystoreData d)
   at AGS.Editor.GenerateAndroidKeystore.buttonGenerate_Click(Object sender, EventArgs e)
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

keystore-error" border="0
#7
I'm currently in a rabbit hole trying to figure out what to do about 3.6 chopping the top of my text off in GUI's, which isn't an issue for me in 3.5.1 and I feel bad starting a thread about it so @Crimson Wizard can I ask, is this still a known issue? I'll be finishing my current game in 3.5.1 but will use the same font in the next one and I see it's still getting cut off in 3.6.1.18 RC and the latest beta and wanted to half bring it to attention and half see if it's being addressed, so that I can use 3.6x in the future. Thanks for any insights :)
#8
Hey mates, I hope you're all well.

Is there a reasonably simple way to find out if the players current Destination is going to land them on a Hotspot?

I'd like to send the player to the character they're about to talk to, without room-specific coordinates with the caveat being, if the player has landed on (or their DestinationX being) a hotspot- in this case a hotspot with a ChangeRoom command. 160 of them actually, so ideal solutions I'll happily note for next time but for now if I can avoid going through 80 rooms with 2 "stands on hotspot" exits in each, that would be mega. I have a few ideas that would probably get it done but they involve going back through every room and I'd love to handle this globally.

I kinda feel like #define is my answer here but honestly I'm struggling. If I can find out  1)  Is the Destination a hotspot and 2) what is that hotspot's ID, I can handle it on on_mouse_click.

I should mention that my game has rooms with varying widths (scrolling), which is the main thing that's outsmarting me so far. I'd imagine something like below would work if each room was a predictable 320 x 200 but alas. Anyway this might be drifting from the point but I feel weird asking for help without showing some code  ;)
Code: ags

function cChar_Talk()
{
  player.Walk(cChar.x + 40, PrevY, eBlock, eWalkableAreas);
  faceChar();
  facePlayer();
  dDialog.Start();
}

function on_mouse_click(MouseButton button)
{
  if (button == eMouseLeft)
  {
    if (mouse.Mode == eModeTalkto)
    {
      if (player.DesinationX <= 10 || player.DesinationX >= 310)
      {
          player.StopMoving();
          player.Walk(cChar.x - 40, PrevY, eBlock, eWalkableAreas);
      }    
    }
  }
}


Wouldn't work easily, if I go and tag the previous 80 rooms with i
#9
AGS Games in Production / The Phantom Fellows
Sat 17/07/2021 20:07:24

The Phantom Fellows is about two best friends who start a paranormal investigation
business together, since one of them is already dead.

Download the Demo & Wishlist on Steam!

Story
(The word-y version)

Oliver Cobblestone can communicate with a dead- not the dead, but rather one Englebert Picklebender. Together they investigate the paranormal to bring peace to occupant spirits and haunted hosts alike.
Share laughs with the living and deceased in this point-and-click comedy adventure while attending to specters who haunt your clientele. Use Oliver's incredible ability to, um, be alive, and Englebert's capacity for the incorporeal to fulfill agreements with the respiratorily challenged. Oh! and the breather paying you will need physical proof you've done anything at all, and how will you get something out of nothing? Call your closest pal, take your deepest breath, and stumble headlong into the unknown on a personal journey of social entanglement and brotherhood beyond the veil.
As you pass a week with the Phantom Fellows, you'll encounter many spirits. Some yearn to be reunited with a possession, others wish to commence their eternal repose, and of course a few simply enjoy a good haunting. Between spooks you'll also meet many warm-bodied breathers (for better or worse), and all the while a shadowy, malicious spirit will lurk near Oliver for a dearly personal reason.

-Hand-drawn pixel art and animations
in glorious 160x100 (upscaled to 320x200)
-Completely interactive- take control of the characters!

-Switch between Oliver and Englebert! Sometimes being dead has its perks. Maybe.

-Play through eight days, explore each new location, negotiate with ghosts, sweet talk the living, and perform slapdash acts of tomfoolery!

-Revisit locations from previous days any time after Day 3 and discover more answers! or questions?

-Some puzzles have alternate solutions as the ending has an alternate of its own


Overall Progress
Day 3 of 8 fully completed
Day 4 currently in development

Manual
Point & Click
or
L - Look
I - Interact
T- Talk
F1 - Switch to Oliver *
F2 - Switch to Englebert*
Arrows - Walk

Say hi on Twitter maybe!
@PhantomFellows

Trailer has very minor spoilers!
#10
Hey mates, once again my ambition outweighs my skills. The goal is to track how many times a player has been in a room because if they have a certain inventory item and have entered said room enough times, I'd like to give them a hint, by sending a character in that room to talk to.

The code below is the idea I've been trying to get to work- mark firstEnter = true; at room first load and start a cascade of bool's with emphasis on ELSE if so that each time they enter, a new bool is marked true and the prior is marked false. I'm sure those who know better than me will not be surprised it doesn't work but I am out of knowledge to know why not.

Code: ags

//Top of Room script
bool firstEnter = false;
bool secondEnter = false;
bool thirdEnter = false;
bool fourthEnter = false;
bool fifthEnter = false;
bool sixthEnter = false;

function room_AfterFadeIn()
{ 
  if (firstEnter == true)
  {
    secondEnter = true;
    firstEnter = false;
  }
  else if (secondEnter == true)
  {
    thirdEnter = true;
    secondEnter = false;
  }
  else if (thirdEnter == true)
  {
    fourthEnter = true;
    thirdEnter = false;
  }
  else if (fourthEnter == true)
  {
    fifthEnter = true;
    thirdEnter = false;
  }
  else if (fifthEnter == true)
  {
    sixthEnter = true;
    fifthEnter = false;
  }
  else if (sixthEnter == true)
  {
    moveGirl = true;
    sixthEnter = false;
  }
  if (moveGirl == true && player.HasInventory(iKey))
  {
    cGirl.ChangeRoom(63, 160, 176, eDirectionLeft);
  }
}

function room_FirstLoad()
{
  firstEnter = true;
}


I also suspect an int might be a cleaner way to do this but alas, my brain seems to prefer bool's. Regardless any help as to how to track how many times a player has entered a room so that I can call something at X amount of times, would be greatly appreciated :)
#11
Hey mates, hope you all are well!

What I'm trying to do is get the players current game speed, store it as a variable and use it to return the game to the speed the player had previously selected, after an animation- because- I'm slowing the game down to default (40) before most animations.

What I tried that isn't working is this

Code: ags
//created global variable "PrevSpeed" (int)
//In room script under interact function for animation

PrevSpeed = GetGameSpeed();
SetGameSpeed(40);
oObject.Animate(0, 0, eOnce, eBlock, eForwards);
SetGameSpeed(PrevSpeed);


I had used something similar to return the player to the previous room and location (if they cancel out of using the map by pressing Return) and it worked so I thought this would but alas.
Thanks for any tips  :)

EDIT: the above example works, I had another setgamespeed set in the room script that I had missed (whoopsie). If you searched your way here for help, using the above example will work :)
#12
Hey mates, sorry to ask a second question in a week but I’ve spent a couple of hours searching and trying things I’ve found with no luck.

Long short, after combining inventory items the cursor returns to Walk To. I have a puzzle where you must combine many items so this becomes frustrating for the player. How can I set it so after combining inventory items, the mouse mode returns to
Code: ags
mouse.Mode = eModePointer;
instead of Walk To (while gInventory is still open)?

Thank you! :)
#13
Hello! Is It possible to use Game.DoOnceOnly more than once in Repeatedly Execute? I could not figure out what I was doing wrong with the script below, there was a (Global) variable check and when it was correct, nothing happened. So eventually I removed the latter DoOnceOnly and made a variable for it instead and now everything works.

But I'm not certain that was the root of what fixed it. To elaborate, when testing it, if I set the game up to execute the first command (the first DoOnceOnly below), first- then everything worked. However if I approached the game play to where the game executes the second instance of DoOnceOnly first, then it would not work, the character wouldn't speak etc.

To summarize if my problem is not related to DoOnceOnly, I am a bit lost. I've tried a few things like making the second command an If statement instead of Else If, playing around with variations of the same basic command for checking inventory, making a variable for when the player takes the inventory item I need to check and checking the variable both with and instead of the inventory item and finally I can't use Room First Load because this needs to take place after the first visit.

Anyway I had said up top I found a work around for this, and I did however I have swappable player characters and sometimes they split up so I'm going to need figure out why this isn't working for the near future :) thank you for any advice!

Room Script
Code: ags
function room_RepExec()
{
    if (player == cEgo1 && Game.DoOnceOnly("Split Up"))
  {
    Wait(20);
    cEgo2.Say("Words.");
    cEgo1.SetAsPlayer();
    cEgo2.ChangeRoom(20, 90, 150, eDirectionLeft);
  }  
   else if (player == cEgo2 && Game.DoOnceOnly("Gave Hat") && player.HasInventory(iHatGlow) == true)
  {
    cEgo2.Say("Words.");
    cEgo1.SetAsPlayer();
    Hathandoff = true;
  }
}
#14
I need to remove the option to talk to a character after talking to the character once. So basically I don’t want the player to able to talk to the character again after their dialog has been run.

I had used option-off-forever but as I’m sure you know that just causes a crash when you try to talk to the character a second time. I’d like it so if you try to talk a second time the game returns nothing, no dialog, no message etc.

Thank you for any help, I couldn’t find anything on disabling dialog after it’s been run but my apologies if this has been covered :)
#15
Long story short, I’d like to use the game’s Speech font for when a message is said through the Display(); command.
Is there a way to change what font the display command uses?

I’m wondering if I could do something like this
Code: ags


//global script

FontType displayfont[];

void SetFont(?) {
  
}


As you can already tell, that’s a only a quater of a total shot in the dark. Thanks for any help!
#16
I’ve searched for a long while on the forums and in the manual as I’m sure this is covered somewhere but alas, I can’t find anything or figure it out!

So I need to use two inventory items on one hotspot to make a fire.

Use matches with hotspot
Use lighter fluid w hotspot
Hotspot becomes visible and animates

I don’t want to combine the items if I can avoid it. So how do I add an inventory item to a hotspot, take the inventory item away w LoseInventory and then when the second item is used, tell AGS to go ahead and make the hotspot (fire) visible?

Also I don’t need the player to use one item before the other, either the matches or fluid can be used first.

The roadblock I’m hitting in my ideas and similar issues that I did see posted is regarding hasinventory. Because I’d like the inventory item to be gone after one use, checking the inventory status doesn’t help since the player could have already say, used the fluid (on the hotspot) and therefore won’t have the fluid on them anymore.

Thank you so much for any help. Here is the code I used that for several reasons will not work, using activeinventory and not hasinventory, not combining them if this was the route I wanted (it’s not) and so on. I guess I just wanted to show I’m trying and to give whoever reads this an idea of what’s happening. Thank you :)
Code: ags
 
function hFirepit_UseInv()
//This very obviously wont work unless I have the player combine them which i'm trying to avoid
{
  if (cEgo1.ActiveInventory == iFluid && cEgo1.ActiveInventory == iMatches)
  {
    cEgo1.Say("Alight let's make a fire!");
    cEgo1.FaceDirection(eDirectionUp);
    oFire.Visible = true;
    oFire.SetView(VFIRE);
    oFire.Animate(0, 4, eRepeat, eNoBlock, eForwards);
  }
  else if (cEgo1.ActiveInventory == iFluid)
  {
    cEgo1.Say("I still need something to ignite it with.");
  }
  else if (cEgo1.ActiveInventory == iMatches)
  {
    cEgo1.Say("I'm going to need something to help start the fire. The wood is too damp.");
  }
}
#17
What’s the best way to handle changing a room without having the character(s) exit the room?

My game takes place primarily in single room “days” or levels or cases etc. At the end of a day there’s a small sequence once the final puzzle is solved (see example script) and I’m looking for tips on how I should go about achieving a nice fade out and fade in to the next day or case, once that sequence is completed. Note that at least 2 characters will need to go into the new room together (there’s two main characters).

Thank you for any advice!

Code: ags


function hWall_UseInv()
{
  if (cEgo1.ActiveInventory == iChalk && oGlitterFire.Visible) 
 {
    cEgo1.Walk(211, 172, eBlock, eWalkableAreas);
    cEgo1.LockViewFrame(VEGO1CHALK, 0, 0);
    Wait(40);
    oGlitterFire.Visible = true;
    Wait(40);
    cEgo1.UnlockView(eStopMoving);
    Wait(40);
    cEgo1.Walk(140, 172, eBlock, eWalkableAreas);
    Wait(40);
    cGhost1.SetAsPlayer();
    Wait(80);
    cGhost1.Say("Dialogue.");
    cEgo2.Say("Dialogue.");
    cGhost1.Say("Dialogue.");
    cEgo2.FaceCharacter(cEgo1);
    cGhost1.Walk(190, 172, eBlock, eAnywhere);
    cGhost1.LockViewFrame(VGHOST1BACK, 0, 0);
    Wait(40);
    cGhost1.Transparency = 50;
    Wait(20);
    cGhost1.Transparency = 100;
    oChalkwall.SetView(VCHALKWALL);
    oChalkwall.Animate(0, 3, eOnce, eBlock, eForwards);
    oChalkwall.Transparency = 100;
    oGlitterFire.Visible = false;
    cEgo1.FaceCharacter(cGirl1);
    Wait(40);
    //cEgo1.ChangeRoom(2, 200, 160, eDirectionRight);
    //cEgo2.ChangeRoom(2, 205, 160, eDirectionLeft);
   }
  
  else cEgo1.Say("Dialogue.");
  
  }


SMF spam blocked by CleanTalk