dnd 5e – Is Lost Mines of Phandelver’s Young Green Dragon too much for a group of level 3 characters?

First, the numbers

A group of 8 3rd-level adventurers have a budgeted XP threshold of 600, 1200, 1800, and 3200 for an Easy, Medium, Hard, and Deadly encounter.

A Young Green Dragon has an EXP value of 3900, which is Deadly. But! remember, you have to account for having more than the recommended player count of 4-6. The DMG goes off to say:

Party Size

… If the party contains six or more characters, use the next lowest multiplier on the table. Use a multiplier of 0.5 for a single monster.

Therefore, for a group of 3 to 6 adventurers, the Young Green Dragon would be, theoretically, Deadly. But for a group of 8, it is only Hard. Like you, I have DMed LMoP for a group with more than the recommended players. I had 9 players fighting the Dragon at the time, and it was brutal (two of them fell unconscious, and their Donkey died- poor Will Smith) but they pulled it off.


Second, the numbers lie

Much of how difficult the fight turns out is how it starts and how the circumstances mount against or for the players.

If your players simply run in, guns blazing, it will more likely lead to a TPK, which, depending on your preference may or may not be a desirable outcome. If your players are smart about it, they can easily employ tactics that will turn the battle toward a favorable resolution. Or, they can find out more about the dragon and its strengths and weaknesses in order to be more prepared.

This is a broad discussion and I won’t delve into it in fear of getting too opinionated.


Thirdly, know your characters

Looking at your party, they all look pretty high-tier: moon druids, fighters, barbarians, and rogues are really strong at this level so you shouldn’t worry too much. Now, if the group were mainly composed of diplomat monks and courtly wizards who specialize in non-combat areas of the game, you’re going to have a problem.


Lastly, don’t forget this relevant text:

Warning! Spoilers! If you plan on playing LMoP, do not look

From page 33 of the module, it says:

Venomfang does not want to give up such a promising lair, but if the characters reduce the dragon to half its hit points, it climbs to the top of the tower and flies off to fight another day.

So your players are really only fighting half of the Dragon. Good luck!

How can a GM subtly guide characters into making campaign-specific character choices?

Note: the example I’m giving is D&D focussed, but the question is system-agnostic.

We’re in the early days of a new D&D group. If it keeps running, I’m planning to transition the players into Storm King’s Thunder once they reach 5th level. Storm King’s Thunder is an adventure that features a lot of giants.

I allowed the party to defer some character creation choices so we could get playing faster, and one of them has an unused language slot. The party also has a Ranger and the revised version of the class can, at higher levels, choose an epic foe against whom they get combat bonuses.

It would be very sensible if that unused language could turn out to be giantish and that the ranger could take giants as their epic foe. It would also be nice if I didn’t have to lay out to the players that there are giants in store later – they’re all new, and they won’t guess.

Are there any good story-driven ways that a GM can help "guide" players toward making character creation choices that fit the planned campaign?

regex – Regexp: Match multiple words with spaces and special characters

I want to match several words, that can be split with spaces as well as special characters like - or $ (where all possible characters are not known).

Example text:

Test- a£nd Test auf den 01.01.2022

My current expression:

((w )+) auf den d*.d*.d*

But this only matches nd Test auf den 01.01.2022.

How can I change the left part of the expression to match any number of words, that can also contain characters like - or $ above? It’s not feasible to enumerate all possible characters, e.g. I can’t use ((w- £ )+) auf den d*.d*.d* which would match everything in this case.

Regex link

c# – line seperate algorithm from 30 characters to 40 characters

Hi all I want to convert 30 char rows to 40 char rows.
each character is different. I just wrote 111-222 to make it clear.

111111111111111111111111111111
222222222222222222222222222222
333333333333333333333333333333
444444444444444444444444444444
555555555555555555555555555555
666666666666666666666666666666
777777777777777777777777777777



1111111111111111111111111111112222222222
2222222222222222222233333333333333333333
3333333333444444444444444444444444444444
5555555555555555555555555555556666666666
6666666666666666666677777777777777777777
7777777777

is there anyway to make it fast . It doesnt work like that.

using (var sw = new StreamWriter(@"C:Usersxxx.txt"))
            {
                bool x = true;
                var sayac = 0;
                var lines = File.ReadAllLines(@"C:Usersaa.txt", Encoding.UTF8);
                for (var i = 0; i < lines.Length; i++)
                {

                    Console.WriteLine(i);
                    var line = lines(i);
                   
                    sw.Write(line);

                    if (line.Length>=40)
                    {
                        sw.Write(Environment.NewLine);
                    }
                   


                }
            }

urls – Can non-latin characters appear in slugs?

For a non-latin category name such as “我的种类”, the slug generated is “%e6%88%91%e7%9a%84%e7%a7%8d%e7%b1%bb”. What function does WordPress use to generate this slug? Can I directly use “我的种类” as the slug? I tried to change the slug from “%e6%88%91%e7%9a%84%e7%a7%8d%e7%b1%bb” to “我的种类” in wordpress database, but when I visited http://example.com/category/我的种类/, it showed “Page not found”. If I did not do the change, I could visit the category page without a problem by typing http://example.com/category/%e6%88%91%e7%9a%84%e7%a7%8d%e7%b1%bb/ or http://example.com/category/我的种类/ in the address bar of my browser. In fact, if I type http://example.com/category/%e6%88%91%e7%9a%84%e7%a7%8d%e7%b1%bb/, it is automatically changed to http://example.com/category/我的种类/ in the address bar,why? And, are non-latin characters not allowed in a url?

dnd 5e – What features in 5e are directly tied to the character’s Constitution score?

Barbarian’s Unarmored Defense partially rely on CON, calculating AC with 10 + DEX + CON

Fire Genasi has spellcasting that relies on CON, being able to cast Burning Hands and Produce Flame using the character’s CON modifier

Stone Sorcerer can calculate their AC purely off of their CON modifier, calculating with 13 + CON

This is a Community Wiki post, feel free to add your own features that you’ve found.

Approximate time for John the Ripper to find all possible ASCII characters

Approximate time for John the Ripper to find all possible ASCII characters.
Standard length, capital and lower case letter, numbers.

exploit – PHP execution with special characters in the end

I was trying to reproduce this vulnerability:
https://www.exploit-db.com/exploits/49294

According to the explanation, it is possible to bypass a check in a WordPress plugin by appending a special char after php extension.

I was trying the attack, and the file is uploaded with the name shell.php<special_char> containing a simple php code <?php echo "poc"; ?>.

Then I should navigate the shell in <target>/..../shell.php<special_char> and the source code should be executed.

But how can I exploit this? PHP interpreter observes that the extension is different from php (it is php+special_char), so it does not execute the code, it just prints the source text.

In which cases is it possible to exploit a vulnerability that allows uploading files with php extension containing a special character in the end?

c – Game with linked lists, tail insertion and moving characters through rooms

i’m making a game like among us in C and i am stuck with the linked lists. So this function called forward_tail_insertion() aim to make the characters move in 3 different direction. If the direction *pointers(forward, left or right) is NULL the code create a new room using the malloc and add it to the list(in the program room_list) and it need to link the new room created with the previous one using the *previous_room pointer. If during the next turn another player what to go forward and there is the room already created by the previous player, he don’t need to create another one but just change the position of the player to the room. I link here two files, the .h containing all the struct and enum definition and the function that i’m trying to do. Thank you to everyone who want to try to solve my problem. The main problem is that the others players doesn’t see the rooms create by the previous players so the code create another different room.

.h file

//libraries used in the project
      #include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <string.h>
#include <stdbool.h>
#include <math.h>
//definition used to clean the terminal
#define clr system("clear")
//enumeration type to specify the role/state of the players
typedef enum{
  astronaut = 1,
  impostor = 2,
  murdered = 3,
  defenestrated = 4
}Player_State;
//enumeration type to identify all the players with colors
typedef enum{
  red = 1,
  blue = 2,
  orange = 3,
  yellow = 4,
  purple = 5,
  green = 6,
  black = 7,
  white = 8,
  grey = 9,
  brown = 10
}Player_Name;
//enumeration type to specify the type of room or the things the players can find inside
typedef enum{
  empty = 1,
  simple_quest = 2,
  complex_quest = 3,
  trap_door = 4
}Room_Type;
//struct definition which represent all the rooms generated while playing
typedef struct{
  struct Room* forward;
  struct Room* left;
  struct Room* right;
  struct Room* previous;
  Room_Type Room_Type;
  bool emergency_call;
}Room;
//struct definition for all the players
typedef struct{
  Room* actual_position;
  Player_State Player_State;
  Player_Name Player_Name;
}Player;
//functions declaration of the gamelib.c
void set_game();
void play();
void end_game();

.C file

//pointers initialization to null and start_room type 'empty'


start_room = (Room *) malloc(sizeof(Room));

  //set the position of all players to the first room which is empty
  for(int i = 0; i < players_number; i++){
    players(i).actual_position = start_room;
    //printf("All rooms: %sn", print_room_type(room_list(i).Room_Type));
  }

  start_room -> forward = NULL;
  start_room -> right = NULL;
  start_room -> left = NULL;
  start_room -> previous = NULL;
  start_room -> Room_Type = 1;

  int loop_check1 = 1;
  int choice_menu = 0;

  do{
    //sleep(2);
    printf("nSettings completed.n");
    //sleep(2);
    printf("                                             What now?n");
    printf("n                                        1) Print the playersn");
    printf("                                        2) Start a gamen");
    sleep(2);
    printf("Choice: ");
    scanf("%d", &choice_menu);

    switch(choice_menu){
      case 1:
        loop_check1 = 0;
        print_players();
        break;
      case 2:
        loop_check1 = 1;
        start_game();
        break;
      default:
        printf("nWrong command. Retry...n");
        break;
    }
    while(getchar() != 'n');
  }while(loop_check1);
}

void play(){
  clr;
  sleep(2);
  printf("                                     GAMEn");
  printf("Number of astronauts: %dn", players_number);
  printf("Number of impostors: %dn", impostors_number);
  printf("Quest to complete in order to win: %dn", quest_to_finish);
  printf("First room: %sn", print_room_type(start_room -> Room_Type));
  //sleep(5);

  int action_choice = 0;
  int room_l = 0;

  do{
    //randomize the turn
    turn_temp = (rand() % players_number);
    impostor_check = turn_temp + 1;
    printf("nTurn of the %s playern",print_color_players(players(turn_temp).Player_Name));
    sleep(2);

    //check if the player is murdered or defenestrated
    if(players(turn_temp).Player_State == 3){
      printf("nThe %s astronaut has been killedn",print_color_players(players(turn_temp).Player_Name));
    }else if(players(turn_temp).Player_State == 4){
      printf("nThe %s %s has been defenestratedn",print_color_players(players(turn_temp).Player_Name),print_state_players(players(turn_temp).Player_State));
    }else{
      //if the randomized number is equal to one of the impostor so it's his turn
      if(impostor_check == impostors1 || impostor_check == impostors2 || impostor_check == impostors3){
        printf("nImpostor's Turnn");

        printf("nYour position: %pn",players(turn_temp).actual_position);
        printf("Type Room: %sn",print_room_type(players(turn_temp).actual_position -> Room_Type));

        //check if there are others players in the same room
        printf("nPlayer's in the room: ");
        for(int i = 0; i < players_number; i++){
          if(players(turn_temp).actual_position == players(i).actual_position && players(turn_temp).Player_Name != players(i).Player_Name){
            printf("%s ",print_color_players(players(i).Player_Name));
          }
        }
        printf("n");

        do{
          printf("n1) Progressn");
          printf("2) Emergency Calln");
          printf("3) Kill Astronautn");
          printf("4) Use Trap Doorn");
          printf("5) Sabotagen");
          printf("nChoice: ");
          scanf("%d",&action_choice);
          if(action_choice < 1 || action_choice > 5){
            printf("Wrong Value. Retry...n");
          }else if(action_choice == 1){
            progress();
          }else if(action_choice == 2){
            emergency_call_f();
          }else if(action_choice == 3){
            kill_astronaut();
          }else if(action_choice == 4){
            use_trap_door();
          }else{
            sabotage();
          }
        }while((action_choice < 1 || action_choice > 5) && sabotage_check == 0);
      }else{
        printf("nAstronaut's Turnn");

        printf("nYour position: %pn",players(turn_temp).actual_position);
        printf("Type Room: %sn",print_room_type(players(turn_temp).actual_position -> Room_Type));

        printf("nPlayer's in the room:");
        for(int i = 0; i < players_number; i++){
          if((players(turn_temp).actual_position == players(i).actual_position) && players(turn_temp).Player_Name != players(i).Player_Name){
            printf("%s ",print_color_players(players(i).Player_Name));
          }
        }

        printf("n");

        do{
          printf("n1) Progressn");
          printf("2) Do questn");
          printf("3) Emergency Calln");
          printf("nChoice: ");
          scanf("%d",&action_choice);
          if(action_choice < 1 || action_choice > 3){
            printf("Wrong Value. Retry...n");
          }else if(action_choice == 1){
            progress();
          }else if(action_choice == 2){
            do_quest();
          }else{
            emergency_call_f();
          }
        }while((action_choice != 1 && action_choice != 2 && action_choice != 3) && quest_check == 0);
      }
    }
  }while(game_in_progress);
}

void end_game(){

}

static void progress(){
  int choice = 0;
  do{
    printf("nPossible choicesn");
    printf("n1) Forwardn");
    printf("2) Leftn");
    printf("3) Rightn");
    printf("4) No Moven");
    printf("n Choice: ");
    scanf("%d", &choice);
    if(choice < 1 || choice > 4){
      printf("nWrong value. Retry..n");
    }
  }while(choice < 1 || choice > 4);

  if(choice == 1){
    room_forward_tail_insertion();
  }

}

static void do_quest(){
  if(players(turn_temp).actual_position -> Room_Type == 2){
    printf("nSimple quest completedn");
    quest_counter += 1;
    quest_check = 1;
  }else if(players(turn_temp).actual_position -> Room_Type == 3){
    printf("nComplex quest completedn");
    quest_counter += 2;
    quest_check = 1;
  }else{
    printf("nThe room doesn't have questn");
    quest_check = 0;
  }
  if(quest_to_finish == quest_counter){
    printf("nAstronauts completed all the quests, so they won the game!n");
    quest_check = 1;
  }
}

static void emergency_call_f(){

}

static void kill_astronaut(){

}

static void use_trap_door(){

}

static void sabotage(){
  if(players(turn_temp).actual_position -> Room_Type == 2){
    printf("nSimple quest sabotagedn");
    players(turn_temp).actual_position -> Room_Type = 1;
    sabotage_check = 1;
  }else if(players(turn_temp).actual_position -> Room_Type == 3){
    printf("nComplex quest sabotagedn");
    players(turn_temp).actual_position -> Room_Type = 1;
    sabotage_check = 1;
  }else{
    printf("nThe room doesn't have questn");
    sabotage_check = 0;
  }
}

static void start_game(){
  play();
}

static void room_forward_tail_insertion(){
  //new -> previous = 'previous room';
  if(room_list==NULL){
    room_list=start_room;
  }
  if(players(turn_temp).actual_position -> forward == NULL){
    Room* new = (Room*) malloc(sizeof(Room));
    new -> forward = NULL;
    new -> left = NULL;
    new -> right = NULL;
    new -> Room_Type = random_room_type();
    room_list = new;
    room_list -> forward = new;
    players(turn_temp).actual_position = new;
  }else{
    players(turn_temp).actual_position = room_list -> forward;
  }
}

algorithms – Dynamic programming substring problem with 4 characters

You start with a string made up of 4 characters: A, B, C, and D. The string can be at most 10^5 characters long.

You edit the string in this manner:

  1. Split the string between two consecutive characters that are the same.
  2. Reverse the partitioned strings.
  3. Concatenate the strings back together at where you split them up.

For example, if you started with the string ABBCDDD, you would end up with:

ABBCDDD -> AB | BCD | D | D -> BA | DCB | D | D -> BADCBDD

With the final string, there may be some characters that are unknown, marked with Xs.

Given the final string (after editing), with the unknown characters, determine the number of possible strings you could have started with.

Example:

Final string: BADXBDD

Solution: 3

There are three possible starting strings:

ABBCDDD -> AB | BCD | D | D -> BA | DCB | D | D -> BADCBDD

ABBADDD -> AB | BAD | D | D -> BA | DAB | D | D -> BADABDD

DABBDDD -> DAB | BD | D | D -> BAD | DB | D | D -> BADDBDD

What I have come up with:

First, note that there is no limit to the characters that are unknown. So you cannot try to determine the original string with every possible final string, as the number of final strings you are considering could quickly increase.

I have made the observation that when splitting up the final string, that with two consecutive segments, the first letter of the first segment must match the last letter of the second segment. This could be used to determine a solution.

Dynamic programming could be helpful in how determining the number of possible strings for the first sections of the string. By determining the number of ways you can partition one substring, it would help you determine the number of ways you could partition the others.

How can I solve this problem?