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

Messages - RickJ

#501
I'll have to disagree with some things here ...

Quote
The insurance companies have as their primary aim making money. It is in their best interest to give you as little health care as possible for the highest price you will accept.
It is true that insurance companies are in business to make a profit  but is absurd to believe that mistreating customers is the optimal means of maximising profit. Indeed this a a formula for failure and bankruptcy rather than success.  I don't think profit is a bad thing.  It's the incentive that drives an organisation to operate efficiently, eliminate waste,  and to continuously improve it's self.  The tried and true way to success in private business is to provide a superior product or service and/or a better price that the competition.

Quote
The government has as their primary aim the welfare of the citizens (or at least in theory). It is in their best interest to give you as much health care as possible for the lowest price they can manage.
"or at least in theroy" is an admition that this is not the case.  The incentives in a government bureaucracy are all backwards.  Instead of having incentive to eliminate waste and inefficiency government agencies routinely and without exception endeavour to consume ALL funds and resources allocated to them by politicians.  Among government workers it is universally accepted that thgis is an open invitation to politicians to allocate fewer funds and resources in in the future and is to be avoided at all costs.  How can such a system be expected to produce optimal results?

You can take a look at this A 2009  Daily Mail article which states  that "Government NHS policy has placed the emphasis on vote-winning targets such as waiting times, rather than focusing on care".
[/quote]

Quote
... According to studies, healthcare in the USA is about thrice as expensive overall while being inferior in quality to that in Europe. I do not think that is a coincidence.
To which studies are you referring and in what way is the US health care system inferior?   

For example last Monday my 77 year old aunt phoned her doctor  to complain about being tired,  short of breath, and feeling lousy.   Before the end of the day she was booked into the hospital, had blood tests for heart attack and stroke, MRI, and other tests performed, and had seen a cardiac specialist who diagnosed her with cardiac arrhythmia. He told her that she needed a pace maker but wanted to monitor her heart for a couple of days to confirm his diagnosis.  So he booked her into the telemetry unit where they wire you up to a wireless monitor that continuously measures heart and other things 24/7.  The resulting measurements are transmitted to  the nurses station where it is monitored and recorded for doctors' later use.   She had surgery on Wednesday to implant her pacemaker and went home on Friday.   

Now compare this with the UK where my aunt would have had to wait 10-18 weeks before receiving  treatment.  ...
http://www.prnewswire.co.uk/cgi/news/release?id=118403
http://www.drfosterhealth.co.uk/hospital-guide/hospital/nhs/Liverpool-Heart-and-Chest-Hospital-1183.aspx?procedure=CARDPACEMAKER

That is if she recieved treatment at all.  As I understand it NHS does QOL assements to determine what treatments "are worth it"'.  Based on this and other news I hear about NHS from time to time I am not sure my auntie would be deemed  worthy.
http://www.dailymail.co.uk/debate/article-1163064/HARRIET-SERGEANT-Why-does-NHS-hate-elderly-much.html

Quote
America is easily the most pure capitalist nation in the world and even poor 'rednecks' seem to oppose any kind of socialism, until they get sick anyway.
If a private private company screws you over that you many options.  They can be sued in a court, reported to the the state Attorney General, report to Better Business Bureau,  boycotted,  reported to mass media, publish the details on the internet, etc, etc.

You don't have to be very smart to know that when you get fucked by your government your FUCKED! and have no recourse. 

Honestly, I just can't understand why people put so much trust in government.  Have you never dealt with any government agency?  The people there are dumbest fuckers you will ever meet.  Sure they are probably nice folks when they are at home but at work behave like a bunch of escapees from a Monthy Python skit.

For example the first of the year I rented a PO Box for my wife's business.  The idea was to have a secure address where we could receive 2-3 checks each month.   At the end of the month I went to check on the box and found it stuffed to the max with catalogs and other junk mail addressed to some other guy.  I took this huge pile of mail to the clerk and complained the cobversation went soemthing like this:

RickJ:  Someone else's mail was plugging up my little mail box.

Clerk: No! Its your mail all right!

RickJ: But that's not my name.

Clerk: Yeah but right here is says "or Resident".

RickJ: But that's not my name either.

Clerk: No it's not a name, it means who ever is living at that addrress.

RickJ: But I don't live here at the post office do I.

Clerk: I doesn't matter we still have to deliver that mail to you

RickJ: Why it's not my mail.

Clerk: I don't know we just have to do it.

RickJ: But I don't want it

Clerk: I doesn't matter

RickJ: I can't use the box like this, it's useless to me.

Clerk: I don't care but you can talk to the post master but he's not here to day ..

a few days later I return and talk to the postmaster ...

RickJ: I'm having a problem with the PO Box I recently rented.  It's getting plugged up with catalogues and other junk mail making it unusable for my business purposes.

Postmaster: Yeah, probably the previous renter didn't fill out a change of address form so that's why you're still getting his mail.  If he had filled out the proper forms we would just forwaerd his mial and you wouldn't get it.

RickJ: Ok, so I just have to fill out some forms yto get this fixed

Postmaster:  Oh no, you can't fill out the forms.

RickJ: Why not?

Postmaster: Because it's not your mail.

RickJ: That's what I told the clerk but he said that you have to deliver it to me any way.

Postmaster: Yes that's right.

RickJ: Why?

Postmaster:  I don't know why, we just have to.

RickJ: Isn't there anything I can do?

Postmaster:  (yells to an employee in back room) Hey Fred!  What's up with box 147.

Employee: Oh, that was old Herb's box.

Postmaster: Oh! now I understand what happened.  The gentleman who previously rented that box passed away.

RickJ: Ok, so you're not gong to be sending his mail to me anymore?

Postmaster:  Oh no! We have to.

RickJ: Why?

Postmaster:  Because it's addressed to you box  and he hasn't filled out a change of address form ...

RickJ:  ... because he's dead?

Postmaster:  Yes thats right!


No kidding this actually happened to me just a couple of months ago. 

#502
What if I were to say "The baron is a gay old rogue ..."?  Would/should that be offensive to anybody?
#503
Quote
But he is saying his game might offend others. That's a warning, isn't it?
As pointed out earlier in the thread, the same could be said of any/every game.  Without some specifics such a warning is meaningless.

Quote
Let's say that this means the game starts off in a prison,  ... offensive characters ...
I think the word "offensive characters" in this context is less accurate than "really bad characters".   There is nothing controversial or surprising about the fact that really bad people are in prison, every school kid knows that.  It's one thing to say "Oh he's a lifer in for murder and the other guy is doin 10-20 for pedophilia..."  and quite another to disclose all the gory details of their crimes.   IMHO, the former doesn't require prior warning and the latter does.  Such a warning could simply contain the following: 

" ..., violence, pedophilia,  prison,  ..."
#504
Music
Both musical compositions and their performance are copyrightable.  Music may have been written centuries before copyright existed but a contemporary [performance may be.
Look for the the specific title on archive.org.  They generally have copyright info listed and if works are in public domain.

Literature
From what you said seems like the book would have long ago been in the public domain.   There is a wrinkle in that more recent additions can be copyrighted.  I'm not a lawyer but since you are making a derrivative based on the original work which is in the public domain and not based on the revised work which is also a derivative of the original etc ... well presumably you are going ot use the characters and the general storyline but not the exact text so I think it would be difficult to prove infringement on your part ??

You can check the guttenburg project and archive.or for the copyright status ...
gutenberg.org
archive.org

#505
Quote
If a character were to say something is "gay" its just a reflection of that character and the viewer is free to decide whether or not they like that character but it has no bearing on the opinions or conduct of the author.
Hmmm, I don't see why it would be considered asswholish ...

Quote
http://dictionary.reference.com/browse/gay

gay  /geɪ/ Show Spelled [gey] Show IPA adjective,-er, -est, noun, adverb
â€"adjective
1. having or showing a merry, lively mood: gay spirits; gay music.
2. bright or showy: gay colors; gay ornaments.
3. given to or abounding in social or other pleasures: a gay social season.
4. licentious; dissipated; wanton: The baron is a gay old rogue with an eye for the ladies.



The content of an adventure game is initially hidden and gradually revealed to players as they advance through the game.  The real issue is that you may surprise players with something they personally find distasteful and would have never chosen for themselves or their friends and family. 

Consider, for example, an adventure game having a "Goldie Locks and Three Bears" theme.   It is dressed in bright and lively cartoonish style and advertises itself as the classic tale we all know.  You say hey this would make a great gift for my little nieces and nephews, so you download  it and burn  a bunch of CDs.  While you're at it you burn a cd for your bosses children as well.   A month or so later you learn from your sister/boss that when the kids get to the part where the bears come home and find Goldielocks sleeping in their bed that instead of chasing her away the fore her to perform oral sex on Papa and Mama Bear while Baby bear is boinking her in the bum.   

Excuse me, but I think I would be -- well offended is too mild of a word.   

Case in point is the initial post in this thread -- no clue as to what the author is actually concerned about and he feels that he must keep the topic concealed lest he spoil his game.   I think this is wrong headed thinking and that it's necessary to be upfront an honest about the content of your work.   In the above example the description.abstract ought to contain something like this:

Quote
We've all heard the story about Goldilocks and the Three Bears when we were kids but is that all there is to it?   Now that we are grown up we find that life is more complicated than we thought and when we screw things up .... well ... were screwed!   WARNING: Contains adult themes, rough language, bestiality, and other sexual acts.

If your game can't survive a brief and accurate description it's not worth playing.  Just my 2 cents.
#506
Just to expand a bit upon what CShelton says the curly braces are used to enclose blocks of code.   Without the braces it would only be possible to execute one instruction per if/else.  For example ..l.
Code: ags

function IsZero(int i)  {
     bool status;

     if (i==0) status = true;
     else status = false;

    return status;
}


Now to do more than one thing for each if/else case we need to use curly brackets to enclose the code that goes with each?
Code: ags

bool Global Status;

function IsZero(int i)  {
     bool status;

     if (i==0) {
          status = true;
          GlobalStatus = true;
     }
     else {
          status = false;
          GlobalStatus = false;
     }
    return status;
}


So the generalized structure looks like this ...
Code: ags

     if (condition) {
          code
          :
     }
     else if (condition) {
          code
          :
     }
     else {
          code
          :
     }


I have formatted your code using the Programming Convention that I use.  It is described in the DemoQuest documentation available from this thread linked below.

http://www.adventuregamestudio.co.uk/yabb/index.php?topic=34048.msg443220#msg443220

It's helpful to follow a programming convention but it doesn't much matter which one you follow or if you make up your own as long as you are consistent.  Monkey for example uses a much different programming convention than I do.  The one I use works for me and the one he uses works for him.  You should choose or invent one that works for you.

Code: ags

function room_RepExec() {

     int i,  oid,  cid;

     // Detect bullet collisions
     i=0;
     while (i<3) { 
          // Get collision
          oid = RubberbandHitObject (i);
          cid = RubberbandHitCharacter (i);

           // Respond to collision with object
          if (oid>=0) { 
               // Object collission, do something (i.e. call function)
              RemoveWalkableArea(2);
          }  
          // Respond to collision with character
          else if (cid>=0) { 
              // Character collission, do something (i.e. call function)
          }
          // Respond to no collision
          else { 
               // No collission, do something (i.e. call function)
               if (player.ActiveInventory(iRuberband_1)||(player.ActiveInventory(iRubberband_2)||   
                  (player.ActiveInventory(iRubberband_3)) {
                    Display("You missed!);
               }
          }
     }
     i++;

     // Activate Exit
     if (ExitIsActive()) RestoreWalkableArea(2);
     else RemoveWalkableArea(2);
}


I am sorry if I have ended up explaining the really obvious but sometimes it's a helpful exercise.  Someone can be missing some small point somewhere, not know what, where nor how to ask a question about it and end up totally  messed up.   Anyway hope I have been helpful to you BlueAngel or others lurking about.   ;)
#507
Firefox 3.5 supports OGG video in HTML video element.  You can see a short demo at the link below (if you have firefox of course).   It's my understanding is that it's a problem of politics rather than implementation.   It's also my understanding that Firefox and Safari are going ahead with implementation even though proprietary vendors don't want to agree.   

http://en-us.www.mozilla.com/en-US/firefox/3.5.8/firstrun/
#508
Quote
... But to re-make the engine in those technologies would require much much much coding. Or even mucher! Or even the muchest!
It's given that a lot of work goes into making a runtime game engine (and even more in the IDE part of it) and that some languages are easier to work with than others.   The JS language has a syntax similar to C/C++ and Java and seems to be much more forgiving in many respects than either of the other two.  So I am curious as to why it would be so much more work in JS?  

Quote
and seriously...It's much better to just run the game on the server and send the rendered frames to the user just like microsoft and others are planning to do lately.
Again I curious, in what way would it be better?  The obvious down side is that it would not scale as well and consume much more server resources.  Performance would be held hostage by server/ISP/Internets response.  If I understand correctly a rendered screen would be downloaded every 40ms or so which would require much greater bandwidth.

Quote
I don't think it's a bad thing to have savegames on the client side. I'm not sure however how parts of the code that run from the server side, would actually help out performance.
It's preferred to keep save games on the client side.  The problem is that browsers will not allow JS to do file I/O on the client side.   So on a room change any room variables that need to be persisted will have to be sent to the server and stored in a session file.    If the player re-enters that room then the data will be sent back to the client.  If the player does a save game then the server will write the session data to a file and the client will perform a download operation.


Quote
On a room change it's like okay to load the individual room script. It should be noted that module scripts and global script should run on the client side, otherwise it would seriously mean a waste in performance.
Right, that's what I intended to say in the first post.  Sorry if it was confusing.

Quote
Also, I'm not very familiar, so I'm actually wondering on two other things: D3D capabilities and performance with the equivalent Drawing Surface and Dynamic Sprite functions on JS and HTML 5.
I believe the HTML canvas element is 2D only.   I don't think there is anything in HTML or the Canvas element that gives access to lower level drivers or optimizations.   So I guess it would be up to the specific browser to take advantage of things like D3D.  I don't know any more than you and am mostly guessing.
#509
I have been researching current web technologies such as java script, ruby/rails, python, ajax, html5, etc for an upcoming project (day job).  It has occurred to me that capabilities such as html5's canvas, java script's interval timer and asynchronous request, and a little help from the server via  PHP, Python, Ruby or C that it ought to be possible to implement some sort of runtime game engine that could run in a browser.

As a mater of intellectual curiosity I would be interested in discussing this possibility and it's pro's and con's with those of you who are more familiar with the specific tech involved.  We can use AGS as a common basis for the discussion since we are all very familiar with it and it's capabilities.   

Let's limit ourselves to the technical issues.  This far removed from being a practical suggestion for AGS and talking about practical, logistical, political, and other aspects would be uninteresting and counter-productive at this point.



I have a superficial knowledge and a naive point of view at best but here is what I think I know about all this:

HTML5
  • HTML5 has a canvas element that allows one to draw and do other sorts of graphical manipulations.  It supports bit map and SVG images.  I don't know the full extent of it's capabilities or how they would compare with what Allegro offers.

  • HTML elements (especially <div> and <span>) can have background images and can be dynamically moved around, animated and generate events in response to user interaction.

    Java Script
  • JS can be used  to perform graphical operations such as moving and animating sprites on the HTML5 canvas element.

  • JS has an interval timer that can be used trigger a game scan event.

  • JS can respond  to user clicks on various document elements by running event handler and event listener functions.

  • S can parse and extract info from specific elements in an XML/HTML document

  • JS can asynchronously request additional information from the server and then update the current browser window without reloading the entire thing.

    Basic Engine Design
  • Client Side - Nearly all of the engine would execute on the client side.  The server would only be needed to download the required JS and HTML/XML game files.  Perhaps it would also be needed to work around client side limitations (SAVE GAMZE come to mind).

  • Elements - For each game element  (i.e. characters, objects, hotspots, etc) there would be corresponding HTML elements so that events could be generated.

  • Game Scan - Items requiring periodic execution could be handled using the JS setInterval() functionality.  Event handlers are natively e

  • executed asynchronously so they it's not necessary to implement a polling scheme here to implement them.   If synchronism is required/desired it could be implemented by having the asynchronous event handlers sleep until the occurrence of a game scan.

  • Animation - Animation could be achieved using the above mentioned setInterval().  Animation frames and loops for a given entity could be stored in a single file.  An animation procedure would just display different portions of the file for each loop/frame.

  • Sounds & Video - I don't know much about this except that HTML5 now has native support for video.  I think the same element can also be used to play audio and that there are other legacy methods.

  • Built-in Functions - It's possible to create objects in JS so it ought to be possible to implement most AGS built-in functions in JS.   AGS uses managed objects so there may need to be a JS method of unloading unused objects to prevent memory leaks.

  • Game Script - JS has a very similar syntax and capabilities as AGS script with a few differences that would appear to be easily translatable from one language to another.   

  • Main Game Files - The main game files would consist of an XML/HTML file that would provide a basic DOM structure for the game and contain links to the required java script libraries and global game items such as character and inventory item graphics, sounds, etc, etc.   It would also contain a link to a java script equivalent to AGS's global script.

  • Room Game Files - The room files could be an XML/HTML file that contains room specific definitions and links to a java script equivalent to AGS's room script and links to room specific items such as object, background, and other graphics, sounds, etc.  The room XML file would be loaded by asynchronous request (AJAX) and then used to update the current browser screen.

  • Game Data - JS uses loosely typed variables which seem like they are capable of supporting all of AGS's data types.  The problem is that JS running in a browser does not have file I/O capability.  It would seem like the server would need to create a session for the player and keep track of persistent room data so that if a player interacted with a room, left and then returned the room would be in the same state as when the player left.  In this case SAVE GAME could be implemented as a download/upload of the session file.   This file could be in the form of a JS script file so restore game could just be a load and execute of the save game file?   The down side of course is that the server has to consume some CPU resources executing code; the upside is that people will need to access the website if they want to play. 

  • Performance - Obviously if someone has a 386 desktop and a dial-up modem they wouldn't be pleased with the performance of such a game engine.  However with broadband and Multi-Ghz/GB machines it's not clear if performance would be an issue or not.   I suppose it would be highly dependent on the actual implementation of the JS components.  I would be surprised if loading of the game and graphical files were a problem in this respect.  My gut feel is that JS execution may be a problem.



    That's all I can think of right now.  I'd be interested in what other people think about this.  What are the potential problems and their potential solutions?  What other better ways are there of implementing such an engine?  If it were possible how useful or widely used would it be?    AZny other related ideas? 

    Let's just have an interesting conversation about teh tech .... ;)
#510
Make your own GUIs.  Use a background image to make the bubble and labels to display the text.  have fun scripting.
#511
Lookup inventory inthe manual and you will find ...
Quote from: TFM ;)
readonly static int Game.InventoryItemCount

Returns the number of inventory items in the game. This is the total number of items that you created in the Inventory Items pane of the editor, not how many the player is currently carrying.
Example:

Display("The game has %d inventory items.", Game.InventoryItemCount);

So then you would have ...

Code: ags


// Then, when the character goes to grab the money, make a simple code such as:

{
     cEgo.Say("I found some money in the couch!");
    iMoney.InventoryItemCount = iMoney.InventoryItemCount + 10;
}

// Then, with your inventory item, when the character looks at it, have 
// it display the variable with something like:

{
     Display ("My wallet holding  %d dollars.", iMoney.InventoryItemCount);
}
#512
It's a pretty cool Scalable Vector Graphics editor but still in a development stage , it seems to me.      There is a demo that runs in the browser, YouTube tutorials and downloadable version.

http://code.google.com/p/svg-edit/
#513
General Discussion / Re: Free Wife on CL
Thu 04/03/2010 04:47:25
Quote
As long as it doesn't involve physical violence ...
Just for the record, the ad didn't have any personally identifying information such as phone number, address, etc.   I suppose they took it down for fear of a hitman emailing the dude to offer his services ;).
#514
General Discussion / Re: Free Wife on CL
Wed 03/03/2010 17:46:21
How about that, they deleted it.   I should have clipped the text out and quoted it here... to para phrase it went something like ...

" .... Free cheating whore bitch, just come haul her away ...  I just want her gone..." - Location: (Whoresville  )

#515
General Discussion / Free Wife on CL
Wed 03/03/2010 17:01:36
http://spokane.craigslist.org/zip/

Hehe, I just saw this on Craig's list and I thought I would share.  And NO! this isn't my ad.  Just enjoy.   
#516
Everything you describe sounds perfectly reasonable and not all that difficult. 

You will be doing most of the scripting in the room's repeatedly execute function and so it can get disorganised rather quickly.  You may find it helpful to make calls to custom functions from there. 
Here is a little framework to get you started.

Code: ags

//=====================================
//  Constant Definitions
//=====================================
#define WALKABLEAREA_EXIT  5

//=====================================
   function BulletHitObject(int id) {
//
// This function returns the id of any object the bullet 
// collides with.  If it does not collide with any object
// it returns a  -1
======================================
}

//=====================================
   function BulletHitCharacter(int id) {
//
// This function returns the id of any character the bullet 
// collides with.  If it does not collide with any character
// it returns a  -1
======================================
}

//=====================================
   int ExitCount = 0;
   import function ExitIsActive(int count=-1);
   function ExitIsActive(int count) {
//
// This function decrements the ExitCount by one each 
// one game cycle until it reaches a value of zero.  The
// count parameter is optional.  ExitCount is set to 
// the value of the optional count parameter if it is specified.
//=====================================
   bool status;

   if (count>=0) {
      ExitCount = count;
      status = true;
   }
   else if (ExitCount>0)  
      ExitCount--;
      status = true;
   }
   else {
      status = false;
   }
   return status;
}


//=====================================
   function room_RepExec() {
//=====================================
   int i, oid, cid;

   // Detect bullet collisions
   i = 0;
   while (i<3) {
      // Get collision
      oid = BulletHitObject(i);
      cid = BulletHitObject(i);
 
      // Respond to collision wilth object 
      if (oid>=0) {
         // Object collission,   do something (i.e. call function)
      }      RemoveWalkableArea(WALKABLEAREA_EXIT); 
   }

      // Respond to collision wilth character 
      else if (cid>=0) {
         // Character collission,   do something (i.e. call function)
      }
      // Respond to no collision 
      else  {
         // No collission,   do something (i.e. call function)
      }
      i++;
   }

   // Activate Exit
   if (ExitIsActive()) {
      RestoreWalkableArea(WALKABLEAREA_EXIT); 
   }
   else {      
      RemoveWalkableArea(WALKABLEAREA_EXIT); 
   } 
}


Another thing to keep in mind is that collisions are detected at the base of objects and characters.   So to make things look right you may wont to fiddle with the z position of the bullets.  This will displace the sprite a pixel distance from the ground, however, it''s base, for the purpose of colision detection, will be the same.

For the hotspot you probably want to use  a region and a walkable area.  In the example above I remove the walkable area if the player is not allowed to exit.  If you want the PC to be able to walk in this area even if he can't exit then you will need to set a variable and then test it's value in the region's interaction (event handler ) function to allow/disallow the exit function.

You probably want to use characters and objects for everything else.

This ought to give you a start anyway.
#517
Quote
Added in new script ...
What is new script, module or room?

Module scripts can't import functions from the global script, room scripts can as JNoe Carl explains. 
#518
General Discussion / Re: AGS group projects
Fri 26/02/2010 23:08:03
Quote
Tell me your secret!
1.  You need a committed group of people on the team
2.  Dedicated , full time leader

Most people that say they are committed to a project aren't.   The ones that are
need to be constantly pumped with enthusiasm lest they lose interest and drift away.
The amount of effort required to complete a game project is greatly underestimated
by most people.  It's really naive to believe that you can come here with a game idea
that people throw themselves at a chance to produce graphics, music, etc for it.
#519
The on_key_press() event handler won't be activated if there is an active  text box so you will have to use repeatedly execute instead.

I just had an interesting thought though ... why not use a button instead of a text box?  You could use the on_key_press() event to accept user data and send it to which ever "input" had focus.  

Oh yeah! it would be possible to have multiple "input" buttons so that the one with focus would get the user input.  An "input" button would receive focus by clicking on it or pressing the TAB key.  Of course there could be just one "input" button that had focus all the time just like the current text box.

[edit]
Sparky,   Just noticed the [SUGGESTION] flag in the title, thought you were asking for help.  Anyway you did inspire the above idea for which I thank you.     
#520
General Discussion / Re: AGS group projects
Fri 26/02/2010 03:15:14
Quote
Sorry. As I see it, an AGS group prject would be someone coming up with an idea for a game (like me), and placing that idea on the forums.
Ideas are like elbows and ass holes; everybody has a couple - some more than others

Quote
Other people would start making music and sprites.  After that's all done, the team would wither have a really good programmer, well, program, or do it themselves.
Hehe ...  You may have better luck using AGS's "Make My Game" function.


SMF spam blocked by CleanTalk